печально быть антисоциальным - Nedrošības zīmes

Jan. 19th, 2004

09:50 am - Nedrošības zīmes

Previous Entry Add to Memories Tell A Friend Next Entry

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.

(16 comments | Leave a comment)

Comments:

From:[info]mulders
Date:January 19th, 2004 - 10:04 am
(Link)
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
(Reply to this) (Thread)
[User Picture]
From:[info]smejmoon
Date:January 19th, 2004 - 10:13 am
(Link)
Lūdzu piemēru "taapat programmeetaajs nekad nespees uzraxtiit taadu kodu bez komentiem lai to saprastu citi programmeetaaji... ", kur blakus ir labs komentārs.
(Reply to this) (Parent) (Thread)
From:[info]grrr
Date:January 19th, 2004 - 10:34 am
(Link)
tad komentus vajag vai nē? :D
(Reply to this) (Parent)
From:[info]mulders
Date:January 19th, 2004 - 12:12 pm
(Link)
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!
(Reply to this) (Parent) (Thread)
[User Picture]
From:[info]smejmoon
Date:January 19th, 2004 - 05:11 pm
(Link)
Es domāju konkrētu koda piemēru. :)

Labs kods + labi komentāri, ko nevar saprast bez tiem.
(Reply to this) (Parent)
From:[info]skalpelis
Date:January 19th, 2004 - 10:48 am
(Link)
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

(Reply to this) (Thread)
[User Picture]
From:[info]smejmoon
Date:January 19th, 2004 - 11:26 am
(Link)
: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.
(Reply to this) (Parent) (Thread)
From:[info]skalpelis
Date:January 19th, 2004 - 11:45 am
(Link)
Es zinu gan, kāda ir atšķirība, tāpēc arī ++a, nevis a++ ;p
(Reply to this) (Parent)
From:[info]mulders
Date:January 19th, 2004 - 12:13 pm
(Link)
a shii vot konstrukcija man baigi patiik arii manaa miiljajaa JAVA :)

var forhsi nokodeet taa lai citi nesaprot :)
(Reply to this) (Parent)
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!".
(Reply to this) (Thread)
From:[info]mulders
Date:January 19th, 2004 - 12:46 pm
(Link)
a ir redzeeti komentaari pie aizdomiigaam rinjdinjaam... no seerijas

object.doSmething(); // why this is here?
(Reply to this) (Parent) (Thread)
From:[info]skalpelis
Date:January 19th, 2004 - 12:48 pm
(Link)
obj.doTheMagicTrick(); // if it works, don't touch it!

;)
(Reply to this) (Parent) (Thread)
From:[info]mulders
Date:January 19th, 2004 - 01:01 pm
(Link)
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 :)
(Reply to this) (Parent) (Thread)
(no subject) - [info]agronoms
[User Picture]
From:[info]smejmoon
Date:January 20th, 2004 - 02:24 pm
(Link)
Danu, viens no viņa šefiem to nobrīčoja pa avīzēm ;-)
(Reply to this) (Parent)
From:[info]basilia
Date:January 21st, 2004 - 04:13 pm
(Link)
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
(Reply to this)