09:50 am - Nedrošības zīmes
Kad redzu setterus, getterus vai komentārus, sāku uztraukties, jo tā ir zīme sliktam kodam. No sākuma nesapratu kapēc, jo šie pričendāļi ir radīti labai koda uzturēšanai.
Mēģinot tos attaisnot, sapratu, ka lietošana ir vēlama un pieļaujama divās vietās:
- Noteikti to jādara pie moduļu interfeisu apraksta. Vietās, kur tevis radīto kodu izmantos programmētāji no citām komandām vai organizācijām.
- Ja jau rakstīšanas laikā jūt, ka neskaidrība ir liela; ka kāds koda gabals būs tūlīt jāpārraksta, tad tā ir vieta komentāriem. Var uzmest skici un iet gulēt, tad otrā dienā ar skaidru galvu satīrīt. Tāpat arī dažreiz izmanto setterus, getterus, ja ir skaidrs, ka no primitīvajiem tipiem pāries uz klasēm, bet nemaz nav skaidrs kā tas tiks darīts.
Šīs nedrošības zīmes parasti ir sliktam kodam.
Par aksesoriem:
- Enkapsulāciju nevajadzētu uztvert kā likumu, ka nevienam objekta atribūtam nedrīkst piekļūt pa tiešo. Ja ir nepieciešamība mainīt kādu noteiktu atribūtu, tad jāļauj to darīt. Lielākoties tie ir datu objekti, kuri grupē datus, bet neko daudz ar tiem neveic.
-
Tell, don't ask. Ja ir kas jādara ar datiem, kas atrodas citā objektā, tad liec tam objektam veikt darbu. Ja viņam šīs funkcionalitātes nav, bet Tev ir - atdod to viņam.
class LittleGnome:
def __init__(self):
self.pouch = Coins(10)
class Troll:
def howMuch(self, gnome):
self.pouch = gnome.pouch
return self.countCoins(self.pouch)
def countCoins(self, pouch):
return pouch.ammount()
class LittleGuy:
def __init__(self):
self.pouch = Coins(10)
def howMuch(self):
return self.countCoins(self.pouch)
def countCoins(self, pouch):
return pouch.ammount()
class GoodCop:
def howMuch(self, guy):
return guy.howMuch()
- Mūsdienu valodās, jau ir iebūvēta
property iespēja, kas automātiski rada aksesorus, ja vēlāk būs nepieciešams mainīt to funkcionalitāti.
Par komentāriem
- Komentāru vietā jāraksta saprotams kods.
- Objektu nosaukumiem jānorāda uz to lomu konkrētajā vietā.
Data, Info, Manager, Stuff
nav sakarīgi nosaukumi. Dodot nosaukumus nav jābūt formāliem, ja kāds piedauzīgs vārds palīdzēs atcerēties jēgu - jo labāk.
- Funkciju (metožu) nosaukumiem jāizskaidro to rīcība. Ja f-ja sākās ar
get
, tad tai nav blakusefektu, ja tā sākas ar
is
, tad tā atgriež
boolean vērtību. Arī funkciju argumentiem jāpalīdz saprast, kādā secībā tie jānodod, kuri ir obligāti un kuri izmaina nodoto objektu.
Šeit gan jāatgriežās pie
Tell, don't ask. Labāk
englarge(something, by=3)
vietā
something.enlarge(by=3)
.
- Kontroles struktūras jāraksta skaidri un saprotami:
//nevis
if (++a)
{
a <<= 1;
}
else
{
a = 0;
}
return a;
//bet
a = a + 1;
if (a == 0)
return 0;
return a*2;
Kur komentāri ir nepieciešami:
- Ja tiek sagaidīts, ka kods tiks tikai saukts. Piemēram no bibliotēkas.
- Ja tiek saukts svešs, slikti dokumentēts kods.
- Ja tiek izmantots sarežģīts, komplekss algoritms. Vēlams ielikt atsauci uz literatūru/dokumentāciju, kur tas ir izskaidrots. Ja ir atkāpes no kāda klasiska algoritma, tad arī to jāieliek komentāros.
- Ja ir veikta optimizācija un upurēta koda skaidrība. (Kas ir jādara praktiski Nekad!)
- Ja pašam nav skaidrs, kā tika panākts rezultāts. Piemēram, prototips bez testiem.
- Komentāri ir jauki valodās/vidēs, kas atbalsta
docstringus.
- Zema līmeņa valodās kā assembly, kur ir grūti lasāmi komandu nosaukumi. Tomēr arī tur var izvēlēties gana saprotamus mainīgo un apakšprogrammu nosaukumus.
Tāda ir mana pieredze galvenokārt strādājot nelielā komandā un sadarbojoties koda līmenī ar programmētājiem citās valstīs. Lielākoties izmantoju C++ un Python.
man pieredze raada ka visi kas raxta C++ juutaas baigie \m/ un raxta taadas konstrukcijas, ka peec tam vari godiigi noshauties!
taapat programmeetaajs nekad nespees uzraxtiit taadu kodu bez komentiem lai to saprastu citi programmeetaaji... a ja vot komentaaru uzraxta normaalaa valodaa, tad ir ceriiba ka citi to sapratiis! iipashi ja tas ir ieksh c++ kur katram ir savs "stils" un tad ej un saproti kas kur ar ko ir domaac!
piekriitu ka labaak raxtiit primitiivi bet skaidri nevis izmantojot superpuper konstrukcijas ar kuraam jaa var uzraxtiit baigo algoritmu 1aa rindinjaa, bet kuru arii pac nesapratiisi peec naakamaas piipauzes!
cienu komentaarus kas apskaidor input un output parametrus pirms funkcijaam un nevis formaa
// sourcePath - path to the source
bet krietni informatiivaakus
just my 2 cents
Lūdzu piemēru "taapat programmeetaajs nekad nespees uzraxtiit taadu kodu bez komentiem lai to saprastu citi programmeetaaji... ", kur blakus ir labs komentārs.
From: | grrr |
Date: | January 19th, 2004 - 10:34 am |
---|
| | | (Link) |
|
tad komentus vajag vai nē? :D
jebkura funkcija kuras inputs ir sarezhgjiita predefineeta struktuura, kas var mainiities atshkjriiibaa no kontexta...
tb viena un taa pati struktuura (teixim FDO koks)... it kaa var meegjinaat un skatitiies funkcijaa kuraa vietaa kursh parametrs nodefineejas, bet ja pirms funkcijas ir normaalaa valodaa uzmests shii koka sagaidaamaa struktuura, tad nav jaaburaas cauri funkcijas baigaakajiem vipendrjozhiem lai saprastu kas notiek... kaa arii atrast intereseejosho koka zara apstraadi tad var daudz vieglaak!
kaut kaads tur
doSomething(param1, param2) kur param ir primitiivi, to jau toch nav jeega komenteet... a vot neprimitiivu struktuuru gadiijumaa - nefiga! ij ne vienmeer tu vari sho struktuuru kaa objektu defineet... iipashi ja struktuura pati ir dinamiska!
Es domāju konkrētu koda piemēru. :)
Labs kods + labi komentāri, ko nevar saprast bez tiem.
Ja reiz par pythonu, tad docstrings īstajā vietā ar īsto tekstu ienes lielāku skaidrību nekā daudz komentāru. Īpaši tais gadījumos, ja tev svešo kodu ir tikai jāizmanto, nevis jāpārraksta.
Cita starpā, tevis dotais piemērs par a*2:
return ++a*2; // cik ir 0*x? ;p
:P ja godīgi man besī, ja cilvēki, kas nezin kāda atšķirība starp ++i un i++ tos daudz lieto. bet labs piemērs.
Es zinu gan, kāda ir atšķirība, tāpēc arī ++a, nevis a++ ;p
a shii vot konstrukcija man baigi patiik arii manaa miiljajaa JAVA :)
var forhsi nokodeet taa lai citi nesaprot :)
From: | (Anonymous) |
Date: | January 19th, 2004 - 12:34 pm |
---|
| | | (Link) |
|
izņemot pitona """...""" man citu kodā netīk komentāri, kuri rakstīti automātiskās dokumentācijas ģenerēšanas vajadzībām. tas liek domāt, ka komentārs varēja arī nebūt, kods iestiepjas tūkstošos rindiņu. kad ir nokomentēts viss kods, tu vairs nezini nevienu sarežģītu vai interesantu vietu, kurai jāpievērš uzmanība, kad skrien pa diagonāli cauri. tad jau viss kods sāk likties sarežģīts.
jā, doma par komentēšanu, lai pēc izgulēšanās zināt kur un ko darīt, ir trāpīga. kad zinu, ka rakstu nepareizā vietā, tad ierakstu piemēram "Pārnes citur jau rīt!".
a ir redzeeti komentaari pie aizdomiigaam rinjdinjaam... no seerijas
object.doSmething(); // why this is here?
obj.doTheMagicTrick(); // if it works, don't touch it!
;)
es zinu, ka veel tagad Austraalijas lielaakajaa bankaa straadaa mans kods ar kometnaariem
// this code is secret NASA code
// used in NASA space stations to cache the data about Mars and other
// space objects :)
cewl :)
Danu, viens no viņa šefiem to nobrīčoja pa avīzēm ;-)
cepuri nost gudro priekshaa. Es buushu izaugusi, kad sapratiishu, par ko Juus runājat.
manaa teiktajaa nav ne druskas no ironijas, tikai bezgaliiga veelme maaciities