( persicsb | 2018. 01. 03., sze – 09:36 )

Eszembe jutott egy gondolat. Nem a fentiekbe akarok belekötni, inkább hozzáfűzni.

Ugyebár létezik a rubber duck debugging nevű dolog.
Meséld el a kollégádnak/egy virágnak/egy kávésbögrének/egy gumikacsának/, hogy mit csinál a kód, meg gondold át, hogy mit kellene csinálnia, és akkor rájön az ember, hogy miért is hibás a kód.
És sok esetben észervettem, magamon is, kollégákon is, hogy boldogan jönnek ide, hogy köszi az ötletet, tényleg működik a módszer, mert rájött, hogy mi a hiba a kódban.
Majd elkezdi mesélni, hogy: "látod, itt az 55-60-ik sorban csinálom azt, hogy...". És mi lenne, ha ezt az 5 sort kiszervezné egy olyan nevű függvénybe, ami pont ezt írja le?
Hasonlóan, amikor egy bonyolult függvényrészletben van hiba, egy jól körülírható, saját névvel rendelkező kódrészletben, akkor az egy code smell: kiszervezhető függvénybe, és a hívóban már csak a magasabb szintű absztrakció látszik - mert erre kíváncsi valójában a hívó, nem a függvény törzsére.
A draw példánál maradva, könnyen lehet, hogy _Franko_ a kérdésemre azt fogja mondani (vagy valami hasonlót):
- ez a függvény a Draw1-Draw3 részben kirajzolja egy sprint hátterét meg körvonalát (akkor miért nem egy ilyen nevű függvényben van ez leírva, ha amúgy saját magadnak így fogalmazod meg)
- ez a függvény az if(state1) részben kirajzolja az overlayt, ha ki kell rajzolni
stb.

Remélem érthető.

Egy nagyon fontos gondolat tartozik még ehhez: a kód kommentelés.
Ugyebár sokan azt várják el, hogy a programozó írja le a kommentben emberi nyelven, hogy mit csinál a kód. Ez feltételezi azt, hogy emberi nyelven a programozó jobban meg tudja fogalmazni azt, mint programozási szerkezetek (metódusok, elágazások stb.) használatával. Miért is gondoljuk azt, hogy ha valaki nem tudja érthetően leírni a kódban, hogy mit cisnál a kód, akkor majd emberi nyelven érthetően tudja leírni?
Pedig általában itt arról van szó, hogy egy absztrakciós szint hiányik: a kommentben leírt emberi nyelvi mondatokat meg kell fogalmazni a kód szintjén is.
Tipikus példa:


// if trader can view this portfolio
if(portfolioIdsByTraderId.contains(traderId)){...}

Hát akkor itt bizony hiányzik egy absztrakciós szint, hiányzik egy fogalomalkotás, egy metódus.
Sokkal jobb,ha ezt írja az ember:


if(trader.canView(portfolio)){...}

Majd szépen, a

Trader.canView

implementáció már megfogalmazza konkrétan, hogy hogyan is dől el, hogy "trader can view this portfolio".

Hasonló elv még, és ide tartozik, spt, valójában erről szól a separation of mechanism and policy is.