$30 off During Our Annual Pro Sale. View Details »

There is an I in SOLID

There is an I in SOLID

Presentation focuses on the "interface seggregation" principle of the SOLID patterns

Tom Van Herreweghe

October 03, 2017
Tweet

More Decks by Tom Van Herreweghe

Other Decks in Programming

Transcript

  1. THERE IS AN I IN
    SOLID

    View Slide

  2. Waddis SOLID?
    Efkes over de I
    Voorbeeldjes
    Nog bitje meer over de I

    View Slide

  3. Waddis SOLID?
    Efkes over de I
    Voorbeeldjes
    Nog bitje meer over de I

    View Slide

  4. WADDIS SOLID?
    Acroniem

    View Slide

  5. ACRONIEM?
    “Een letterwoord”
    “Woord gevormd door de eerste letters
    van andere woorden”

    View Slide

  6. TAFKAP
    “The Artist Formerly Known As Prince”

    View Slide

  7. LOL
    “Laughing Out Loud”

    View Slide

  8. RTFM
    “Read The Fucking Manual”

    View Slide

  9. YAGNI
    “You Ain't Gonna Need It”

    View Slide

  10. DRY
    “Don't Repeat Yourself”

    View Slide

  11. S Single Responsability Principle
    O Open/Closed Principle
    L Liskov Substitution Principle
    I Interface Segregation Principle
    D Dependency Inversion Principle

    View Slide

  12. SOLID - BETEKENIS?
    5 design principes
    Uncle Bob Martin
    Doel
    Code flexibeler,
    begrijpbaarder,
    onderhoudbaar(der..)

    View Slide

  13. THROWBACK

    View Slide

  14. THROWBACK

    View Slide

  15. Waddis SOLID?
    Efkes over de I
    Voorbeeldjes
    Nog bitje meer over de I

    View Slide

  16. INTERFACE SEGREGATION
    PRINCIPLE

    View Slide

  17. INTERFACE

    View Slide

  18. “Definitie van [public] methods die
    objecten moeten implementeren”

    View Slide

  19. “Afspraak / Contract dat toelaat om 2
    objecten met elkaar te laten
    communiceren”

    View Slide

  20. “Creëert een verwachting waaraan
    moet voldaan worden”

    View Slide

  21. SEGREGATION
    “SCHEIDING”

    View Slide

  22. INTERFACE SEGREGATION

    View Slide

  23. “No object should be forced to depend
    on methods it doesn't use”

    View Slide

  24. “Opsplitsen van [grote] interfaces in
    kleinere, meer specifieke”

    View Slide

  25. Herbruikbaarheid++
    Specifiekere dependencies

    View Slide

  26. Waddis SOLID?
    Efkes over de I
    Voorbeeldjes
    Nog bitje meer over de I

    View Slide

  27. SETUP - BLOGPOST CLASS
    class BlogPost implements BlogPostInterface
    {
    public function getTitle() { /* ... */ }
    public function getContent() { /* ... */ }
    public function getAuthor() { /* ... */ }
    public function getSlug() { /* ... */ }
    }

    View Slide

  28. SETUP - BLOGPOST INTERFACE
    interface BlogPostInterface
    {
    public function getTitle();
    public function getContent();
    public function getAuthor();
    public function getSlug();
    }

    View Slide

  29. SETUP - USAGE
    $blog = new BlogPost($title, $content, $author);
    $blog->setSlug(
    $slugifier->createSlug($blog)
    );
    /* ... */

    View Slide

  30. SETUP - SLUGIFIER
    class Slugifier
    {
    /* ... */
    public function createSlug(BlogPostInterface $blog)
    {
    $content = $blog->getSlugableContent();
    /* ... do some magic ... */
    return $slug;
    }
    /* ... */
    }

    View Slide

  31. UITBREIDING -
    BLOGPOSTINTERFACE
    interface BlogPostInterface
    {
    public function getTitle();
    public function getContent();
    public function getAuthor();
    public function getSlug();
    public function getSlugableContent();
    }

    View Slide

  32. UITBREIDING - AUTHOR CLASS
    class Author implements AuthorInterface
    {
    public function getFirstname() { /* ... */ }
    public function getLastname() { /* ... */ }
    public function getFullname() { /* ... */ }
    public function getSlug() { /* ... */ }
    public function getSlugableContent() { /* ... */ }
    }

    View Slide

  33. UITBREIDING - AUTHOR
    INTERFACE
    interface AuthorInterface
    {
    public function getFirstname();
    public function getLastname();
    public function getFullname();
    public function getSlug();
    public function getSlugableContent();
    }

    View Slide

  34. SLUGIFIER - PROBLEEM!
    class Slugifier
    {
    /* ... */
    public function createSlug(BlogPostInterface $blog)
    {
    $content = $blog->getSlugableContent();
    /* ... do some magic ... */
    return $slug;
    }
    /* ... */
    }

    View Slide

  35. SLUGIFIER - PROBLEEM! (PART 2)
    class Slugifier
    {
    /* ... */
    public function createSlug($item)
    {
    $content = $item->getSlugableContent();
    /* ... do some magic ... */
    return $slug;
    }
    /* ... */
    }

    View Slide

  36. View Slide

  37. THEORETISCH...
    $item = Weather();
    $slug = $slugifier->createSlug($weather);
    /* ... */

    View Slide

  38. OPLOSSING: INTERFACE
    SEGREGATION

    View Slide

  39. SUGGABLE - INTERFACE
    interface Slugable
    {
    public function getSlugableContent();
    public function getSlug();
    }

    View Slide

  40. SLUGABLE - SLUGIFIER
    class Slugifier
    {
    /* ... */
    public function createSlug(Slugable $item)
    {
    $content = $item->getSlugableContent();
    /* ... do some magic ... */
    return $slug;
    }
    /* ... */
    }

    View Slide

  41. OPLOSSING - BLOGPOST
    class BlogPost implements BlogPostInterface, Slugable
    {
    public function getTitle() { /* ... */ }
    public function getContent() { /* ... */ }
    public function getAuthor() { /* ... */ }
    public function getSlug() { /* ... */ }
    public function getSlugableContent() { /* ... */ }
    }

    View Slide

  42. OPLOSSING - BLOGPOST
    INTERFACE
    interface BlogPostInterface
    {
    public function getTitle();
    public function getContent();
    public function getAuthor();
    }

    View Slide

  43. DONE!

    View Slide

  44. NOT

    View Slide

  45. UITBREIDING - URL'S
    // /2017/09/this-is-my-title
    $blogUrl = $urlGenerator->generateBlogUrl($blog);
    // /auhtor/tom-van-herreweghe
    $authorUrl = $urlGenerator->generateAuthorUrl($author);

    View Slide

  46. UITBREIDING - URL'S
    // /2017/09/{slug}
    $blogUrl = $urlGenerator->generateBlogUrl($blog);
    // /auhtor/{slug}
    $authorUrl = $urlGenerator->generateAuthorUrl($author);

    View Slide

  47. UITBREIDING - URLGENERATOR
    class UrlGenerator
    {
    public function generateBlogUrl(??? $item)
    {
    /* ... do some magic ... */
    }
    }

    View Slide

  48. PROBLEEM!
    Welke Visual Debt constraint toevoegen?
    public function generateBlogUrl(BlogPostInterface $item)
    public function generateBlogUrl(Slugable $item)

    View Slide

  49. PROBLEEM!
    Ofwel geen zekerheid over slug-functionaliteit
    Ofwel geen zekerheid over Blog-item

    View Slide

  50. OORZAAK
    class BlogPost implements BlogPostInterface, Slugable
    {
    public function getTitle() { /* ... */ }
    public function getContent() { /* ... */ }
    public function getAuthor() { /* ... */ }
    public function getSlug() { /* ... */ }
    public function getSlugableContent() { /* ... */ }
    }

    View Slide

  51. OPLOSSING???
    Komt sebiet!

    View Slide

  52. Waddis SOLID?
    Efkes over de I
    Voorbeeldjes
    Nog bitje meer over de I

    View Slide

  53. INHERITANCE
    Overerving

    View Slide

  54. OBJECT CONTEXT
    class Circle extends Shape
    {
    /* ... */
    }

    View Slide

  55. QUIZ - KAN DIT?
    class Circle extends Shape, Oval
    {
    /* ... */
    }

    View Slide

  56. MULTIPLE INHERITANCE
    Kan niet in PHP

    View Slide

  57. QUIZ - KAN DIT?
    interface Circle extends Shape
    {
    /* ... */
    }

    View Slide

  58. QUIZ - KAN DIT?
    interface Circle extends Shape, Oval
    {
    /* ... */
    }

    View Slide

  59. MULTIPLE INHERITANCE
    Kan niet in PHP in object context
    Kan wel in PHP: Multiple Interface Inheritance

    View Slide

  60. class BlogPost implements BlogPostInterface
    {
    /* ... */
    }
    interface BlogPostInterface extends Slugable
    {
    /* ... */
    }

    View Slide

  61. class UrlGenerator
    {
    public function generateBlogUrl(BlogPostInterface $item)
    {
    /* ... do some magic ... */
    }
    }

    View Slide

  62. View Slide

  63. PROBLEEM?
    NOPE!

    View Slide

  64. INTERFACE SEGREGATION
    PRINCIPLE
    Opsplitsen interfaces in meer specifiekere
    Dependen op specifiekste interface
    Meerdere interfaces implementeren = een oplossing
    Multiple interface inheritance = betere oplossing

    View Slide

  65. VRAGEN?

    View Slide

  66. HTTPS://JOIND.IN/TALK/22707

    View Slide