05 rozdzial 04 JDAUI5ABM2CA4N25 Nieznany (2)

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
w

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

w

ś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.


Wyszukiwarka

Podobne podstrony:
05 rozdzial 04 nzig3du5fdy5tkt5 Nieznany (2)
05 Rozdzial 04 4MPUBCZXWATI23KW Nieznany (2)
05 rozdzial 04 nzig3du5fdy5tkt5 Nieznany (2)
05 Rozdział 04 Zbiory uporządkowane
05 Rozdział 04 Ogólne równanie uwikłane pierwszego rzędu
05 Rozdział 04 Potęgowanie liczb rzeczywistych
05 Rozdział 04 Ogólne równanie uwikłane pierwszego rzędu
05 Rozdział 04 Zbiory uporządkowane
05 Rozdział 04 Potęgowanie liczb rzeczywistych
713[05] Z2 04 Wykonywanie oklad Nieznany
05 rozdzial 05 NHXCQGIIMVDYW7MI Nieznany
04 rozdzial 03 SAEGWF4BH75JAEXA Nieznany (2)
04 Rozdzial 03 O32IFU5XJ5DGJEK3 Nieznany (2)
04 RozdziaB 04id 5180 Nieznany (2)
04 05 09 Fizjologiaid 4919 Nieznany (2)
cw 05 opto 04 03 05 id 121377 Nieznany
04 rozdzial 03 wtcjpb3t4i6ahedw Nieznany
Ir 1 (R 1) 029 064 Rozdzial 04 Nieznany

więcej podobnych podstron