Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ti, tvoj kod i ja

Ti, tvoj kod i ja

Uz pomoc npm, composer, gem, pip i mnogih drugih package manager-a, danas, više nego ikad, lako je da nađemo odgovarajuću biblioteku.

Problem kod većine tih biblioteka jeste to što se one bave samo jednim delom problematike: funkcionalnošću, zapostavljajući još jedan veoma bitan deo razvoja: developera koji implementira tu biblioteku.

Da li ste sebe ikada uhvatili u 3 ujutru, skrolujući kroz stranice i stranice dokumentacije, želeći da ste sami napisali komad koda, umesto što ste potrošili vreme na implementiranje tuđeg?

Tokom ovog predavanja proći ćemo kroz par OOP principa i design pattern-a koji će drastično smanjiti potrebno vreme kada neko implementira vaš kod i takođe poboljšati kvalitet vašeg koda.

Bogdan Habic

July 21, 2015
Tweet

More Decks by Bogdan Habic

Other Decks in Programming

Transcript

  1. Bogdan Habić • Ovaj desno • Naučio da priča sa

    oko 3 godine i od tada ne prestaje • Misli da je kul ispao na ovoj slici
  2. Ovih dana • Radi produktivne stvari (kao što se može

    videti) • Bavi se programiranjem 5 godina • Misli da je sve ovo veoma smešno • Drago mu je što je ovde, tako da:
  3. function doWork2(idLinije) { httpObject = GetXmlHttpObject(); if (httpObject != null)

    { var url = "comboLinije.php" //url = url + "?idLinije=" + idLinije; //url= url + "&smer" + smer; url = url + "?kodLinije=" + idLinije httpObject.open("GET", url ,true); httpObject.send(null); httpObject.onreadystatechange = setOutput2; } }
  4. DRY

  5. • Samo jedan nivo indentacije • Ne koristiti ELSE •

    Value objects (wrap all primitives) • First class collections • Jedna -> po liniji • Ne skracuj • Svi entiteti da budu što manji • Nijedna klasa da nema više od dva atributa • Tell don’t ask
  6. interface StringDecorator { /** * Decorates the string. * *

    @param string $string * @return string */ public function decorate($string); }
  7. abstract class RegexDecorator implements StringDecorator { protected $regularExpression; protected $replacement;

    public final function __construct() { $this->regularExpression = $this->getRegularExpression(); $this->replacement = $this->getReplacement(); } public abstract function getRegularExpression(); public abstract function getReplacement(); protected function replace($string) { return preg_replace($this->regularExpression, $this->replacement, $string); } public function decorate($string) { return $this->replace($string); } }
  8. abstract class RegexDecorator implements StringDecorator { protected $regularExpression; protected $replacement;

    public final function __construct() { $this->regularExpression = $this->getRegularExpression(); $this->replacement = $this->getReplacement(); } public abstract function getRegularExpression(); public abstract function getReplacement(); protected function replace($string) { return preg_replace($this->regularExpression, $this->replacement, $string); } public function decorate($string) { return $this->replace($string); } }
  9. • Developer je forsiran da inicijalizuje atribute • Developer zna

    tipove parametara • Vi znate tip povratnih podataka • Jasno je
  10. trait StringDecoratorTrait { public function decorate($string) { foreach($this->getDecorators() as $decorator)

    { $decoratorInstance = new $decorator(); $string = $decoratorInstance->decorate($string); } return $string; } abstract public function getDecorators(); }
  11. class MyDecoratorQueue { use StringDecoratorTrait; public function getDecorators() { return

    [ 'App\Decorators\FirstCapitalLetter', 'App\Decorators\ReplaceSpacesWithUnderscores', 'App\Decorators\LastLetterSmall', ]; } }
  12. public function decorate($string) { foreach($this->getDecorators() as $decorator) { $decoratorInstance =

    new $decorator(); $string = $decoratorInstance->decorate($string); if(!is_string($string)) throw new Exception(“The return value should be a string”); } return $string; }