Delphi Kodo Standartas
Paskutinis keitimas: 2004-11-04
Parengė GoniX
Šis dokumentas gali būti laisvai platinamas ir/ar naudojamas, kol už tai neimamas joks mokestis. Tam jis ir parengtas. Jei pastebėjote klaidų arba jei norite pasiūlyti patobulinimą, galite rašykite man.
Turinys
Įvadas
Standarto svarba
Kiekvienas individualus programuotojas dažniausiai rašo kodą taip, kaip jam atrodo teisingiausia ir įskaitomiausia. Tačiau kitam žmogui perskaityti kito visiškai kitokiu stiliumi parašytą kodą gali būti gana sudėtinga. Kadangi 100% nusistovėjusio standarto programavime nėra ir, tikriausiai, negali būti, aš siūlau vieną iš variantų.
Standartų pliusai
- Programuotojai gali pažiūrėti į bet kurią kodo vietą ir suprasti kas ten vyksta
- Nauji žmonės gali greičiau įsijungti į projektą
- Naujokams nebereikia išsiugdyti savo stiliaus ir ginti jo visą gyvenimą
- Naujokams nebereikia kartoti klaidų
- Žmonės daro mažiau klaidų pastovioje aplinkoje
- Programuotojai turi bendrą priešą :-)
Standartų minusai
- Standartai yra kvaili, nes paptastai sudaromi žmonių, kurie nieko nesupranta
- Standartai yra kvaili, nes yra ne tai ka aš darau
- Standartai sumažina kūribingumą
- Standartai nereikalingi, kol žmonės yra pastovūs
- Žmonės vistiek jų nesilaiko
- Standartai gali būti NIH (not invented here) priežastimi, nes naujas/pasiskolintas kodas nesusilies su naudojamu standartu
Literatūra
Vardai
Vardas turi tikti
Vardus stenkitės sudaryti, kad jie atspindėtų funkcijos, klasės, metodo, kintamojo paskirtį.
Kalba
Vardai (jei įmanoma) turėtų būti anglų kalba.
Argumentai
Anglų kalbą, tikriausiai, supranta visi programuotojai. Net jei kodas skaitomas tik ribotam kiekiui programuotojų, kurie tikrai supranta jūsų pasirinktą kalbą, vistiek rekomenduojama programavime vartoti anglų kalbą.
Santrumpos
Jei varde reikia naudoti santrumpą kaip HTML, URL, ir t.t. nerašykite jo viso didžiosimis raidėmis. Elkites su juo, kaip su paprastu žodžiu.
Argumentai
Dažniausiai sunkiau suprasti sutrumpinimą, kai jis yra visas didžiosiomis raidėmis (ypač jei po jo eina kitas žodis prasidedantis didžiąja)
Pavyzdys
Neteisingai:
procedure MyXVZ;
Teisingai:
procedure MyXvz;
Klasės
- Klasės vardo pirma raidė turėtų būti "T"
- Kiekvieną žodį pradėkite didžiąja raide, likusią dalį mažosiomis
- Nenuadokite žemutinių brūkšnių ("_")
Argumentai
- Šiuo standartu parašytas VCL, todėl nereiktų jam priešintis
Pavyzdys
type
TSomeObject = class(TObject);
Rekomenduojama, kad klasės vardas būtų daiktavardis.
Metodai
- Kiekvieną žodį pradėkite didžiąja raide, likusią dalį mažosiomis
- Nenuadokite žemutinių brūkšnių ("_")
Argumentai
- Daugelis programuotojų šį būdą pripažysta geriausiu kompromisu
Pavyzdys
TSomeObject = class(TObject)
public
procedure DoIt;
pricedure HandleError;
function GetValue: integer;
end;
Rekomenduojama, kad metodo vardas būtų reikštų veiksmą.
Metodų parametrai
- Turi prasidėti raide "a"
- Kiekvieną žodį pradėkite didžiąja raide, likusią dalį mažosiomis
- Nenuadokite žemutinių brūkšnių ("_")
- "a" raidė turi būti visada prieš "p" ar "r"
Argumentai
- Padeda išvengti konfliktų tarp klasės atributų ir metodo argumentų
- Galima naudoti panašius vardus kaip ir klsės vardas
- Visada aišku, kurie kintamieji yra perduoti kaip parametrai
Pavyzdys
TSomeObject = class(TObject)
public
procedure MyMethod(AFooBar: TFooBar);
end;
Klasių atributai
- Turi prasidėti raide "f"
- Kiekvieną žodį pradėkite didžiąja raide, likusią dalį mažosiomis
- Nenuadokite žemutinių brūkšnių ("_")
- "f" raidė turi būti visada prieš "p" ar "r"
Argumentai
- Padeda išvengti konfliktų tarp klasės atributų ir metodų, kurie dažniausiai turi panašius vardus
- Iš kintamojo vardo galima nusakyti jo scope
Pavyzdys
TSomeObject = class (TObject)
public
function Count: integer;
private
fCount: integer;
fpMessage: PChar;
end;
Steko kintamieji
- Tik mažosios raidės
- Žodziams atskirtu naudokite žemutinį brūkšnį ("_")
Argumentai
- Iš kintamojo vardo galima nusakyti jo scope
Pavyzdys
procedure TSomeObject.DoIt;
var
foo_bar: TFooBar;
index: integer;
begin
...
end;
Globalūs kintamieji
- Kintamojo vardas turi prasidėti raide "g"
- Kiekvieną žodį pradėkite didžiąja raide, likusią dalį mažosiomis
- Nenuadokite žemutinių brūkšnių ("_")
- "g" raidė turi būti visada prieš "p" ar "r"
Argumentai
- Iš kintamojo vardo galima nusakyti jo scope
Pavyzdys
int gErrorNumber;
Globalios konstantos
- Tik dodžiosios raidės
- Žodžiams atskirti naudokite žemutinį brūkšnį ("_")
Argumentai
- Tai labai aiškiai parodo, kad reikšmė yra nepakeičiama
Pavyzdys
const A_GLOBAL_CONSTANT = 5;
Rodyklės (pointers)
- Turi prasidėti raide "p"
- Kiekvieną žodį pradėkite didžiąja raide, likusią dalį mažosiomis
- Nenuadokite žemutinių brūkšnių ("_")
Argumentai
- Iš kintamojo vardo iš karto galima numatyti, kad jis yra rodyklė
Pavyzdys
var pName: ^string;
Adresai (references)
- Turi prasidėti raide "r"
- Kiekvieną žodį pradėkite didžiąja raide, likusią dalį mažosiomis
- Nenuadokite žemutinių brūkšnių ("_")
Argumentai
- Iš kintamojo vardo iš karto galima numatyti, kad jis yra adreses (reference)
Pavyzdys
procedure ChangeValue(var arFooBar : TFoobar);
Statiniai kintamieji
- Kintamojo vardas turi prasidėti raide "s"
- Kintamojo vardo kiekvienas žodis turi prasidėti didžiąja raide
- "s" raidė turi būti visada prieš "p" ar "r", bet po "m", "a", "g"
Argumentai
- Iš kintamojo vardo galima nusakyti jo scope
Pavyzdys
TSomeObject = class(TObject)
{
class var
sCount : integer;
}
Delphi funkcijos/procedūros
- Kiekvieną žodį pradėkite didžiąja raide, likusią dalį mažosiomis
- Nenuadokite žemutinių brūkšnių ("_")
Argumentai
- Daugelis programuotojų šį būdą pripažysta geriausiu kompromisu
Pavyzdys
procedure MyFunction();
begin
end;
Pascal funkcijos/procedūros
- Tik mažosios raidės
- Žodziams atskirtu naudokite žemutinį brūkšnį ("_")
Argumentai
- Taip Pascal funkcijų ir procedūrų vardai tampa išskirtiniai tarp kitų vardų
Pavyzdys
procedure my_procedure();
begin
end;
Tipu vardai
- Kiekvieną žodį pradėkite didžiąja raide, likusią dalį mažosiomis
- Nenuadokite žemutinių brūkšnių ("_")
- Gale drašykite žodį "Type"
- Jei tipas yra rodyklė (pointer) pirma raidė vardo turi būti "P"
Argumentai
- Žodis "Type" leidžia suprasti, kad tai nėra klasė
Pavyzdys
type
ErrorNumberType = integer;
PString = ^string;
Formavimas
Atitraukimas/Tarpai/Tab'ai
- Naudokite 4 arba 3 tarpus atitraukimui
- Nenaudokite tab'ų, naudokite tarpus. Daugelis editor'ių naudoja tarpus vietoj tab'ų
- Tab'ai turėtų būti nustatyti 8 tarpų pločio. Nestatykite kitokio pločio, vietoj to naudokite tarpus
- Atitraukite tiek kartų kiek reikia, bet ne daugiau. 4 ar 5 lygių paprastai turėtų užtekti. Jei reikia daugiau tikriausiai verta perorganizuoti kodą
Argumentai
- Tab'ai nenaudojami todėl 8 tarpų pločio atitraukimas labai apriboja atitraukimo lygių skaičių. Kai kurie editor'iai leidžia nustatyti tab'o plotį, bet šis nustatymas yra lokalus ir jei kas pabando atspausdinti kodą ar peržiųrėti jį su kitu editor'iumi vaizdas visiškai iškraipomas
- Kai žmonės naudoja skirtingus tab'ų pločius, kodo dažniasuiai neįmanoma perskaityti, todėl tarpai yra tinkamesni nei tab'ai
Pavyzdys
procedure proc()
begin
if (something bad) then
begin
if (another thing bad) then
begin
while (more input) do
begin
end;
end;
end;
end;
Eilutės ilgis
- Visada kada įmanoma eilutė neturėtų būti ilgesnė nei 80 simbolių
Argumentai
- Kodą daug lengviau skaityti, kai nereikia slankioti (scroll'inti)
- Nors beveik kiekvienas dabar turi palyginti didelį monitorių, bet platesnių langų mažiau telpa ekrane, o daugiau langų yra geriau už platesnius langus
- Kad ir kaip keista, bet dar yra žmonių, kuriems tenka peržiųrėti, spausdinti, etc. kodą konsolėje, kur eilutės ilgis yra ribotas ir nevisur eilutės nukeliamos
Skliausteliai () su funkcijomis ir keyword'ais
- Tarp keyword'o (if, for, while) ir sklaustelio turi būti tarpas
- Trap funkcijos pavadinimo ir sklaiustelių neturi būti tarpo
- Tarp sklaustelio ir funkcijos/keyword'o parametrų gali būti tarpas, jei tai palengvina kodo skaitomumą
Argumentai
- Keword'ai nėra funkcijos, todėl po jų turi būti naudojamas tarpas, kad jie būtų išksiriami
Pavyzdys
if (something) then
begin
end;
while (something) do
begin
end;
Delete(s1, 0, 5);
Skliausteliai []
- Tarp skliaustelių ir kintamojo neturi būti tarpo
- Tarp sklaustelio ir parametrų gali būti tarpas, jei tai palengvina kodo skaitomumą
Argumentai
- Kodas daug lengviau skaitomas kai [] sklausteliai yra prie kintamojo
Pavyzdys
procedure TSomeObject.DoIt;
var
name: string;
begin
pName[0] = #0;
end;
begin ir end
Iš dviejų pagrindinių būdų, pirmasis yra tinkamesnis:
Argumentai
- Kyla nemaži ginčai, kuris iš šių būdų yra geresnis, bet pirmasis būdas truputi laimi
If Then Else formavimas
Nors tai priklauso nuo programuotojo, bet vienas priimtiniausių būdų yra šis:
if (condition) then // komentaras
begin
...
end
else if (condition) then // komentaras
begin
...
end
else // komentaras
begin
...
end;
case of formavimas
Pavyzdys
case Val of
1: ...
2: ...
end;
Operatoriai
- Visada iš abiejų pusių palikite po tarpą aplink visus lyginimo, priskyrimo ir matematinius (:=, =, <>, <, >,+, -, *, mod, etc.) operatorius
- Prieš kablelį atskiriantį funkcijos/proceduros parametrus neturi būti tarpo
- Po kablelio atskiriančio funkcijos/proceduros parametrus turi būti tarpas
- Nenaudokite kablelio keliems kintamiesiems aprašyti. Aprašykite kiekvieną atskiroje eilutėje
Viena išraiška vienoje eilutėje
Visada rašykite tik vieną išraišką veinoje eilutėje, nebent išraiškos yra viena su kita labai atrimai susijusios. pastaruoju atvėju nepaminrškite padeti papildomą tarpą.
Taip pat visada aprašykite tik vieną kintamajį vienoje eilutėje.