background image

Rozdział 4 

Konwencje 

Niezwykle istotnym czynnikiem, ułatwiającym tworzenie aplikacji klient-serwer, 
jest konsekwentne stosowanie standardowych konwencji nazewnictwa i metod 
zapisu programu. Problematyka ta wydaje się na tyle istotna, że jej omówienie 
poprzedzi właściwe informacje na temat budowania aplikacji. 

Niniejszy rozdział zawiera szereg uwag na temat nazewnictwa elementów aplikacji 
klient-serwer, napisanych w Delphi. Uwagi te odnosić się  będą do elementów 
aplikacji klienta i serwera, które omawiane będą oddzielnie. 

Zawartość tego rozdziału należy traktować wyłącznie jako zbiór sugestii. 
Czytelnicy powinni wybrać takie metody nazewnictwa i zapisu programu, jakie im 
najbardziej odpowiadają. Znacznie istotniejsze od wyboru konkretnej konwencji 
jest jej konsekwentne stosowanie. 

Elementy programu w języku Object Pascal 

Dyskusję na temat nazewnictwa rozpoczniemy od elementów programu w Delphi. 
Do elementów tych zaliczyć można komponenty, formularze, moduły danych, 
moduły kodu (units), zmienne, stałe, itd. Innymi słowy, za elementy programu 
w Delphi uznajemy wszystkie te elementy, które nie są wprost związane 
z serwerem bazy danych. Do elementów związanych z serwerem bazy danych 
zaliczamy m.in. tabele, indeksy, widoki, wyzwalacze, procedury osadzone, reguły, 
wartości domyślne, itd.  

UWAGA: 

Z uwagi na różnorodność wykorzystywanych obecnie środowisk sieciowych, 
należy w miarę możliwości unikać stosowania długich nazw plików, dozwolonych 

Windows 95/NT. Wprawdzie Delphi doskonale radzi sobie z 

nazwami 

dłuższymi niż 8 znaków, jednak często zdarza się,  że aplikacja musi 
współpracować z sieciowym systemem operacyjnym lub działać na komputerze, na 
którym nazwy takie nie są dozwolone. Jest to szczególnie prawdopodobne 
w przypadku aplikacji typu klient-serwer, które często korzystają z serwerów 
rezydujących na innym komputerze. 

background image

88 

Część I 

Można się spodziewać,  że w niedalekiej przyszłości większość serwerów i sieci 
będzie dopuszczać stosowanie długich nazw plików. Obecnie jednak wciąż jeszcze 
wskazana jest powściągliwość w korzystaniu z tego udogodnienia. 

Katalogi 

Omówienie rozpoczniemy od katalogów, gdyż ich struktura bywa często równie 
ważna, jak sama zawartość. Wszystkie dane, niezależnie od ich typu, dobrze jest 
przechowywać na dysku w jednym, wspólnym katalogu, o nazwie DATA (DANE). 
Umożliwia to wykonanie kopii bezpieczeństwa wszystkich danych poprzez proste 
skopiowanie zawartości katalogu DATA i jego podkatalogów. 

W obrębie katalogu DATA utworzyć można podkatalogi, odpowiadające 
poszczególnym aplikacjom - jeden podkatalog dla programu Word Perfect for 
Windows, drugi dla Delphi, trzeci dla Quattro Pro for Windows, itd. Ułatwi to 
odszukanie pliku utworzonego przy użyciu określonej aplikacji. Taki sposób 
postępowania odbiega od modnego ostatnio systemu pracy „zorientowanej na 
przetwarzanie dokumentu, a nie uruchamianie aplikacji”, jest jednak dobrze 
sprawdzony w praktyce.  

W ramach podkatalogu każdej aplikacji umieścić można podkatalogi 
odpowiadające poszczególnym projektom. Na przykład, projekt RentalMan 
(„zarządzanie wynajmem”), opracowywany w części „Tutorial” niniejszej książki, 
mógłby rezydować w 

katalogu C:\DATA\DELPHI3\RENTMAN. W 

praktyce 

bardzo rzadko stosuje się rozszerzenia nazw katalogów. Katalogi powinny mieć 
nazwy łatwe do rozpoznania i zapamiętania - takie, które równie dobrze mogłyby 
identyfikować segregatory stojące na półce. W istocie, katalogi „udają” przecież 
segregatory z 

dokumentami. Z 

powyższych zasad wynika, że jeśli projekt 

opracowywany jest przy pomocy kilku programów, to należy utworzyć podkatalog 
projektu, o identycznej nazwie, w podkatalogu każdej z aplikacji. Oczywiście - jak 
już wspomniano - powyższe reguły należy traktować wyłącznie jako sugestię 
autora, opartą na jego własnych doświadczeniach. 

UWAGA: 

Windows 95 automatycznie zakłada katalog o 

nazwie Moje Dokumenty, 

analogiczny do wspomnianego katalogu DATA. W Windows 95 podkatalogi 
przyjęto nazywać folderami. Foldery tworzy się m.in. w programie Eksplorator. 

background image

 Konwencje 

 

89

 

Nazwy projektów 

Nazwy projektów powinny być rozpoznawalne i logiczne, a jednocześnie zgodne 
z konwencją nazewnictwa plików „8+3”. Nie należy zmieniać standardowego 
rozszerzenia, nadawanego przez Delphi plikom projektów. W rezultacie długość 
nazwy projektu zostaje ograniczona do zaledwie ośmiu znaków. Nazwa taka 
powinna być identyczna z nazwą katalogu, w którym przechowywany jest projekt. 
Dzięki temu możliwe będzie  łatwe ustalenie, skąd pochodzi plik, przeniesiony 
tymczasowo w inne miejsce albo skopiowany na dysk kolegi. 

Nazwy plików 

Plikom dobrze jest nadawać nazwy czytelne, logiczne i 

„rozszerzalne”. 

„Rozszerzalność” można osiągnąć przeznaczając jedną lub dwie ostatnie cyfry 
nazwy na numer kolejny wersji. Dzięki takiej numeracji możliwe jest 
przechowywanie kilku wersji pliku, z 

zachowaniem jego głównej nazwy. 

Przykładowo na dysku autora plik, zawierający niniejszy rozdział, nosi nazwę 
CSD0400. Kolejne, zmodyfikowane nazwy pliku zapisywane są pod nazwami 
CSD0401, CSD0402, itd. Sposób ten umożliwia szybkie rozpoznanie ostatniej 
wersji pliku, bez odczytywania daty i godziny jego utworzenia. Ponadto bardzo 
łatwo można przenieść, skopiować lub spakować wszystkie wersje pliku, 
korzystając z wieloznacznej nazwy plików (zawierającej tzw. wildcards, np. 
„CSD04??”). Opisany powyżej sposób nazywania plików przyrównać można do 
prymitywnego systemu zarządzania tekstem źródłowym programów. Mimo swojej 
prostoty system działa. 

Inną praktyczną zasadą jest dodawanie na początku nazwy pliku przynajmniej 
jednej litery, identyfikującej projekt, którego plik dotyczy. Pliki należące do 
danego projektu wyglądają wówczas podobnie i łatwiej jest nimi zarządzać. 
Wszystkie pliki należące na przykład do „systemu zarządzania wynajmem 
i konserwacją” (Rental Maintanance Management System), budowanego w części 
„Tutorial” niniejszej książki, noszą nazwy rozpoczynające się literą R. 

Po literze, identyfikującej projekt, można wpisać od trzech do sześciu znaków 
opisujących  ogólne przeznaczenie pliku. Jeżeli plik nie ma poza tym żadnego 
szczególnego przeznaczenia, to można je scharakteryzować przy pomocy 
wszystkich sześciu znaków, pozostających do dyspozycji przed numerem kolejnym 
wersji. Jeśli można wyróżnić jakieś szczególne przeznaczenie pliku, to trzy litery 
należy poświęcić na symbol ogólnego zastosowania pliku, a trzy kolejne na opis 
szczegółowego przeznaczenia. W systemie zarządzania wynajmem i konserwacją 
(Rental Maintenance Management) występuje na przykład plik, który zawiera 
fragment programu odpowiedzialny za obsługę okna dialogowego do edycji tabeli 

CALLS

 (zgłoszenia telefoniczne). Plik ten nosi nazwę 

RCALEDT0

 - od „Rental 

maintenance management system”, okno dialogowe 

Call Edit

.  

background image

90 

Część I 

Nazwy modułów 

Podobnie jak nazwy plików, tak i nazwy modułów (units) mogą być dowolnie 
długie, przy czym kompilator rozróżnia nazwy wyłącznie na podstawie pierwszych 
63 znaków. Jak już wspomniano, należy unikać nadawania nazw dłuższych niż 
ośmioznakowe. Na podstawie nazwy modułu Delphi tworzy odpowiednią nazwę 
dla pliku PAS, dlatego nadanie modułowi nazwy dłuższej niż  ośmioznakowa 
spowoduje utworzenie pliku o równie długiej nazwie. 

Nazwy komponentów 

Ponieważ nie występuje bezpośrednia relacja między nazwami plików a nazwami 
komponentów, te ostatnie powinny być jak najbardziej opisowe - z zastrzeżeniem, 
że zbyt długą nazwę  będzie trudno wpisywać z klawiatury. Nazwy powinny być 
łatwe do wymówienia i dobrane logicznie. Należy także zalecić stosowanie 
w nazwach komponentów zarówno dużych, jak i małych liter. W nazwach 
komponentów nie można używać spacji, dlatego najlepszym sposobem oddzielania 
słów w nazwie jest rozpoczynanie każdego z nich wielką literą. Wreszcie, zaleca 
się rozpoczynanie wszystkich nazw typów w języku Pascal (w tym definicji 
komponentów, które formalnie są klasami) dużą literą T. Konwencji tej używają 
powszechnie autorzy biblioteki Visual Component Library, dostarczanej 
w pakiecie  Delphi.  Dzięki niej definicje typów bardzo łatwo można wyróżnić 
w tekście programu. Na przykład, komponent array table z rozdziału 3, ułatwiający 
dostęp do tabel baz danych, nosi nazwę 

TArrayTable

. Litera 

T

 wskazuje, że 

jest to klasa, zdefiniowana w języku Object Pascal. Opisowa część identyfikatora - 

ArrayTable

 - charakteryzuje przeznaczenie komponentu. 

Nadając nazwy komponentom dostarczanym standardowo w pakiecie Delphi, 
dobrze jest używać dwu-, trzy- lub czteroliterowego symbolu, zapisywanego 
małymi literami i umieszczanego przed właściwą nazwą komponentu. Nazwy 
komponentów 

Memo

 mogą zatem rozpoczynać się od symbolu 

me

; nazwy 

kontrolek typu 

Edit

 rozpoczynałyby się w tej samej konwencji od liter 

ed

Pozostała część nazwy ma w 

takim wypadku charakter opisowy, np. 

edIdKlienta

edCustomer Name

 lub 

meKomentarz

. W tabeli 4.1 zebrano 

skrócone identyfikatory typów komponentów. Stanowią one oczywiście jedynie 
sugestię autora. Należy zwrócić uwagę,  że na liście występują także klasy Form 
(formularze) i Data Module (moduły danych) - ich nazwy również powinny 
mieścić się w przyjętej konwencji. 

Wszystkie komponenty, reprezentujące pola dialogowe, oznaczone są 
dwuliterowym skrótem, po którym następuje znak podkreślenia (_). Tak 
skonstruowane nazwy powinny wyróżniać się w tekście programu. Regułą jest 
także rozpoczynanie nazw wszystkich kontrolek, związanych z bazami danych, od 
litery 

d

. Po niej następuje skrót właściwy dla odpowiedniej standardowej kontrolki, 

background image

 Konwencje 

 

91

 

na przykład kontrolce 

Edit

 odpowiada kontrolka 

DBEdit

, powiązana z bazą danych. 

Kontrolki 

Edit

 oznacza się symbolem 

ed

, natomiast 

DBEdit

 - 

ded

Tabela 4.1 Komponenty Delphi i zalecane skróty 

Component - Komponent 

Abbreviation - Skrót 

Animate an 

AutoObject ao 

BitBtn bb 

BatchMove bm 

Bevel be 

BDEProvider bp 

BDEResolver br 

Button bt 

ColorDialog co_ 

Calendar ca 

ComboBox cb 

DdeClientConv cc 

ClientDataSet cd. 

DecisionCube cde 

DecisionSource cds 

DecisionGraph cgp 

DecisionGrid cgr 

DecisionPivot cpi 

DecisionQuery cqu 

ColorGrid cg 

Chart ch 

DdeClientItem ci 

CheckBox ck 

Coolbar co 

ClientSocket cs 

ChartFX cx 

background image

92 

Część I 

Component - Komponent 

Abbreviation - Skrót 

Database db 

DriveComboBox dc 

DBComboBox dcb 

DBCtrlGrid dcg 

DBChart dch 

DBCheckBox dck 

DBEdit ded 

DBGrid dgr 

DBImage dim 

DirectoryListBox dl 

DBListBox dlb 

DBLookupComboBox dlcb 

DBLookupCombo dlco 

DBLookupListBox dllb 

DBlooupList dlli 

DataModule dm 

DBMemo dme 

DBNavigator dna 

DirectoryOutline do 

DataSetTableProducer dp 

DrawGrid dr 

DBRadioGroup drg 

DataSource ds 

DateTimePicker dt 

DBText dte 

Edit ed 

F1Book f1 

FilterComboBox fc 

FindDialog fi_ 

FileListBox fl 

background image

 Konwencje 

 

93

 

Component - Komponent 

Abbreviation - Skrót 

Form fm 

FontDialog fo_ 

Gauge ga 

GroupBox gb 

Graph gr 

GraphicsServer gs 

HeaderControl hc 

HTTPDispatcher hd 

Header he 

HotKey hk 

HTMLPageProducer hp 

HTMLQueryTableProducer hq 

HTMLDataSetTableProducer ht 

IBEventAlerter ie 

ImageList il 

Image im 

Label la 

ListBox lb 

ListView lv 

MaskEdit md 

Memo me 

MainMenu mm 

MediaPlayer mp 

MemoryDataSet ms 

Notebook nb 

OpenDialog od_ 

OleContainer ol 

OpenPictureDialod op_ 

Outline ou 

Panel pa 

background image

94 

Część I 

Component - Komponent 

Abbreviation - Skrót 

PaintBox pb 

PageControl pc 

ProgressBar pr 

PrintDialog pr_ 

PageProducer pp 

PrinterSetupDialog ps_ 

PopupMenu pu 

QRBand qba 

QRChildBand qcb 

QRChart qch 

QRCompositeReport qcr 

QRDBCalc qdc 

QRDBImage qdi 

QRDetailLink qdl 

QRDBText qdt 

QREditor qed 

QRExpr qex 

QRGroup qgr 

QRImage qim 

QRLabel qla 

QRMemo qme 

QueryTableProducer qp 

QRPreview qpr 

QuickReport qr 

QRRichText qrt 

QRSysData qsd 

QRSubDetail qsd 

QRShape qsh 

Query qu 

RadioButton rb 

background image

 Konwencje 

 

95

 

Component - Komponent 

Abbreviation - Skrót 

RichEdit re 

ReplaceDialog re_ 

RadioGroup rg 

Report rp 

RemoteServer rs 

ScrollBar sa 

SaveDialog sa_ 

SpeedButton sb 

DdeServerConv sc 

SpinEdit sd 

Session se 

StringGrid sg 

DdeServerItem si 

Splitter sl 

StoredProc sp 

SavePictureDialog sp_ 

ServerSocket ss 

StatusBar st 

SpinButton su 

ScrollBox sx 

Table ta 

TrackBar tb 

TabControl tc 

Thread th 

Timer ti 

TabbedNotebook tn 

Toolbar to 

TabSet ts 

TreeView tv 

UpDown ud 

background image

96 

Część I 

Component - Komponent 

Abbreviation - Skrót 

UpdateSQL us 

VtChart vc 

VSSpell vs 

WebBrowser wb 

WebDispatcher wd 

WebSesion ws 

WSKAZÓWKA: 

Niektóre narzędzia typu CASE (komputerowo wspomagana inżynieria 
oprogramowania) pozwalają  użytkownikowi na zdefiniowane konwencji 
nazewnictwa, stosowanej dla obiektów automatycznie tworzonych przez program. 
Przykładem takiego narzędzia jest S-Designor (w najnowszej wersji program ten 
nosi nazwę PowerDesignor). W takim przypadku programowi typu CASE można 
nakazać stosowanie konwencji nazewnictwa, opisanych w niniejszym rozdziale. 

Nazwy typów 

Nazwy typów podlegają tym samym konwencjom, co nazwy komponentów. 
Wszystkie nazwy typów powinny rozpoczynać się dużą literą T. Pozostała część 
nazwy powinna mieć charakter opisowy, należy jednak unikać zbyt długich nazw, 
których wielokrotne wpisywanie z klawiatury byłoby uciążliwe. Korzystanie 
zarówno z dużych, jak i małych liter, ułatwia oddzielanie poszczególnych wyrazów 
w nazwie.  W nazwach  typów  należy przestrzegać tych samych konwencji, co 
w nazwach klas - klasy są przecież także typami. Oto przykładowa definicja typu: 

TRecordMouse = (rmAll, rmNone, rmClicksAndDrags); 

Nazwy stałych 

Autor przyjmuje i poleca zasadę pisania nazw stałych wyłącznie dużymi literami - 
podobną regułę przyjęto w zapisie nazw stałych (składników definiowanych po 
słowie 

#define

) w języku C. Pozwala ona odróżnić stałe, których wartości nie 

można zmienić, od zmiennych. Poniżej podano przykładową deklarację stałej, 
zaczerpniętą z 

tekstu źródłowego komponentu 

LiveQuery

, opisanego 

w rozdziale 27: 

DEFAULTCREATEVIEWSQL = ‘CREATE VIEW %s AS ‘; 

background image

 Konwencje 

 

97

 

Nazwy zmiennych 

W nazwach zmiennych używa się pełnych wyrazów, rozpoczynanych dużymi 
literami. Nazwy zmiennych powinny mieć charakter opisowy, a jednocześnie być 
na tyle krótkie, by dało się je bez trudu wielokrotnie wpisywać z klawiatury. Oto 
przykłady dobrze dobranych nazw zmiennych, pochodzących z tekstu źródłowego 
komponentu 

LiveQuery

TemporaryDB : TDatabase; 
WorkSQL: TStrings; 

Inna wypróbowana technika polega na dodawaniu na początku każdej nazwy 
pojedynczej litery, opisującej zasięg zmiennej: „l” dla zmiennej lokalnej, „g” - dla 
globalnej i „c” dla zmiennej związanej z klasą. Przyjęcie takiej konwencji ułatwia 
niekiedy określenie pochodzenia i 

zasięgu zmiennej, bez konieczności 

analizowania deklaracji funkcji, procedur i klas. 

Nazwy procedur i funkcji 

Nazwy procedur i funkcji należy konstruować zgodnie z zasadami obowiązującymi 
dla nazw zmiennych. Należy jedynie, w miarę możliwości, rozróżniać w nazwie 
funkcje wymagające podania argumentów od funkcji bezargumentowych. Poniższy 
wiersz programu może być mylący, gdyż na pierwszy rzut oka nie można 
zorientować się, czy 

SalesTax

 to zmienna, czy funkcja. 

x:=SalesTax; 

Problem ten można rozwiązać dodając przed nazwą funkcji bezargumentowych 
przedrostek 

Get

 („pobierz”). W praktyce okazuje się, że dobrze jest rozpoczynać 

nazwy  większości funkcji od przedrostka 

Get

. Istnieją oczywiście sytuacje, 

w których tak skonstruowane nazwy nie mają sensu, jak w przypadku jednej 
z wbudowanych funkcji Delphi noszącej nazwę 

FileOpen

. Dodawanie w tym 

przypadku przedrostka 

Get

 nie miałoby sensu.  

W tekście źródłowym biblioteki VCL przyjęto zasadę stosowania przedrostka 

Set

 

w nazwach procedur, które nadają nazwę atrybutowi, oraz przedrostka 

Get

 

w tych, które zwracają wartość atrybutu. Tę samą zasadę można zastosować 
w odniesieniu do procedur i funkcji nie związanych z atrybutami. 

Styl zapisu programu w języku Object Pascal 

Kolejnym obszarem, w którym standaryzacja przynosi wymierne korzyści, jest styl 
zapisu programu. Niemal każdy programista stosuje swój własny styl zapisu. 
Okazuje się jednak, że sam styl jest o wiele mniej istotny niż konsekwencja w jego 
stosowaniu. Konsekwencja taka zapewnia czytelność programu i ułatwia jego 

background image

98 

Część I 

konserwację. W najbliższych sekcjach omówimy sposoby zapisu konstrukcji 

If...else

, bloków 

begin...end

 oraz komentarzy.  

Konstrukcja If...else 

Jedną z reguł, stosowanych z powodzeniem przez autora, jest ujmowanie warunku 
w konstrukcji 

If...else

 w 

nawiasy. Postępowanie takie jest podwójnie 

uzasadnione. Po pierwsze - zapewnia lepszą czytelność programu. Po drugie - 
umożliwia dopisanie drugiego warunku bez konieczności wprowadzania 
jakichkolwiek zmian w pierwszym. Należy podkreślić, że - w przeciwieństwie do 
języka C - Pascal nie wymaga ujmowania wyrażeń warunkowych w nawiasy. 
Dlatego też poniższy zapis jest formalnie poprawny: 

If x=1 then y:=z; 

Jednak już dwa (lub więcej) wyrażenia warunkowe w pojedynczej instrukcji 

If

 

wymagają nawiasów: 

If (x=1) or (x*2=4) then y:=z; 

Jeśli instrukcja 

If

 zostałaby pierwotnie zapisana bez nawiasów, tak jak 

w pierwszym  przykładzie, to dodając drugie wyrażenie warunkowe należałoby 
również pamiętać o ujęciu w nawiasy pierwszego wyrażenia. Pascal nie zabrania 
stosowania nawiasów przy pojedynczych wyrażeniach, dlatego można od 
początku, konsekwentnie ujmować w nawiasy wszystkie - również pojedyncze - 
wyrażenia warunkowe. 

Bloki begin...end 

Inna przyjęta przez autora konwencja odnosi się do wszelkich instrukcji, 
zawierających blok programu, ograniczony parą 

begin...end

. W szczególności 

jest to instrukcja warunkowa 

If...then

. Słowo 

begin

 umieszczane jest w tym 

samym wierszu, co instrukcja. W przypadku instrukcji warunkowej oznacza to, że 

begin

 znajdzie się w tym samym wierszu, co 

If

. Pascal nie nakłada  żadnych 

ograniczeń co do rozmieszczenia słów kluczowych, a zatem 

begin

 można 

umieścić w dowolnym miejscu - w tym samym wierszu, co

 if

, w wierszu poniżej 

albo nawet pięć wierszy niżej. W każdym przypadku kompilator wygeneruje 
identyczny kod. Oto przykład zapisu zgodnego z konwencją, proponowaną przez 
autora: 

if (x=1) then begin 

 y:=z; 

 closefile; 

background image

 Konwencje 

 

99

 

end; 

Opinie na temat zapisywania tego rodzaju instrukcji są bardzo zróżnicowane. 
Niektórzy programiści woleliby zapisać  tę samą instrukcję warunkową 
następująco: 

if (x=1) then  

 begin 

  y:=z; 

  closefile; 

 end; 

Metoda ta wiąże się jednak z poświęceniem dodatkowego wiersza, co bywa 
szczególnie uciążliwe podczas edycji programu na ekranie. Problem wydaje się 
istotny z uwagi na ( przyjmowany domyślnie) mały rozmiar okna edytora Delphi. 
Ponadto, zapis ze słowem 

begin

 w oddzielnym wierszu, budzi wątpliwości co do 

wymaganego wcięcia tekstu. Czy słowo 

begin

, które jest tylko ogranicznikiem 

bloku, należy rozpocząć w tej samej kolumnie, co 

If

? Czy też może powinno być 

przesunięte w prawo względem 

If

, gdyż zawarty w bloku fragment programu jest 

uzależniony od 

If

? A co począć z fragmentem programu między 

begin

 a 

end

Czy ma być zapisany równo z 

begin

, czy z 

If

? Proponowany zapis, w którym 

begin

 znajduje się w tym samym wierszu, co 

If

, eliminuje problem wcięcia. 

Słowo 

end

 pełni oczywistą rolę terminatora instrukcji 

If

. Wreszcie, fragment 

programu wykonywany warunkowo, jest przesunięty względem 

If

, a nie 

begin

co uwypukla jego powiązanie z warunkiem. 

Niektórzy programiści rozpoczynają słowa 

begin

 i 

end

 dużymi literami. Należy 

jednak zwrócić uwagę,  że wszystkie wyrazy pisane wielką literą wyróżniają się 
w tekście programu. Nie ma to chyba uzasadnienia w przypadku zwykłych 
ograniczników bloku, które nie są nawet bezpośrednio tłumaczone na kod 
maszynowy. Duże litery należy zarezerwować dla identyfikatorów, wymagających 
szczególnej uwagi (takich jak stałe), a nie słów 

begin...end

, występujących 

w każdym programie bardzo licznie. 

Komentarze 

Object Pascal dopuszcza stosowanie trzech sposobów zapisu komentarzy: (*...*), 
{...} i //. Do oznaczania zwykłych komentarzy - wyjaśniających działanie części 
programu - najlepiej stosować symbol {...}. Symboli (*...*) można wówczas 
używać w procesie testowania programu, do chwilowego wyłączania niektórych 
fragmentów. Tak zaznaczone fragmenty łatwo można odszukać i ponownie 
uaktywnić albo definitywnie usunąć. Dla komentarzy, opisujących pojedynczy 
wiersz programu, zarezerwowany jest symbol //. 

background image

100 

Część I 

Od przyjętych zasad oznaczania komentarzy trzeba odstąpić, jeśli komentarze mają 
być zagnieżdżone albo zawierać jeden z wymienionych wyżej zarezerwowanych 
symboli. Kompilator zasygnalizuje błąd, jeśli w tekście komentarza, rozpoczętego 
znakiem {, napotka ponownie ten sam lewy nawias. Jeśli komentarz musi zawierać 
nawiasy {}, to należy go oznaczyć np. symbolami (* i *). 

Obiekty związane z serwerem bazy danych 

Stosowanie stałych zasad nazewnictwa obiektów serwera bazy danych pozwala 
uniknąć wielu stresów. Tworzenie dużych baz danych przypomina pisanie dużych 
programów - im stosowane nazwy obiektów są czytelniejsze, tym mniejsze jest 
prawdopodobieństwo pogubienia się w 

gąszczu elementów. Konsekwentnie 

nazywane obiekty stają się swoistymi drogowskazami - pomagają w poruszaniu się 
po bazie danych. 

Konsekwentne nazewnictwo nie tylko upraszcza administrowanie bazą danych - 
ułatwia również tworzenie czytelnych zapytań. Język SQL ma przecież z założenia 
przypominać naturalny język mówiony, a jednocześnie pozostawać  językiem 
strukturalnym. Zrozumiałe i konsekwentnie dobrane nazwy podnoszą czytelność 
programów, zapisanych w języku SQL. 

Podobnie jak w przypadku elementów języka Object Pascal, także i tutaj wszelkie 
proponowane konwencje są wyłącznie sugestiami autora. Czytelnicy powinni 
stosować takie zasady nazewnictwa, jakie im najbardziej odpowiadają. 
Konsekwencja w stosowaniu przyjętych zasad jest znacznie ważniejsza niż wybór 
jakichkolwiek konkretnych reguł. 

UWAGA: 

W dalszej  części niniejszej sekcji wielokrotnie natrafić można na sugestie 
stosowania w ramach jednej nazwy dużych i małych liter; ma to służyć oddzieleniu 
poszczególnych wyrazów. Dlatego należy - w 

miarę możliwości - tak 

skonfigurować serwer, aby rozróżniał on w nazwach duże i małe litery. 

Niektóre serwery (np. InterBase) nie dają takiej możliwości. Stosowanie różnej 
wielkości liter w 

nazwach traci wówczas sens. Wprawdzie pisane przez 

użytkownika skrypty SQL są bardziej czytelne, jednak forma zapisu nazw może 
zostać całkowicie zignorowana przez serwer. Serwer bazy danych może nie 
zapamiętywać i nie respektować nazw zawierających zarówno duże, jak i małe 
litery. Nawet jeśli np. nazwy kolumn tabeli zapisane są dużymi i małymi literami, 
serwer może po każdym dostępie do bazy zwracać te same nazwy zapisane 
wyłącznie dużymi literami. W takich przypadkach lepiej od razu zapisać nazwy 
dużymi literami, a do oddzielania wyrazów stosować znak podkreślenia (_). 

background image

 Konwencje 

 

101

 

Serwery 

Praktyka dowodzi, że konsekwencja w nazewnictwie zasobów baz danych, takich 
jak serwery, jest nie mniej ważna niż konsekwencja w nazewnictwie obiektów, 
udostępnianych przez te zasoby. Autorzy systemów baz danych, zarządzający 
wieloma podobnymi serwerami, mogą uniknąć pomyłek, stosując jednolite 
nazewnictwo serwerów. 

W prezentowanej tutaj konwencji, nazwy serwerów składają się z ośmiu znaków 
i są zapisywane dużymi literami. Pierwsze trzy znaki identyfikują typ serwera: 
SQL oznacza serwer Sybase lub Microsoft SQL Server, ORA - Oracle Server, 
SQA - SQL Anywhere, itd. Kolejne trzy znaki służą do rozróżnienia serwerów 
przeznaczonych do tworzenia aplikacji (development), testowania i właściwych 
serwerów użytkowych (działających na rzeczywistych danych, na rzecz 
rzeczywistych użytkowników). Oznaczenia tych serwerów to odpowiednio 
„DEV”, „TST” i „PRO”. Ostatnie dwa znaki przeznaczone są na numer kolejny 
z zakresu od 1 do 99 (numer zerowy jest zarezerwowany - zob. następny akapit). 
Numeracja umożliwia założenie wielu wersji tego samego serwera. 

Omówione zasady najlepiej zilustruje przykład. Załóżmy, że mamy serwer Sybase, 
który jako jedyny służy do tworzenia aplikacji. Serwer ten nosił  będzie nazwę 
SQLDEV01. Analogicznie, użytkowa wersja tego serwera nazywać się  będzie 
SQLPRO01. 

WSKAZÓWKA: 

Zerowy numer kolejny dobrze jest zarezerwować dla specjalnych zastosowań. 
Można na przykład utworzyć tymczasowy serwer Oracle, używany do budowy 
aplikacji i nazwany ORADEV00. Podobnie, lokalny serwer Sybase, działający na 
komputerze typu laptop, można nazwać SQLDEV00; z serwera tego z założenia 
korzystał  będzie tylko właściciel laptopa. Zarezerwowanie numeru zerowego dla 
specjalnych zastosowań okazuje się bardzo przydatne w praktyce. 

 

UWAGA: 

Umieszczanie numeru w nazwach serwerów może się wydawać zbędne. Po co 
właściwie tworzyć więcej niż jeden egzemplarz serwera określonego typu? 
Doświadczeni administratorzy baz danych znają odpowiedź na to pytanie. 
Zarządzając zbiorem serwerów, prawie zawsze stanąć można przed koniecznością 
utworzenia kilku serwerów użytkowych lub przeznaczonych do budowania lub 
testowania aplikacji . Serwery można podzielić ze względu na stosowane 
aplikacje, jednostki organizacyjne, które z nich korzystają, wreszcie w celu 
poprawy wydajności aplikacji. Może się także okazać,  że bezpieczniej jest 
przeprowadzać wszelkie zmiany i uaktualnienia na oddzielnych serwerach, bez 
narażania właściwych serwerów użytkowych. 

background image

102 

Część I 

Administrator każdego systemu zarządzania bazą danych co jakiś czas zmuszony 
jest do przeprowadzania uaktualnienia systemu operacyjnego albo oprogramo-
wania serwera bazy danych. Oczywiście przeprowadzanie takich zmian wymaga 
wielkiej ostrożności, gdyż nie może doprowadzić do awarii działających 
systemów. Dlatego przed uaktualnieniem serwera bazy danych zawsze testuje się 
wszelkie zmiany i nowe wersje oprogramowania. Najczęściej administrator 
przygotowuje nowy komputer, instaluje na nim nowy serwer bazy danych, po 
czym kopiuje dane ze starego serwera na nowy. Eliminuje to możliwość 
zakłócenia pracy działającego serwera podczas wprowadzania zmian w oprogra-
mowaniu systemowym. Bardzo często administratorzy uaktualniają najpierw 
własne serwery, używane do budowy lub testowania aplikacji, a następnie 
zamieniają je rolami z dotychczasowymi serwerami użytkowymi. Załóżmy,  że 
administrator bazy danych Oracle chce przeprowadzić uaktualnienie serwera 
użytkowego ORAPRO01, instalując na nim nową wersję systemu zarządzania bazą 
danych Oracle. W takim przypadku należy: 

1. Zainstalować nową wersję Oracle na serwerze do tworzenia aplikacji, 

ORADEV01. 

2. Skopiować rzeczywiste dane na uaktualniony serwer. 

3.  Po przetestowaniu uaktualnionego serwera z istniejącymi systemami, zmienić 

jego nazwę na ORAPRO02 (gdyż ORAPRO01 nadal istnieje i działa), po czym 
nakazać wszystkim rzeczywistym aplikacjom korzystanie z 

ORAPRO02 

w miejsce ORAPRO01. W środowisku UNIX zmiany takiej można dokonać za 
pośrednictwem mechanizmów nazewnictwa hostów, np. DNS. 

4. Po uruchomieniu nowego serwera użytkowego można zmienić nazwę 

dotychczasowego - ORAPRO01 - na ORADEV01, gdyż teraz będzie on 
używany do tworzenia aplikacji. 

5. Ostatnim etapem jest uaktualnienie nowego serwera do tworzenia aplikacji 

(ORADEV01, poprzednio ORAPRO01). 

Opisana powyżej procedura jest najbezpieczniejszym, znanym autorowi, sposobem 
uaktualnienia oprogramowania systemowego. Alternatywą może być jedynie 
założenie całkowicie nowego serwera bazy danych. Procedurę uaktualnienia 
znacznie upraszcza stosowanie omówionych wcześniej konwencji nazewnictwa 
serwerów. (Oczywiście podczas uaktualniania systemu nie można obyć się bez 
prawidłowo wykonanych kopii bezpieczeństwa). 

Bazy danych 

Bazy danych, w rozumieniu przyjętym w niniejszej książce, są zbiorami tabel - nie 
są tożsame z tabelami. Nazwy baz danych należy zapisywać małymi literami. 
Konsekwencja w zapisie jest w tym przypadku szczególnie istotna, gdyż niektóre 

background image

 Konwencje 

 

103

 

serwery baz danych w standardowej konfiguracji biorą pod uwagę wielkość liter 
przy rozróżnianiu nazw. Pierwsze trzy znaki nazwy mogą stanowić prefiks, 
identyfikujący system, do którego należy dana baza. Jeśli z bazy korzysta kilka 
oddzielnych aplikacji, to jej nazwa powinna mieć bardziej ogólny charakter. Na 
ogół celowe jest rozróżnienie baz danych nadrzędnych od baz transakcyjnych. 
Nadrzędna (ang. master) baza danych zawiera tablice, których zawartość zmienia 
się stosunkowo rzadko, i w których wyszukuje się nazwy i inne informacje 
o charakterze  opisowym.  Transakcyjna (ang. transactional) baza danych 
przechowuje bardziej ulotne dane - jej zawartość może zmieniać się z dnia na 
dzień. Dane transakcyjne są na ogół wprowadzane z klawiatury przez użytkownika 
albo pobierane z zewnętrznych urządzeń. Niekiedy bazy nadrzędne i transakcyjne 
tworzone są jako oddzielne obiekty, czasami zaś połączone są w jedną bazę 
danych. W 

tym pierwszym przypadku celowe jest nadanie obu bazom 

odpowiednich, różnych nazw. 

UWAGA: 

Niektóre platformy systemów zarządzania bazami danych (np. InterBase) nie 
dopuszczają odwołań pomiędzy tabelami, należącymi do różnych baz danych. 
W szczególności oznacza to, że z tabeli transakcyjnej, należącej do jednej bazy 
danych, nie można odwołać się do tabeli , znajdującej się w innej, nadrzędnej 
bazie danych. Dlatego, przystępując do planowania organizacji baz danych, należy 
upewnić się, czy stosowany system zarządzania bazami dopuszcza odwołania do 
zewnętrznych tabel. Jeśli system nie pozwala na stosowanie takich odwołań, to 
sugerowane powyżej oddzielenie nadrzędnych i transakcyjnych baz danych nie 
będzie możliwe. 

Niekiedy ostatni znak (lub ostatnie dwa znaki) nazwy bazy danych przeznacza się 
na numer kolejny. Pozwala to na tworzenie podobnych nazw wielu wersji tej samej 
bazy. Powyższa metoda bywa jednak rzadko stosowana w praktyce. W omawianej 
konwencji nadrzędna baza danych systemu finansowo- księgowego mogłaby nosić 
nazwę 

fknad0

fk

 identyfikuje bazę danych jako należąca do systemu 

finansowo-księgowego, 

nadrz

 oznacza, że jest to baza nadrzędna, a cyfra 0 

wskazuje, że jest to pierwsza z grupy potencjalnie kilku podobnych baz danych. 

Należy ponownie zwrócić uwagę na ograniczenie długości nazwy do ośmiu 
znaków. Istotnym powodem dobrowolnego zastosowania się do tego ograniczenia 
jest możliwość nadania skryptowi SQL, przeznaczonemu do tworzenia bazy 
danych, tej samej nazwy, co samej bazie. Jeśli nazwa będzie ograniczona do ośmiu 
znaków, to nawet skrypt rezydujący w systemie nie dopuszczającym długich nazw 
plików, będzie mógł nosić nazwę identyczną z nazwą bazy danych. Krótkie nazwy 
plików są wygodne również dlatego, że nie trzeba ich zmieniać wraz z ewentualną 
zmianą platformy. Dlatego wskazane jest ograniczenie długości nazw plików 

background image

104 

Część I 

również wówczas, gdy przechowywane są one na lokalnym dysku (co wiąże się 
z możliwością stosowania długich nazw w podsystemie Win32s). 

Pliki danych 

Większość korporacyjnych systemów zarządzania bazami danych rozróżnia 
definicje baz danych od urządzeń, w których dane są fizycznie przechowywane. 
Jest to realizowane za pośrednictwem konstrukcji programowych znajdujących się 
pomiędzy bazami danych a napędami dysków, na których te bazy są składowane. 
System SQL serwer odwołuje się do tych konstrukcji jako do urządzeń logicznych 
natomiast w Oracle obiekty takie nazywa się plikami danych (ang. data files). Pliki 
danych odwołują się bezpośrednio do napędów dyskowych. Z kolei bazy danych 
zawierają odwołania do plików danych. Dzięki przyjęciu takiego rozwiązania, 
możliwe jest przechowywanie jednej bazy danych na kilku różnych napędach, 
a nawet na kilku różnych serwerach; nie wymaga to żadnych dodatkowych 
zabiegów. Omawiane podejście zapewnia jednolity interfejs, przeznaczony do 
tworzenia i rozszerzania baz danych, niezależny od ich fizycznej lokalizacji.  

Na ogół urządzeniom logicznym i plikom danych nadaje się nazwy podobne do 
nazw skojarzonych z nimi baz danych. Reguła ta wynika ze stosowanej przez 
autora zasady przechowywania w każdym pliku danych tylko jednej bazy. 
W ramach  każdej nazwy, pierwsze trzy znaki identyfikują przeznaczenie 
urządzenia. Dalej następuje numer sekwencyjny, określający pozycję pliku 
w grupie podobnych plików danych. Nazwę urządzenia kończy rozszerzenie DAT 
(dane). Należy zwrócić uwagę,  że pliki urządzeń  są widoczne również poza 
serwerem bazy danych - z poziomu systemu operacyjnego. Nadanie wszystkim 
plikom danych tego samego rozszerzenia ułatwia odnalezienie ich pośród wielu 
innych plików w tym samym katalogu. 

Omawianą konwencję najlepiej zilustruje przykład. Załóżmy,  że mamy plik 
urządzenia na którym umieściliśmy dane z bazy danych o nazwie 

medical

Można wtedy pierwsze urządzenie danych nazwać 

meddat00

.dat. Podobnie, 

pierwsze urządzenie z 

protokołem (log device) może otrzymać nazwę 

medlog00

.

dat

. Pierwsze trzy znaki identyfikują bazę danych, obsługiwaną 

przez urządzenie, kolejne trzy - właściwą funkcję urządzenia, a 

numer 

sekwencyjny określa pozycję pliku wśród podobnych plików urządzeń. 

UWAGA: 

SQL Server pozwala nadawać plikom urządzeń zarówno nazwy logiczne, jak 
i fizyczne. Omawiana powyżej konwencja dotyczy nazw fizycznych. Jako nazwy 
logicznej można użyć nazwy fizycznej, pozbawionej rozszerzenia. 

background image

 Konwencje 

 

105

 

Projektanci baz danych często dokładnie definiują miejsce fizycznego 
przechowywania poszczególnych tabel i indeksów; kierują się przy tym względami 
wydajności systemu. W przypadku systemu SQL Server służy do tego mechanizm 
segmentów (

segments

), a 

środowisku Oracle - mechanizm przestrzeni 

tablespace

. Plik urządzenia logicznego, który ma być  używany wyłącznie 

przez dany 

segment

  bądź przestrzeń 

tablespace

, powinien nosić 

odpowiednią nazwę. Na przykład, plik skojarzony z segmentem 

ksiega-

przychodowrozch 

mógłby nosić nazwę 

kprdat00.dat

. Powyższym 

zasadom przyświeca idea łatwego rozpoznawania danych, skojarzonych z danym 
plikiem urządzenia, wprost z 

poziomu systemu operacyjnego. Ułatwia to 

odtwarzanie stanu bazy po wszelkich awariach i sporządzanie kopii zapasowych. 

Tabele 

Nazwy tabel należy zapisywać wyłącznie dużymi literami. Tabele są kluczowymi 
elementami bazy danych, a zapis dużymi literami wyróżni je w tekście poleceń 
SQL. Wprawdzie większość współczesnych systemów zarządzania bazami 
jednakowo traktuje nazwy zapisane dużymi i 

małymi literami, jednak 

proponowany tutaj zapis nazw tabel spowoduje ich wyróżnienie w skryptach SQL 
i procedurach pamiętanych. 

Same nazwy powinny być jak najprostsze, opisowe i składać się z jednego lub 
dwóch słów, nie przekraczających w sumie długości ośmiu znaków. Nie zaleca się 
stosowania jakichkolwiek numerów sekwencyjnych. Stosowanie powyższych 
zasad ma przyczynić się do uproszczenia zapytań SQL. Skomplikowane nazwy 
tabel są trudne do odczytania i zapamiętania. Najlepiej sprawdzają się zatem 
identyfikatory jednowyrazowe. Oto przykłady prawidłowych nazw tabel: 
FAKTURY, ZAMOWIEN, KLIENT. 

Również w tym przypadku należy zwrócić uwagę na ograniczenie długości nazwy 
do ośmiu znaków. Ograniczenie to pozwoli na nadawanie skryptom SQL nazw 
identycznych z nazwami tworzonych przez nie tabel - niezależnie od stosowanego 
systemu operacyjnego. 

WSKAZÓWKA: 

Nadając tabelom nazwy proste i logiczne, autor systemu bazy danych daje 
użytkownikom szansę tworzenia ich własnych zapytań SQL. Dostępnych jest wiele 
narzędzi do wizualnego konstruowania zapytań. Użytkownicy będą mogli z nich 
skorzystać, jeśli tylko nazwy tabel nie będą miały zbyt „komputerowego” 
charakteru. 

background image

106 

Część I 

Indeksy 

W wielu dialektach SQL zapytania nie mogą zawierać bezpośrednich odwołań do 
indeksów. Dlatego nazewnictwo indeksów jest stosunkowo mało istotnym 
zagadnieniem. Można, na przykład, nadawać indeksom nazwy identyczne 
z nazwami tabel, na bazie których powstały. Taka nazwa powinna być uzupełniona 
numerem, określającym pozycję danego indeksu względem innych - pierwszy 
indeks tabeli KLIENT może nazywać się KLIENT01, drugi - KLIENT 02, i tak 
dalej. Liczby w nazwie odpowiadają numerowi przypisywanemu przez Sybase 
SQL Server; dzięki nim łatwiej jest pisać efektywne zapytania, wymuszające 
stosowanie konkretnego indeksu. 

Perspektywy (ang. views) 

Perspektywy należy nazywać tak samo, jak tabele. W 

zapytaniach SQL 

perspektywy i tabele pełnią bowiem tę samą rolę. Niektórzy programiści 
wyróżniają perspektywy przez dodanie do nazwy liter 

V

 lub 

VW

. Nie jest to jednak 

konieczne. 

Procedury i funkcje pamiętane 

Nazwy procedur i funkcji pamiętanych dobrze jest zapisywać małymi literami. 
Ułatwi to odróżnienie ich od nazw tabel i innych obiektów w zapytaniach SQL. 
Wielkość liter w nazwach zależy na ogół od preferencji programisty, gdyż wiele 
współczesnych serwerów SQL nie rozróżnia dużych i małych liter w nazwach. 
W każdym przypadku zróżnicowanie nazw obiektów przez stosowanie różnych 
wielkości liter poprawia czytelność zapytań. 

Niektórzy programiści dodają litery 

sp

 na początku lub na końcu nazwy procedury 

pamiętanej. Na ogół nie jest to potrzebne. Procedury pamiętanej niemal nigdy nie 
używa się w tym samym kontekście, co jakiegokolwiek innego obiektu, np. tabeli. 
Rzadko na przykład spotyka się zapis 

SELECT * FROM nazwaprocedury

a już nigdy - 

EXECUTE  nazwatabeli

. Osoby, które regularnie stosują 

polecenie 

SELECT

 z nazwą procedury pamiętanej, używanej w tym samym 

kontekście, co nazwa tabeli (co jest dozwolone np. na platformie InterBase), mogą 
zdecydować się na dodawanie 

sp

 do nazw procedur pamiętanych; w innym 

przypadku nie ma takiej potrzeby. 

background image

 Konwencje 

 

107

 

OSTRZEŻENIE: 

W przypadku platform Sybase oraz Microsoft SQL Server, procedury pamiętane, 
których nazwy rozpoczynają się od ciągu znaków 

sp_

, przechowywane są 

w nadrzędnej (

master

) bazie danych. Istnieje wiele powodów, dla których należy 

unikać przechowywania obiektów użytkownika w bazie danych typu 

master

Dlatego, decydując się na dodatkowy wyróżnik nazw procedur pamiętanych, 
należy dodawać 

_sp

 na końcu nazwy. 

Tworząc nazwy procedur pamiętanych, można stosować z powodzeniem te same 
zasady, które obowiązywały w nazewnictwie modułów (units) języka Object 
Pascal. Pierwszy znak identyfikuje zatem aplikację, do której należy procedura. Po 
nim następuje trzy- lub sześcioliterowy ciąg, opisujący  ogólne i specyficzne 
funkcje procedury. Nazwę kończy jedno- albo dwucyfrowy numer kolejny wersji. 

Zatem procedura, która sporządza listę na podstawie tabeli CALLS w systemie 
zarządzania wynajmem (Rental Maintenance Management System), nazywałaby 
się 

RCALLST0

. Litera R identyfikuje system, do którego należy procedura, CAL 

wskazuje na związek procedury z tabelą CALLS, LST oznacza, że procedura 
sporządzi listę na podstawie tabeli, a cyfra 0 wskazuje, że jest to pierwsza 
procedura z serii kilku podobnych. 

UWAGA: 

Systemy Sybase i Oracle dopuszczają nadawanie jednej bazowej nazwy kilku 
procedurom pamiętanym. W systemie Oracle wybór właściwej procedury realizuje 
się wówczas za pośrednictwem mechanizmu przeciążania. W przypadku systemu 
Sybase za nazwą procedury umieszcza się  średnik i numer kolejny procedury 
zapamiętanej pod daną nazwą. Należy unikać stosowania powyższych 
mechanizmów. Bywają one trudne do opanowania i potencjalne korzyści z ich 
stosowania nie rekompensują związanych z nimi utrudnień i pomyłek. 

Pakiety 

Pakiety, będące zbiorami procedur i funkcji pamiętanych, powinny być nazywane 
podobnie jak te procedury i funkcje. Nazwy należy zapisywać małymi literami. 
Pierwszy znak identyfikuje aplikację, do której należy pakiet. Po nim następuje 
trzy- lub sześcioliterowy ciąg, opisujący  ogólne i specyficzne funkcje pakietu. 
Nazwa kończy się literą 

p

, zajmującą miejsce numeru kolejnego wersji procedury. 

background image

108 

Część I 

Reguły 

Jeśli stosowany serwer obsługuje reguły (ang. rules), to należy nadawać im nazwy 
o charakterze opisowym i stosować zarówno duże, jak i małe litery. Należy także 
zdecydować, czy nadawane nazwy mają określać zbiór danych, który reguła 
wyklucza, czy też zbiór, który reguła  dopuszcza., Jeśli stosowane nazwy mają 
określać zbiór danych dopuszczalnych, to reguła wykluczająca wprowadzenie 
wartości zerowej nazywałaby się NonZero. Analogicznie reguła, wymuszająca 
wpisanie w pole Płeć jednej z dwóch wartości: K albo M, mogłaby się nazywać 
KobietaMezczyzna. Zapytania SQL rzadko zawierają bezpośrednie odwołania do 
reguł, dlatego też ich nazwy nie mają większego znaczenia. Reguły należą ponadto 
do obiektów, które rzadko tworzone są przy pomocy oddzielnych skryptów SQL. 
Nie ma zatem powodu, by ograniczać długość ich nazw do ośmiu znaków. 

Wartości domyślne 

Jeśli stosowany serwer dopuszcza stosowanie obiektów, reprezentujących wartości 
domyślne kolumn, to w ich nazwie należy zawrzeć identyfikator pola, któremu 
odpowiadają (jeśli odpowiadają tylko jednemu polu), a także wpisywaną przez nie 
wartość domyślną. Nazwy powinny być zapisywane zarówno małymi, jak i dużymi 
literami. Na przykład, wartość domyślna, skojarzona z polem Sex i automatycznie 
wpisująca w to pole F, powinna nazywać się SexFemale. Zapytania SQL rzadko 
zawierają bezpośrednie odwołania do wartości domyślnych, dlatego też ich nazwy 
są mało istotne. Wartości domyślne należą do obiektów, których na ogół nie 
tworzy się przy pomocy oddzielnych skryptów SQL. Nie ma zatem powodu, by 
ograniczać długość ich nazw do ośmiu znaków. 

Domeny 

Domeny (definiowane przez użytkownika typy danych) pełnią rolę zbliżoną do 
typów danych w języku Object Pascal. Dlatego można stosować do nich podobne 
reguły nazewnictwa. Nazwa domeny powinna pochodzić od nazwy kolumny, 
której zawartości domena dotyczy. Ponadto na początku nazwy domeny należy 
umieścić literę T, podobnie jak w nazwach typów danych języka Object Pascal. Na 
przykład, domena definiująca kolumnę CustomerNo, nosić  będzie nazwę 
TCustomerNo. Taka nazwa niesie informację,  że domena definiuje kolumnę 
CustomerNo, a ponadto pozwala w poleceniu 

CREATE

 

TABLE

 odróżnić domenę 

od wbudowanych typów danych. Domeny należą do obiektów, które rzadko 
tworzone są przy pomocy oddzielnych skryptów SQL. Nie ma zatem powodu, by 
ograniczać długość ich nazw do ośmiu znaków. 

background image

 Konwencje 

 

109

 

Więzy i wyjątki 

Więzy i wyjątki powinny nosić nazwy o formie zbliżonej do komunikatów. Nazwy 
takie pozwalają na szybką identyfikację problemu, który spowodował naruszenie 
więzów albo wygenerowanie wyjątku. U źródeł przyjęcia takiej konwencji 
nazewnictwa leży konieczność poinformowania użytkownika o problemie za 
pośrednictwem samej tylko nazwy obiektu - w przypadku niektórych narzędzi nie 
można bowiem liczyć na przekazanie pełnego komunikatu z 

serwera (w 

szczególności dotyczy to komunikatów, dotyczących naruszenia więzów). 
Narzędzia te zwracają ponadto nazwy zapisane dużymi literami, niezależnie od 
formy, w jakiej przechowywane są one w bazie danych. Należy zatem unikać 
stosowania w nazwach różnej wielkości liter. Przykładowo ograniczenie klucza 
obcego, zapewniające wprowadzenie poprawnego numeru klienta, mogłoby nosić 
nazwę 

INVALID_CUSTOMER_NO

. Jeśli nastąpi naruszenie ograniczenia, 

a narzędzie po stronie użytkownika przekazuje z serwera przynajmniej nazwy 
naruszonych więzów, to użytkownik uzyska podstawową informację o źródle 
problemu. Ta sama zasada powinna obowiązywać w nazewnictwie wyjątków, 
chociaż w tym przypadku można spodziewać się, że narzędzie interfejsu front-end 
wyświetli opis wyjątku, a nie jego nazwę. Więzy i wyjątki również należą do 
obiektów, które rzadko tworzone są przy pomocy oddzielnych skryptów SQL. Nie 
ma zatem powodu, by ograniczać długość ich nazw do ośmiu znaków. 

Generatory i sekwencje 

Podobnie jak nazwy domen, także nazwy generatorów i sekwencji powinny 
pochodzić od nazw obsługiwanych kolumn. Na końcu nazw można dodać ciąg 
znaków 

GEN

 albo 

SEQ

. Generator, obsługujący kolumnę CustomerNo, będzie więc 

nosił nazwę CustomerNoGEN. Sekwencja, skojarzona z kolumną OrderNo, 
nazywać się  będzie OrderNoSEQ. Generatory i sekwencje należą do obiektów, 
których na ogół nie tworzy się przy pomocy oddzielnych skryptów SQL. Nie ma 
zatem powodu, by ograniczać długość ich nazw do ośmiu znaków. 

Kursory 

Nazwy kursorów odpowiadają zazwyczaj nazwom tabel, na których operują. 
Celowe jest ponadto rozróżnienie kursorów, które umożliwiają uaktualnianie 
danych od kursorów, które takiej możliwości nie dają. Rozróżnienie takie można 
uzyskać dodając do właściwego identyfikatora słowo 

UPDATE

 (uaktualnienie) 

albo 

SELECT

 (selekcja).Taj więc kursor zadeklarowany dla tabeli TENANT, 

umożliwiający uaktualnienia i 

usuwanie rekordów mógłby nazywać się 

TENANT_UPDATE. Z 

kolei kursor odwołujący, wskazujący na tabelę 

background image

110 

Część I 

PROPERTY, i 

nie pozwalający na uaktualnienia danych, nosiłby nazwę 

PROPERTY_SELECT. 

Procedury zdarzeń (triggers) 

Nazwy procedur zdarzeń powinny zawierać identyfikatory skojarzonych z nimi 
tabel oraz poleceń SQL, które powodują ich uaktywnienie. Procedura zdarzenia 
może być uaktywniana w 

trakcie wykonywania komend SQL

 INSERT, 

UPDATE albo DELETE

, a zatem lista komend uaktywniających, zawarta 

w nazwie,  będzie stanowiła kombinację  słów Insert, Update i Delete. I tak 
procedura zdarzenia uaktywniana po dodaniu lub aktualizacji wiersza w tabeli 
TENANT będzie nazywał się TENANTInsertUpdate, natomiast inna, uaktywniana 
po usunięciu rekordu z 

tabeli WORDERS, mogłaby nosić nazwę 

WORDERSDelete. 

Jeśli serwer pozwala zdecydować, czy procedura zdarzenia (trigger) ma być 
uaktywniana przed czy po jednym z wymienionych zdarzeń, to nazwa może 
dodatkowo zawierać modyfikator Before (przed) albo After (po). Na przykład 
nazwa PROPERTYBeforeDelete (albo PROPERTY_BEFORE_DELETE) będzie 
identyfikowała procedure zdarzenia, uaktywnianą przed wykonaniem polecenia 

DELETE

 na tabeli PROPERTY. 

Niektóre platformy pozwalają określić, czy procedura zdarzenia odnosi się do 
wiersza czy taż do wyrażenia. W takich przypadkach nazwę można uzupełnić literą 

R

 albo 

S

, np. PROPERTY_BEFORE_ DELETE_S. Taki zapis identyfikuje typ 

procedury zdarzenia i skojarzoną z nim tabelę. 

Procedury zdarzeń  (triggers) należą do obiektów, które rzadko tworzone są przy 
pomocy oddzielnych skryptów SQL. Nie ma zatem powodu, by ograniczać długość 
ich nazw do ośmiu znaków. 

Kolumny 

Kolumny są najczęściej spotykanymi elementami zapytań SQL, dlatego 
szczególnie istotne jest nadawanie im nazw o charakterze opisowym. W zapisie 
nazw kolumn należy stosować zarówno duże, jak i małe litery. Nazwy te powinny 
być łatwe do wymówienia i zapamiętania. Jeśli konfiguracja serwera zakłada brak 
rozróżnienia między dużymi a 

małymi literami, to poszczególne wyrazy 

w nazwach kolumn powinny być oddzielone znakiem podkreślenia. Nie należy 
nadmiernie skracać nazw kolumn - ktoś, kto za kilka lat zajmie się konserwacją 
odpowiedniego programu w języku SQL, z pewnością doceni pełne, zrozumiałe 
nazwy kolumn. Nazwa nie powinna pozostawiać  wątpliwości co do roli danej 
kolumny w bazie danych. Kolumny, które reprezentują te same jednostki w bazie 
danych, takie jak 

CustomerNo

 (numer klienta), powinny nazywać się tak samo 

background image

 Konwencje 

 

111

 

we wszystkich tabelach. Decydując się na skracanie jakiegoś elementu nazwy, np. 

Number

 albo 

Address

, należy zachować konsekwencję. Słowa 

Number

 nie 

należy zapisywać raz jako No w nazwie 

CustomerNo

, a raz jako Num, w nazwie 

OrderNum

. Jako przykłady dobrze skonstruowanych nazw kolumn wymienić 

można: 

OrderNo, ShippingAddress, SampleWeight

 czy 

AverageWellDepth. 

WSKAZÓWKA: 

Jedną z ważniejszych korzyści, płynących ze stosowania opisowych nazw kolumn, 
jest możliwość bezpośredniego wykorzystania etykiet, automatycznie wygene-
rowanych przez narzędzie programistyczne. Jeśli na przykład na formularz Delphi 
przeciągnięte zostanie pole tabeli, to na formularzu generowana jest automatycznie 
etykieta odpowiedniej kolumny. Etykieta zawiera od razu nazwę pola w bazie 
danych. Jeśli nazwa ta jest zrozumiała, to prawdopodobnie automatycznie 
wygenerowana etykieta będzie czytelna także dla użytkowników programu - nie 
będzie trzeba ręcznie wpisywać nowej, bardziej opisowej. A zatem opisowe nazwy 
kolumn nie tylko ułatwiają orientację w schemacie bazy danych - przyspieszają 
także pracę nad aplikacją. 

W tablicy 4.2 zebrano konwencje nazewnictwa obiektów serwera, omówione 
w niniejszym rozdziale.