Borland Kodlama Standartları
BORLAND KODLAMA STANDARTLARI
Bu doküman Delphi kod yazma
standartlarını anlatmaktadır. Borland tarafından oluşturulan ve birçok Delphi
programcısı tarafından benimsenen standartlar. Object Pascal çok güzel dizayn
edilmiş bir dildir, bu standartların temel amacı da kodu daha okunabilir
kılmaktır. Daha sonra yazdığınız bir koda baktığınız zaman kolayca
okuyabilmelisiniz veya birlikte proje geliştirdiğiniz bir takım arkadaşınız
kodlarınızı kolayca anlayabilmelidir.
GENEL KURALLAR
Hizalama
* Eğer kodda hizalama
yaparsanız, kodları okumak ve takip etmek çok daha kolay olacaktır. İlk hiza
başlangıçtan itibaren 2 boşluk bırakarak, ikinci hiza başlangıçtan itibaren 4
boşluk bırakarak, üçüncü hiza başlangıçtan itibaren 6 boşluk oluşturarak ve
sonrasında her hiza için iki boşluk (8, 10, 12, 14... boşluk) bırakarak devam
edilmelidir.
* Tab karakterlerini kod
dosyalarına kaydetmeyin. Çünkü Tab karakterinin belirttiği boşluk miktarı
kullanıcıdan kullanıcıya ve çeşitli kod uygulamalarında farklı algılanmaktadır.
Tools -> Editor Options ->
Source Options kısmındaki Use Tab Character seçeneğini iptal ederek Tab
karakterinin kod dosyalarına kaydolmasını engelleyebilirsiniz. Bu seçeneği
kapattığınızda, Tab'a bastınığız zaman Tab karakteri yerine boşlukla doldurulur.
* Kod editöründe düşey bir
çizgi vardır. Kod yazarken bu çizgiyi geçmezseniz kodunuz hem daha kolay okunur,
hem de çıktıları daha iyi gözükür.
* Birbiriyle ilişkili begin
ve end, birbiriyle aynı hizada ve ayrı satırlar şeklinde yazılmalıdır.
Yanlış : for i := 0 to 10 do
begin // begin, for'la aynı satırda
Doğru : for i := 0 to 10 do
begin
if Şart then
begin
...
end
else
begin
...
end;
Yorum Koyma
* Yorum için //, {} ve (* *)
kullanılır.
* // tek satıra yorum yazmak
için kullanılır.
{} ve (* *) ise blok olarak
yorum koymak için kullanılır, başlangıç ve bitiş arasındaki her şey yorum kabul
edilir. Bunlardan {} yorum yazmak, (* *) de çalışma anında geçici olarak bazı
kodları devre dışı bırakmak için kullanabilirsiniz.
* Koda ne fazla, ne de az,
anlamanız için yeterli olacak kadar yorum ekleyin.
* Eğer düzeltmek istediğiniz
bir koda geçici olarak yorum ekliyorsanız, yorumun başına ??? eklemek iyi
olacaktır. Daha sonra kolayca bu satırları bulup, gerekli düzenlemeleri
yapabilirsiniz.
//???:diğer procedure’u hazırlayınca sıralama kısmını da
düzeltmek gerek.
Lisans Bilgisi Ekleme
Yazdığınız unit’e lisans
bilgileri eklemek istiyorsanız, unit’in en üstüne aşağıdaki yapıda eklenmelidir.
Gerekirse araya aynı formatta yeni satırlar eklenebilir.
{*******************************************************}
{ }
{ Üretim Modülü }
{ }
{ © 2002-2003, delphiturkiye.com }
{ }
{*******************************************************}
OBJECT PASCAL
Boşluklar
Object Pascal boşlukları göz
ardı eder. Object Pascal çok güzel bir dizayna sahip olduğu için çok fazla
boşluk bırakmanız gerekmeyecek, ancak;
* Rutin (procedure, function)
tanımları arasında bir satır boşluk bırakmalısınız.
* Açma parantezi ile bir
sonraki karakter ve kapama parantezi ile bir önceki karakter arasında boşluk
bırakmayın.
Yanlış : CallProc( AParameter
)
Doğru : CallProc(AParameter)
* Kod içerisinde gereksiz
yerlerde ekstra parantezler kullanmayın.
if (i = 15)
then // yanlış, burada paranteze gerek yok.
if (i = 15) or (j = 5) then // doğru, parantezler gerekli
* Noktalı virgülden önce
boşluk bırakmayın.
* Köşeli parantezlerden önce
ve sonra boşluk bırakmayın.
Yanlış : MyInteger :=
MyIntegerArray [ 3 ];
Doğru : MyInteger :=
MyIntegerArray[3];
Ayrılmış Kelimeler (Reserved
Words)
Object pascal'a ait ayrılmış
kelimeler (for, if, begin, end gibi kod içinde özel manası olan kelimeler)
tamamen küçük harflerle yazılmalıdır. Bu kelimeler varsayılan olarak editör
içinde koyu yazı tipi ile gösterilirler.
Procedure ve Function’lar
(Rutinler)
* Rutinlere yaptıkları işi
anlatan manalı isimler verilmelidir. Genelde iyi isimler; bir isim ve bir
fiilden oluşur.
DosyaBul, ProgramiKapat gibi.
* Rutin isimlerini daha kolay
okuyabilmek için kelimelerin baş harfleri büyük yazılmalıdır.
yanlış : procedure
bubiruzunokumasizorrutinismi;
doğru : procedure
BuOkumasiKolayBirRutinIsmi;
* Rutin isimlerinde alt çizgi
kullanılmamalıdır.
Yanlış : procedure
Bu_Yanlis_Bir_Procedure_Ismi;
Parametreler
* Mümkün olduğu kadar, aynı
tipteki parametreler tek bir ifadede toplanmalıdır.
yanlış : procedure
Ornek(Parametre1: string; Parametre2: string; Parametre3: string);
doğru : procedure
Ornek(Parametre1, Parametre2, Parametre3: string);
* Parametrelere manalı
isimler verilmelidir.
* Eğer kategorisel bir
sıralama olabiliyor ise parametrelerin sıralamasını ona göre yapın.
BirProc (Ulke, Bolge, Il,
Ilce : string); gibi.
* Böyle bir kategori yok ise
çok kullanılan parametreden, az kullanılan parametreye doğru yazın. Bir istisna
olarak eğer Sender parametresi varsa daima ilk sırada yazılır.
İsim Çakışmalarını Önleme
Eğer bir rutin birden fazla
unitte tanımlı ise uses kısmında bu unitlerin ikisinin de kullanımı durumunda
oluşabilecek karışıklıkları önlemek için bu rutinleri unit ismi ile kullanmak
gereklidir.
Örnek : FindClose rutini 2
unitte tanımlıdır.
SysUtils.FindClose(SR); veya
Windows.FindClose(Handle);
Değişkenler
* Değişkenlere anlamlı
isimler verilmeli.
* Döngü değişkenleri için
genelde i, j, k harfleri kullanılır.
* Boolean değişkenler
tanımlanırken isimleri (True, False) değerlerini tam manasıyla anlatacak bir
isim olmalı.
* Birden fazla aynı tipte
değişkeni ayrı ayrı satırlarda tanımlamak yerine, tek satırda tanımlanmalı.
var
i: integer;
j: integer;
yerine
var
i, j: integer;
* Eğer gerekli ise lokal
değişkenlere hemen rutinin girişinde ilk değerler atanmalıdır.
* Mümkün olduğu kadar global
değişkenler kullanılmamalı, sadece gerçekten gerekli olduğu durumlarda
kullanılmalıdır. Global değişkenlere tanımlama aşamasında ilk değer ataması
yapılabilir. Eğer gerekli ise bu atamaları tanımlama kısmında yapabilirsiniz.
Ancak atayacağınız değerler 0, nil, ... sıfırlama değerleri ise bu atamaları
yapmayın. Bu atamalar en uygun biçimde Delphi tarafından zaten sıfırlanmaktadır.
Real Tipini Kullanmayın
* Real tipi geriye doğru
uyumluluk için bulunmaktadır. bunun yerine Double tipini kullanın.
Variant ve OleVariant
Çalışma esnasında tipi belli
olmayan verileri tutmak için kullanılırlar ve genelde COM ve veritabanı
programlarında lazım olurlar, bunların dışında pek kullanmayın. Variant'lar
diğer tiplere göre çok daha yavaş çalışırlar.
Variant stringleri Delphi
tipinde tutarken, OleVariant bu stringleri Ole string'lere çevirir (WideChar).
Bunun için COM-based uygulamalarda ve ActiveX geliştirirken OleVariant kullanın.
if İfadesi
* if/then/else şeklinde
kullanılan ifadelerde, gerçekleşmesi daha muhtemel olay then kısmında, daha az
muhtemel olan ise else kısmında yer almalıdır.
* if ifadelerinin okunması
daha zor olduğundan, mümkün olduğu kadar case ifadesi kullanın.
* iç içe if ifadelerini en
fazla 5 seviyeye kadar yapın. Daha fazlasına ihtiyacınız varsa, yapınızı gözden
geçirip daha uygun bir yapıya çevirin.
* Eğer birden fazla şartı
test ediyorsanız, şarları hızlı çalışandan yavaş çalışana doğru dizmeniz daha
iyidir. Mesela şart1 daha hızlı hesaplanıyor ve şart2 biraz daha yavaş
hesaplanıyorsa
if Şart1 or Şart2 then //
şart1 True ise, Şart2'ye bakılmaz.
* Birden fazla şartı test
ediyorsanız ve şart ifadeleri uzunsa, her şartı bir satıra yazmak daha iyi
olacaktır.
if Şart1 and
Şart2 and
Şart3 then
case İfadesi
* case'de ifadeler nümerik
veya alfabetik sıralamada yazılmalıdır.
* her ifadenin uzunluğu 4-5
satırı geçmemesi iyi olur. Eğer bir ifadenin uzunluğu çok fazla ise bunu ayrı
bir procedure veya fonksiyon olarak yazmak daha iyi olacaktır.
* her ifade begin..end
blokları arasına yazılmalıdır.
case İfade of
ifade1 :
begin
...
end;
ifade2 :
begin
...
end;
else
...
end; {case}
with ifadesi
with ifadesi yazımda kolaylık
sağlaması açısından kullanılır. Ancak with ifadesini gerekli yerlerde kullanmalı
ve birden fazla nesne ile kullanmamalısınız.
Yanlış : with Record1,
Record2 do
böyle bir kullanım hem kodu
okuyan kişiyi şaşırtır, hem de hata tespitlerini zorlaştırır.
EndIf, EndCase, EndWith
Object Pascal’da bu ifadeler
yoktur. Bu ifadeler begin..end blokları arasına yazılırlar. Bu ifadeleri
kullanırken, başlangıç ve bitiş bloklarını belirlemek için yorum kullanmalısınız
:
if i > 5 then
begin
...
end; {if} // if bloğunun bitişi
with Query1
do
begin
....
end; {with}
// with bloğunun bitişi
Enumerated Type
Her elemandan önce enumarated
type’i belirten harflerin eklenmesi gerekir. Aşağıdaki örnekte, her elemandan
önce bk harfleri eklenmiştir ve bunlar ButtonKind ifadesinin baş
harfleridir.
Yalnız sadece L veya 1
eklemekten kaçının. Bunlar gösterimde ve bazı yazıcılarda problem çıkartabilir.
TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo,
bkClose, bkAbort, bkRetry, bkIgnore, bkAll);
Exception Handling
Delphi'de genel kural nesneyi
oluşturan yok eder. Eğer bir form veya bir nesne oluşturmuşsanız onu yok etme
görevi de sizindir. Aldığınız kaynakları geri sisteme vermelisiniz. Bunun için
bol bol try..finally bloğu kullanmanız gerekir.
SomeClass1.Create; // oluştur
try
... // bir
şeyler yap
finally
SomeClass1.Free; // SomeClass1 mutlaka yok edilir.
end; {try}
Eğer bir hata oluştuğu zaman
bir işlem yapmak istiyorsanız (genelde hatayı gösterme veya kaydetme gibi)
try..except bloğu kullanmalısınız.
try
....
except
.... // hata oluşursa bu
blok çalışır
end; {try}
Class İsimleri
* Her zaman olduğu gibi
mantıklı isimler verilmelidir. Delphi'de classların başına T harfinin konulması
bir gelenektir. Yani Her class(sınıf) ismi T ile başlamalıdır.
type
TMusteri = class(TObject);
Fields ve Property Access
* Field’ların başına F harfi
eklenmelidir. FYukseklik gibi.
* Tüm fieldlar private
kısmında tanımlanmalıdır.
* property erişimi için
kullanılan metodların başına get ve set kelimeleri eklenmelidir.
property
Yukseklik: Integer read GetYukseklik write SetYukseklik;
* Methodlar alfabetik sırada
sıralanmalıdır. Yani : private – protected – public - published
DOSYALAR
* Projelere anlamlı ve
açıklayıcı isimler verilmelidir. Mesela sistem bilgilerini gösteren bir program
için : SystemInfo.dpr gibi.
* Form isimlerine anlamlı ve
açıklayıcı bir isimden sonra Frm karakterleri ile biten bir isim
verilmedir. Mesela Stok formu için StokFrm.pas gibi.
* Data Modüllere yine
açıklayıcı bir isimden sonra DM karakterleri ile biten bir isim
verilmelidir. Mesela müşteri tabloların yer aldığı data module ise :
MusteriDM.pas gibi.
FORMLAR
* Form isimleri açıklayıcı
bir ön isim ve Form kelimesinin birleşmesinden oluşmalıdır. Mesela Stok formunun
ismi : StokForm, müşteri bilgilerinin girişinin yapıldığı formun ismi :
MusteriGirisForm
* Sadece çok gerekli formlar
auto-create yapılmalıdır. Auto-Create formlar program çalıştığı anda otomatik
olarak oluşturulur ve hafızada yer kaplarlar. Çok gerekli formlar dışındaki
diğer formlar Project Options kısmından Avaible Forms kısmına alınmalıdır.
* Data modullere açıklayıcı
bir ön ekten sonra DataModule kelimeleri eklenmelidir. Mesela müşteri
tablolarının yer aldığı data module için MusteriDataModule gibi.
BİLEŞEN ÖNEKLERİ
Forma koyduğunuz her bileşene
bileşenin türünü gösteren bir önek ve anlamlı isimler vermelisiniz. Aşağıda
bileşenler için önekler yer almaktadır.
Örneğin Vergi nosunun
girileceği Edit’in ismi, başına Edt önekini alarak EdtVergiNo olmalı.
Standard Tab
Önek |
Component |
Mm |
TmainMenu |
Pm |
TpopupMenu |
Mmi |
TmainMenuItem |
Pmi |
TpopupMenuItem |
Lbl |
Tlabel |
Edt |
Tedit |
Mem |
Tmemo |
Btn |
Tbutton |
Chk |
TcheckBox |
Rb |
TradioButton |
Lb |
TlistBox |
Cb |
TcomboBox |
Scb |
TscrollBar |
Gb |
TgroupBox |
Rg |
TradioGroup |
Pnl |
Tpanel |
Cl |
TcommandList |
Additional Tab
Önek |
Component |
Bbtn |
TbitBtn |
Sb |
TspeedButton |
Me |
TmaskEdit |
Sg |
TstringGrid |
Dg |
TdrawGrid |
İmg |
Tımage |
Shp |
Tshape |
Bvl |
Tbevel |
Sbx |
TscrollBox |
Clb |
TcheckListbox |
Spl |
Tsplitter |
Stx |
TstaticText |
Cht |
Tchart |
Win32 Tab
Önek |
Component |
Tc |
TtabControl |
Pc |
TpageControl |
Il |
TımageList |
Re |
TrichEdit |
Tbr |
TtrackBar |
Prb |
TprogressBar |
Ud |
TupDown |
Hk |
ThotKey |
Ani |
Tanimate |
Dtp |
TdateTimePicker |
Tv |
TtreeView |
Lv |
TlistView |
Hdr |
TheaderControl |
Stb |
TstatusBar |
Tlb |
TtoolBar |
Clb |
TcoolBar |
System Tab
Önek |
Component |
Tm |
Ttimer |
Pb |
TpaintBox |
Mp |
TmediaPlayer |
Olec |
ToleContainer |
Ddcc |
TDDEClientConv |
Ddci |
TDDEClientItem |
Ddsc |
TDDEServerConv |
Ddsi |
TDDEServerItem |
Internet Tab
Önek |
Component |
Csk |
TclientSocket |
Ssk |
TserverSocket |
Wbd |
TwebDispatcher |
Pp |
TpageProducer |
Tp |
TqueryTableProducer |
Dstp |
TdataSetTableProducer |
Nmdt |
TNMDayTime |
Nec |
TNMEcho |
Nf |
TNMFinger |
Nftp |
TNMFtp |
Nhttp |
TNMHttp |
NMsg |
TNMMsg |
Nmsg |
TNMMSGServ |
nntp |
TNMNNTP |
npop |
TNMPop3 |
nuup |
TNMUUProcessor |
smtp |
TNMSMTP |
nst |
TNMStrm |
nsts |
TNMStrmServ |
ntm |
TNMTime |
nudp |
TNMUdp |
psk |
TpowerSock |
ngs |
TNMGeneralServer |
html |
THtml |
url |
TNMUrl |
sml |
TsimpleMail |
Data Access Tab
Önek |
Component |
Ds |
TdataSource |
Tbl |
Ttable |
Qry |
Tquery |
Sp |
TstoredProc |
Db |
TdataBase |
Ssn |
Tsession |
Bm |
TbatchMove |
Usql |
TUpdateSQL |
Data Controls Tab
Önek |
Component |
Dbg |
TDBGrid |
Dbn |
TDBNavigator |
Dbt |
TDBText |
Dbe |
TDBEdit |
Dbm |
TDBMemo |
Dbi |
TDBImage |
Dblb |
TDBListBox |
Dbcb |
TDBComboBox |
Dbch |
TDBCheckBox |
Dbrg |
TDBRadioGroup |
Dbll |
TDBLookupListBox |
Dblc |
TDBLookupComboBox |
Dbre |
TDBRichEdit |
Dbcg |
TDBCtrlGrid |
Dbch |
TDBChart |
Decision Cube Tab
Önek |
Component |
Dcb |
TdecisionCube |
Dcq |
TdecisionQuery |
Dcs |
TdecisionSource |
Dcp |
TdecisionPivot |
Dcg |
TdecisionGrid |
Dcgr |
TdecisionGraph |
QReport Tab
Önek |
Component |
Qr |
TquickReport |
Qrsd |
TQRSubDetail |
Qrb |
TQRBand |
Qrcb |
TQRChildBand |
Qrg |
TQRGroup |
Qrl |
TQRLabel |
Qrt |
TQRText |
Qre |
TQRExpr |
Qrs |
TQRSysData |
Qrm |
TQRMemo |
Qrrt |
TQRRichText |
Qrdr |
TQRDBRichText |
Qrsh |
TQRShape |
Qri |
TQRImage |
Qrdi |
TQRDBMImage |
Qrcr |
TQRCompositeReport |
Qrp |
TQRPreview |
Qrch |
TQRChart |
Samples Tab
Önek
|
Component |
Gg |
TGauge |
cg |
TColorGrid
|
spb |
TSpinButton
|
spe |
TSpinEdit
|
dol |
TDirectoryOutline
|
cal |
TCalendar
|
ibea |
TIBEventAlerter |
bimeks borland component database delphi delphi.net delphi dersleri firebird help interbase makale oracle
seminer software sybase veritabanı web
|