Bu sənəd Delphi kod yazma standartları haqqındadır. Borland tərəfindən yaradılan və bir çox Delphi programçısı tərəfindən mənimsənən standartlar. Object Pascal çox gözəl dizayn edilmiş bir dildir, bu standartların əsas məqsədi də kodu daha yaxşı oxunabilən etməkdir. Daha sonra yazdığınız bir koda baxdığınız zaman asanca oxuya bilməlisiniz vəya birlikdə proyekt hazırladığınız yoldaşınız kodlarınızı asanca başa düşə bilməlidir.



ÜMUMİ QAYDALAR



Cərgələmə


* Əgər kodda cərgələmə etsəniz, kodları oxumaq və izləmək daha asan olacaq. İlk cərgə başlanğıcdan etibarən 2 boşluq buraxaraq, ikinci cərgə başlanğıcdan etibarən 4 boşluq buraxaraq, üçüncü cərgə başlanğıcdan etibarən 6 boşluq buraxaraq və sonra da hər cərgə üçün iki boşluq (8, 10, 12, 14... boşluk) buraxaraq davam edilməlidir.



* Tab simvolunu kod fayllarına qeyd etməyin. Çünki Tab simvoluna uyğun gələn boşluq miqdarı istifadəçidən istifadəçiyə və müxtəlif proqramlara görə fərqlənir.



Tools -> Editor Options -> Source Options qismindəki Use Tab Character seçənəyini ləğv edərək Tab simvolunun kod fayllarına qeyd olunmasının qarşısını ala bilərsiniz. Bu seçənək seçili olmadığında, Tab'ı basdınığız zaman Tab simvolu yerinə boşluq doldurulur.



* Kod redaktorunda şaquli bir xətt vardır. Kod yazarkən bu xətti keçməsəniz kodunuz həm daha asan oxunular, həm də nəticələri daha yaxşı görünər.



* Bir-biriylə əlaqəli begin və end, bir-biriylə eyni cərgədə və ayrı sətirlərdə yazılmalıdır.



Səhv : for i := 0 to 10 do begin // begin, for'la eyni sətirdə



Düzgün : for i := 0 to 10 do

begin



if Şərt then

begin

...

end

else

begin

...

end;



İzah Qoyma


* İzah üçün //, {} və (* *) istifadə olunur.



* // bir sətirə izah yazmaq üçün istidadə olunur.

{} və (* *) isə blok olaraq izah qoymaq üçün istidadə olunur, başlanğıc və bitiş arasındakı hər şey izah kimi qəbul olunur. Bunlardan {} izah yazmaq, (* *) da iş əsnasında müvəqqəti olaraq bəzi kodları proqramdan çıxarmaq üçün istifadə oluna bilər.



* Koda nə çox, nə də az, başa düşməniz üçün kifayət olacaq qədər izah əlavə edin.



* Əgər düzəltmək istədiyiniz bir koda müvəqqəti olaraq izah əlavə edirsinizsə, izahın əvvəlinə ??? əlavə etmək yaxşı olar. Daha sonra asanca bu sətirləri tapıb, lazımi düzəlişlər edə bilərsiniz.



Məsələn: //???:digər proseduranı hazırlayandan sonra sıralama qismini də düzəltmek lazımdır.



Məlumat Əlavə Etmə



Yazdığınız unit’in başlığına məlumat əlavə etmək istəyirsinizsə, onu unit’in ən üstünə aşağıdakı şəkildə əlavə etməlisiniz. Lazım olsa araya eyni formatda yeni sətirlər əlavə edə bilərsiniz.



{************************************************* ******}
{ }
{ Natiq Zeynalov }
{ }
{ © 2007-2008, [ }
{ }
{************************************************* ******}




OBJECT PASCAL



Boşluqlar


Object Pascal boşluqları nəzərə almır. Object Pascal çox gözəl bir dizayna sahib olduğu üçün çoxlu boşluq buraxmağa ehtiyac yoxdur, ancaq;



* Altproqramlar (prosedura, funksiya) arasında bir sətir boşluq buraxmalısınız.



* Açma mötərizəsi ilə sonrakı simvol və bağlama mötərizəsi ilə əvvəlki simvol arasında boşluq buraxmayın.



Səhv : CallProc( AParameter )

Düzgün : CallProc(AParameter)



* Kod içərisində lazımsız yerlərdə əlavə mötərizələr işlətməyin.



if (i = 15) then // səhvdir, burada mötərizəyə ehtiyac yoxdur.

if (i = 15) or (j = 5) then // düzgündür, mötərizələr lazımlıdır


* Nöqtəli vergüldən əvvəl boşluq buraxmayın.



* Kvadrat mötərizələrdən əvvəl və sonra boşluq buraxmayın.



Səhv : MyInteger := MyIntegerArray [ 3 ];

Düzgün : MyInteger := MyIntegerArray[3];



Ayrılmış Sözlər (Reserved Words)



Object pascal'a aid ayrılmış sözlər (for, if, begin, end kimi kod içinde xüsusi mənası olan sözlər) tamamilə kiçik hərflərlə yazılmalıdır. Bu sözlər susmaya görə redaktor içində tünd yazı tipi ilə göstərilirlər.





Prosedura və Funksiyalar (Altproqramlar)



* Altproqramlara gördükləri işə aid olan mənalı adlar verilməlidir. Adətən yaxşı adlar; bir ad və bir feldən ibarət olur.



FaylAxtar, ProgramiBagla kimi.



* Altproqram adlarını daha asan oxuyabilmək üçün sözlərin baş hərfləri böyük yazılmalıdır.



Səhv : procedure bubiruzunokunmasizoraltproqramadi;

Düzgün : procedure BuOkumasiAsanBirAltproqramAdi;



* Altproqram adlarında alt xətt ("_") olmamalıdır.



Səhv : procedure Bu_Sehv_Bir_Procedure_Adi;



Parametrlər


* Mümkün olduğu qədər, eyni tipli parametrlər bir ifadədə toplanmalıdır.



Səhv : procedure Numune(Parametr1: string; Parametr2: string; Parametr3: string);

Düzgün : procedure Numune(Parametr1, Parametr2, Parametr3: string);



* Parametrlərə mənalı adlar verilməlidir.



* Əgər kateqoriyalı bir sıralama varsa parametrləri ona görə sıralayın.



BirProc (Olke, Rayon, Kend : string); kimi.



* Belə bir kateqoriya yoxdursa çox işlədilən parametrdən, az işlədilən parametrə sıralayın. Bir istisna olaraq Sender parametri həmişə birinci yazılır.



Ad Kəsişmələrinin Qabağını Alma



Əgər bir altproqram birdən çox unitdə təyin olunubsa uses qismində bu unitlərin hamısının istifadəsində yaranabiləcək qarışıqlıqların qabağını almaq üçün bu altproqram unit adı ilə işlətmək lazımdır.



Məsələn : FindClose altproqramı 2 unitdə təyin olunub.



SysUtils.FindClose(SR); vəya Windows.FindClose(Handle);



Dəyişənlər


* Dəyişənlərə mənalı adlar verilməlidir.



* Dövr dəyişənləri üçün adətən i, j, k hərfləri işlədilir.



* Məntiqi (boolean) dəyişənlərin adları qiymətlərinin (True, False) mənasına uyğun bir ad olmalıdır.







* Birdən çox eyni tipli dəyişən ayrı-ayrı sətirlərdə deyil, bir sətirdə yazılmalıdır.



var

i: integer;

j: integer;



əvəzinə



var

i, j: integer;



* Əgər lazımdırsa lokal dəyişənlərə altproqramın girişinde ilk qiymətlər verilməlidir.



* Mümkün olduğu qədər qlobal dəyişənlər işlədilməməli, sadəcə həqiqətən lazımlı olduğu hallarda işlədilməlidir. Qlobal dəyişənlərə təyin olunma mərhələsində ilk qiymət verilə bilər. Əgər lazımdırsa bu mənimsətmələri təyin qismində edə bilərsiniz. Ancaq mənimsədəcəyiniz qiymətlər 0, nil, ... kimi sıfırlama qiymətləridirsə bu mənimsətmələr lazımsızdır. Bu mənimsətmələr ən uyğun şəkildə Delphi tərəfindən edilir.



Real Tipindən İstifadə Etməyin


* Real tipi geriyə doğru uyğunluq üçündür. Bunun əvəzinə Double tipindən istifadə edin.



Variant və OleVariant



İş əsnasında tipi məlum olmayan verilənləri saxlamaq üçün istifadə olunurlar və adətən COM və verilənlər bazası proqramlarında lazım olurlar, bunlardan başqa çox da işlətməyin. Variant'lar digər tiplərə görə daha yavaş işləyirlər.



Variant stringləri Delphi tipinde saxlayarkən, OleVariant bu stringləri Ole string'lərə çevirir (WideChar). Bunun üçün COM-əsaslı (COM-based) proqramlarda və ActiveX hazırlayarkən OleVariant işlədin.



if İfadəsi



* if/then/else şəklində işlədilən ifadələrdə, icra olunması daha çox ehtimallı olan then qismində, daha az ehtimallı olan isə else qismində olmalıdır.



* if ifadələrinin oxunması daha çətin olduğundan, mümkün olduğu qədər case ifadəsi işlədin.



* iç-içə if ifadələrindən ən çox 5 seviyyəyə qədər istifadə edin. Daha çoxuna ehtiyac varsa, proqramınızı gözdən keçirib strukturu dəyişdirin.



* Əgər birdən çox şərti yoxlayırsınızsa, sərtləri sürətli işləyəndən yavaş işləyənə doğru düzməyiniz daha yaxşıdır. Məsələn: şərt1 daha sürətli, şart2 biraz yavaş hesaplanırsa



if Şərt1 or Şərt2 then // şərt1 True'dursa, Şərt2'yə baxılmaz.









* Birdən çox şərtı yoxlayırsınızsa və şərt ifadələri uzundursa, hər şərti bir sətirə yazmaq daha yaxşı olacaq.



if Şərt1 and

Şərt2 and

Şərt3 then



case İfadəsi



* case'də ifadələr ədədi vəya əlifba sırasında yazılmalıdır.



* hər ifadənin uzunluğu 4-5 sətirdən çox olmasa yaxşı olar. Əgər bir ifadənin çox uzundursa bunu ayrı bir prosedura vəya funksiya olaraq yazmaq daha yaxşı olacaq.



* hər ifadə begin..end blokları arasına yazılmalıdır.



case İfadə of
ifadə1 :

begin

...

end;

ifadə2 :

begin

...

end;

else

...

end; {case}



with ifadəsi



with ifadəsi yazılışda asanlıq üçün işlədilir. Ancaq with ifadəsini lazımlı yerlərdə işlətməli və birdən çox obyekt ilə işlətməməlisiniz.



Səhv : with Record1, Record2 do



belə bir işlətmə həm kodu oxuyan adamı çaşdırır, həm də səhv təsbitlərini çətinləşdirir.



EndIf, EndCase, EndWith


Object Pascal’da bu ifadələr yoxdur. Bu ifadələr begin..end blokları arasına yazılırlar. Bu ifadələri işlədərkən, başlanğıc və bitiş bloklarını təyin etmək üçün izahdan istifadə etməlisiniz :



if i > 5 then

begin

...

end; {if} // if blokunun sonu


with Query1 do

begin

....

end; {with} // with blokunun sonu





Enumerated Type



Hər elementdən əvvəl enumarated type’ı göstərən hərfləri etmək lazımdır. Aşağıdakı misalda, hər elementin əvvəlinə bk hərfləri əlavə olunmuşdur və bunlar ButtonKind ifadəsinin baş hərfləridir.



Yalnız sadəcə L vəya 1 əlavə etməyin. Bunlar göstərmədə və bəzi printerlərdə problem çıxarda bilər.



TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo,
bkClose, bkAbort, bkRetry, bkIgnore, bkAll);


Exception Handling



Delphi'də ümumi qayda: obyekti yaradan yox edir (Məncə bu qayda bütün kainata aiddir - red). Əgər bir form vəya bir obyekt yardıbsınızsa onu yox etmə vəzifəsi də sizə aiddir. Tutduğunuz resursları sistemə qaytarmalısınız. Bunun üçün tez-tez try..finally blokundan istifadə etmək lazımdır.



SomeClass1.Create; // yarat

try

... // bir şey elə

finally

SomeClass1.Free; // SomeClass1 mütləq yox edilir.

end; {try}



Əgər səhv olduğu zaman bir şey icra etmək istəyirsinizsə (adətən səhvi göstərmə vəya qeyd etmə kimi) try..except blokundan istifadə etməlisiniz.



try

....

except

.... // səhv olanda bu blok icra olunur

end; {try}



Sinif (class) Adları



* Həmişə olduğu kimi məntiqli adlar verilməlidir. Delphi'də siniflərın (class) əvvəlinə T hərfinin qoyulması bir ənənədir. Yəni hər bir sinif adı T ilə başlamalıdır.



type

TMusteri = class(TObject);



Fields və Property Access



* Field’lərin əvvəlinə F hərfi əlavə olunmalıdır. FYukseklik kimi.



* Bütün fieldlər private qismində təyin olunmalıdır.



* property'lərə müraciət üçün istifadə olunan metodların əvvəlinə get və set sözləri əlavə olunmalıdır.



property Yukseklik: Integer read GetYukseklik write SetYukseklik;



* Metodlar əlifba sırasıyla düzülməlidir. Yəni : private – protected – public - published



FAYLLAR



* Proyektlərə mənalı və açıqlayıcı adlar verilməlidir. Məsələn sistem məlumatlarını göstərən bir proqram üçün : SystemInfo.dpr kimi.



* Form adlarına mənalı və açıqlayıcı bir addan sonra Frm simvolları ilə biten bir ad verilmədir. Məsələn Stok formu üçün StokFrm.pas kimi.



* Data Modullara yenə açıqlayıcı bir addan sonra DM simvolları ilə bitən bir ad verilməlidir. Məsələn müştəri cədvəllərinin olduğu data module üçün : MusteriDM.pas kimi.



FORMLAR



* Form adları açıqlayıcı bir ön ad və Form sözünün birləşməsindən ibarət olmalıdır. Məsələn Stok formunun adı : StokForm, müştəri məlumatlarının girişinin yerinə yetirildiyi formun adı : MusteriGirisForm



* Ancaq çox lazımlı formlar auto-create edilməlidir. Auto-Create formlar proqram icra olunduğu anda avtomatik olaraq yaradılır və yaddaşda yer tuturlar. Çox lazımlı formlar xaric, digər formlar Project Options qismindən Avaible Forms qisminə keçirilməlidir.



* Data modullara açıqlayıcı bir ön əlavədən sonra DataModule sözləri əlavə olunmalıdır. Məsələn müştəri cədvəllərinin yerləşdiyi data module üçün MusteriDataModule kimi.