S v SOLIDe

06/2016 / Milan "perún" Herda / @moriquend / prezentacie.perunhq.org

Príklady prebrané z knihy Principles of Package Design

O čom budeme hovoriť

  • Čo je SOLID
  • Single Responsibility Principle
  • Výhody Single Responsibility
  • Ako rozpoznať porušenia princípu
  • Ako refaktorovať, aby sme dodržali princíp

SOLID

Skratka predstavujúca 5 základných princípov dobrého softvérového návrhu

  • Single Responsibility Principle
  • Open-Closed Principle
  • Liskov Substitution Principle
  • Interface Segregation Principle
  • Dependency Inversion Principle

Single Responsibility Principle

Trieda by mala mať jeden (a iba jeden) dôvod pre svoju zmenu.

Výhody Single Responsibility Principle

  • jednoduchšie úpravy (jednoduchou úpravou alebo výmenou triedy)
  • bezpečnejšie úpravy (lebo v kóde nie sú nesúvisiace veci)
  • jednoduchšie pochopenie toho, čo trieda robí
  • ľahká testovateľnosť

Symptómy porušenia princípu

  • veľa properties v triede
  • veľa verejných (public) metód v triede
  • každá metóda používa iné properties
  • špecifické úlohy sú delegované na privátne metódy

Ako refaktorovať

  • extrahovať špecifické úlohy do privátnych metód
  • identifikovať skrytých kolaborantov v privátnych metódach
  • preniesť kód skrytých kolaborantov do samostatných tried

class ConfirmationMailer
{
    private $templating;
    private $translator;
    private $mailer;

    public function __construct(TemplatingInterface $templating, TranslatorInterface $translator, MailerInterface $mailer)
    {
        $this->templating = $templating;
        $this->translator = $translator;
        $this->mailer     = $mailer;
    }

    public function sendTo(User $user)
    {
        $message = $this->createMessageFor($user);

        $this->sendMessage($message);
    }

    private function createMesageFor(User $user)
    {
        $subject = $this->translator->translate('Confirm your email address');

        $body = $this->templating->render(
            'confirmationEmail.tpl',
            [
                'user' => $user,
            ]
        );

        $message = new Message($subject, $body);

        $message->setTo($user->getEmailAddress());

        return $message;
    }

    private function sendMessage(MessageInterface $message)
    {
        $this->mailer->send($message);
    }
}
                    

Táto trieda má dve zodpovednosti a teda aj dva dôvody pre zmeny

  • odosielanie emailu
  • vytvorenie emailu

Refactoring Time!

Skúsime triedu zrefaktorovať.

Zdrojové súbory tu