Successfully reported this slideshow.
Your SlideShare is downloading. ×

Clean Code / ako nevariť objektové špagety - Martin Razus

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
Veedera_pitch
Veedera_pitch
Loading in …3
×

Check these out next

1 of 47 Ad

Clean Code / ako nevariť objektové špagety - Martin Razus

Download to read offline

O tom, ako sa nestratiť vo vlastnom kóde alebo ako neprísť o priateľov keď čítajú vaše zdrojáky. Aj v dobe objektov, tried a interfaceov je veľmi ľahké navariť z kódu kvalitné špagety. Zopár praktických tipov ako tomu predchádzať.

Vývoju softwaru sa venuje profesne cez 10 rokov, pracoval na mnohých pozíciách vo firmách ako ui42 či Piano Media. Momentálne vedie malú softwarovú firmu so zameraním na webový vývoj. V Prešove organizuje stretnutie WebElement (podobné WEBtlak-u) a podieľa sa na coworkingu Eastcubator Prešov. Rád hľadá jednoduché odpovede na jednoduché otázky a tým zložitým sa radšej vyhýba :)

O tom, ako sa nestratiť vo vlastnom kóde alebo ako neprísť o priateľov keď čítajú vaše zdrojáky. Aj v dobe objektov, tried a interfaceov je veľmi ľahké navariť z kódu kvalitné špagety. Zopár praktických tipov ako tomu predchádzať.

Vývoju softwaru sa venuje profesne cez 10 rokov, pracoval na mnohých pozíciách vo firmách ako ui42 či Piano Media. Momentálne vedie malú softwarovú firmu so zameraním na webový vývoj. V Prešove organizuje stretnutie WebElement (podobné WEBtlak-u) a podieľa sa na coworkingu Eastcubator Prešov. Rád hľadá jednoduché odpovede na jednoduché otázky a tým zložitým sa radšej vyhýba :)

Advertisement
Advertisement

More Related Content

Advertisement

Clean Code / ako nevariť objektové špagety - Martin Razus

  1. 1. Čistý kód alebo ako nevariť objektové špagety
  2. 2. Čo je to čistý kód?
  3. 3. Ideal learning curve tim knowledg e
  4. 4. Real learning curve
  5. 5. Čo je to čistý kód?
  6. 6. Čo je to čistý kód?
  7. 7. Čo je to čistý kód? Rovnaká ● rýchlosť vývoja ● kvalita ● bugovosť (nebugovosť) ● spokojnosť zadávateľa ● radosť programátora Ako pri na začiatku vývoja
  8. 8. Viem písať čistý kód ?
  9. 9. JASNE :)
  10. 10. Varené žaby Rozbité okná Ako sa dostať dole?
  11. 11. I don't know how Prečo ne - písať čistý kód ● veď to funguje ● ale ja to predsa viem prečítať ● toto je kratšie / menej kódu ● ale toto je rýchlejšie ● nestíham !!! ● vštci sú LAMERI len ja som KÓDER
  12. 12. Deadlines ● časový stress != bordel v kóde ● provizórium sa stáva permanentné riešenie
  13. 13. Čo je náš cieľ ● ZNÍŽIŤ WTF FAKTOR ● pochopiť zmysel kód ● orientovať sa v toku behu programu ● zmysluplne debugovať ● neodkladne zaznamenať a lokalizovať chybu ● riadiť error handling dev / production ● obmedziť ukladaniu nekonzistentných dát ● jednoduché pridávanie funkcionality
  14. 14. Ako to dosiahnuť? "Vidím ďalej ako ostatní, lebo stojím na ramenách obrov." Sir Isaac Newton
  15. 15. Problémy ● nevedomosť ● zvyk je železná košeľa ● vlastné ego, ješitnosť
  16. 16. Riešenie ● súbor mnohých pravidiel ● dôraz na detail ● umenie ktoré sa dá naučiť
  17. 17. Coding standards ....
  18. 18. Naming convention ● nevytvárať tajné dohovory, ktoré nie je možné vyčítať z kódu. ● maďarská notácia ○ sName, bAdmin, dPrice, cCustomer ● Capital pre objekty, atď ... ○ $User, $name, $user ??? ● magic functions ○ $this->__call(), $this->__get() not The Da Vinci Code
  19. 19. Princíp najmenšieho prekvapenia Názvy tried, funkcií a premenných ○ majú niesť význam toho, čo vykonávajú ○ nevykonávať to čo nenesú v názve public function getName() { $this->deleteParent(); return $this->name; }
  20. 20. nepoužívať skratky $adm_usr $admin_user $pr_pg $print_page $glum $user Princíp najmenšieho prekvapenia
  21. 21. DRY (Don't repeat yourself)
  22. 22. DRO (Don't repeat others) ● pýtať sa ● komunikovať s kolegami ● checknúť zdrojáky! ● nebyť lenivý ● nepísať novú funkciu / classu ak sa dá stará prispôsobiť
  23. 23. /** Komentáre **/ Okomentovaný kód Okomentovaný kód == dobrý kód (Okomentovaný kód == dobrý kód) == false
  24. 24. /** Komentáre **/ Komentár duplikuje názov premennej /** * list of items */ private $item_list
  25. 25. /** Komentáre **/ Komentár duplikuje názov funkcie /** * Add item decorator */ public function addItemDecorator(EshopDecoratorAbstract $decorator) Komentár duplikuje názov volanej funkcie // order is paid if ($order->isPaid())
  26. 26. /** Komentáre **/ ● Zakomentovaný kód ○ Vymazať – stále ostane v repozitároch ○ (svn, mercurial, git ... ) ● Vtipné, injektívne odkazy kolegom ○ Vymazať ! – povedať pri káve, zavolať, poslať mail ... //no need to save the object - it has not been changed //DBOF::saveObjectFactory();
  27. 27. Funkcie ● funkcia má vykonávať len jednu vec ● mala by byť malá ● granulovať logické celky ● v jednej funkcii iba jedna podmienka
  28. 28. Funkcie - granulácia public function newEventAction() { $this->form = new My_Form_Event_New(); $this->form->addCSRFProtection(); $this->view->event_form = $this->_form; if ($this->_request->isPost()) { $data = $this->_getAllParams(); if($this->form->isValid($data)) { $values = $this->form->getValues(); $event = new Event($values); $event->save(); } } }
  29. 29. Funkcie - granulácia public function newEventAction() { $this->prepareForm(); if ($this->_request->isPost()) { $this->submitForm(); } }
  30. 30. Funkcie - granulácia private function prepareForm() { $this->form = new My_Form_Event_New(); $this->form->addCSRFProtection(); $this->view->event_form = $this->form; } private function submitForm() { $data = $this->_getAllParams(); if($this->form->isValid($data)) { $values = $this->form->getValues(); $event = new Event($values); $event->save(); } }
  31. 31. Funkcie - argumenty ● minimalizovať počet argumentov ● najlepší počet argumentov = 0 ○ granulovať funkciu na samostatnú triedu ● settery a ”void” funkcie by mali vracať inštanciu rodičovského objektu public function sendMessage($message, $subject, $users_ids, $item_id, $item_type_id = null, $template_id = null) { // do something }
  32. 32. Funkcie - argumenty class Message { public function setMessage($message) { $this->message = $message; return $this; } public function setSubject($subject) { $this->subject = $subject; return $this; } public function setReceiversIds($users_ids) { $this->users_ids = $user_ids; return $this; } public function send() { // send message } }
  33. 33. Funkcie - argumenty ● Volanie funkcie ”po starom” $user->sendMessage($message_text, $subject, $to_user_id, $item_id, $item_type_id, $template_id); $user->sendMessage($message_text, $subject, $to_user_id, null, null, $template_id); $user->sendMessage($message_text, null, null, $item_id, null, $template_id); ● Volanie funckie ”po novom” $message = new Message(); $message ->setMessage($message_text) ->setSubject($subject) ->setReceiversIds($users_ids) ->send();
  34. 34. Funkcie logické argumenty porušujú základný predpoklad public function makeAdmin($bool = true) { $this->role = 'admin'; if ($bool == false) { $this->role = 'user'; } $this->save(); } public function makeAdmin() { $this->role = "admin"; return $this->save(); } public function removeAdmin() { $this->role = "user"; return $this->save(); }
  35. 35. Funkcie - vstup -výstup ● Funkcia môže vracať iba hodnoty jedného typu ● Pokiaľ neide o FACTORY public function getUsers($sql = false) { $select = $this->select(); $select->from('users'); if ($sql) { return $select; // vráti Zend_Db_Select } return $this->fetchAll($select); // vráti Zend_Db_Table_Rowset
  36. 36. throw ! Exceptions ● Nevracať false/null, pokiaľ je očakávaný objekt ● Vyhodiť výnimku public function getUser() { $user = Users_Table::getInstance()->find($this->user_id); return $user; } $user = $event->getUser(); if ($user == false) { // BLA BLA BLA - Handle error } else { $user->sendInfoMail(); }
  37. 37. throw ! Exceptions ● Nevracať false/null, pokiaľ je očakávaný objekt ● Vyhodiť výnimku public function getUser() { $user = Users_Table::getInstance()->find($this->user_id); if (empty($user)) { throw new Users_Exception('No user exists'); } return $user; } $user = $event->getUser(); $user->sendInfoMail();
  38. 38. Neriadené strely čo ak sa stane nemožné ● každý switch musí mať default ● vyhodenie Exception v potrebnom okamihu ● magická funkcia ktorá akceptuje čokoľvek ○ riziko preklepu
  39. 39. Pravidlo jeného ”switch” - u ● Príkaz switch / case pretaviť do najlbšej časti systému ● Používať jedine na vytváranie polymorfných objektov vo factory ● Inak vzniká riziko opakovania toho istého switch / case rozhodovania v inej časti systému ● Predchádza sa tým logickému zdvojeniu kódu
  40. 40. Všetko toto VYMAZAŤ !!! Mŕtvy kód = Dead man ● Funkcie (triedy, moduly ... ), ktoré nikto nevolá ● Vetvy podmienok, ktoré nie sú nikdy vykonané ● Vetvy switch / case ktoré nikdy nenastanú ● Catch príkazu try, ktorý nikdy nevykoná throw exception ● Premenné ktoré nie sú nikde použité
  41. 41. Čitateľnosť kódu Zapúzdriť podmienky do funkcií if ($event->start_date < $now && count($event->getBookings) > 0) { $event->delete(); } if ($event->canBeDeleted()) { $event->delete(); }
  42. 42. Čitateľnosť kódu Vyhýbať sa negatívnym podmienkam if(!$result->isValid()) { $this->showError(); } else { $this->saveData(); } if($result->isValid()) { $this->saveData(); } else { $this->showError(); }
  43. 43. Čitateľnosť kódu Nepoužívať skrátený if $result = ($value == 10) ? $value++ : 0; if ($value == 10) { $result = $value++; } else { $result = 0; } return (isset($_POST['name'])) ? "Form" : ((!$sqlData) ? $data[$sqlVar] : '');
  44. 44. Závislosť na prostredí ● kód nesmie byť natvrdo závislý na prostredí / nastevení prostredia ● namiesto toho použiť konštanty if (APPLICATION_ENVIRONMENT == 'production') { $url = 'www.example.com'; } else { $url = dev.example.com'; } $url = CONSTANT_URL;
  45. 45. Zanechajte táborisko čistejšie, ako ste ho našli! Skautské pravidlo ● V každom projekte je potrebné robiť kontinuálny refactoring ● Pri každom zásahu do kódu urobte predchádzajúci kód trochu čistejším ● zmena názvu premennej / funkcie ● granulácia funkcie na niekoľko menších ● odstránenie krátkeho ”if” - u …
  46. 46. veľká vďaka všetkým autorom Bibliografia ● Čistý kód - Robert C. Martin ○ (Clean Code: A Handbook of Agile Software Craftsmanship) ● Co programátory ve škole neučí - Petr Paleta ● Z kodéra vývojářem - Mike Gunderloy ○ (Coder to Developer) ● Programátor pragmatik - Andrew Hunt, David Thomas ○ (The Pragmatic Programmer)
  47. 47. priestor na diskusiu, súboje, prestrelky :) created by Martin Rázus 2012 Ďakujem za pozornosť

×