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

TDD, DDD & Teamwork v2

pelshoff
October 09, 2019

TDD, DDD & Teamwork v2

#wczg

pelshoff

October 09, 2019
Tweet

More Decks by pelshoff

Other Decks in Programming

Transcript

  1. View Slide

  2. TDD,
    DDD
    & Teamwork
    pelshoff.com/workshop
    @pelshoff #wczg

    View Slide

  3. Part I: TDD

    View Slide

  4. What is a test?

    View Slide

  5. Something
    shouldn’t happen
    ● Expect exception
    ● Do the thing

    View Slide

  6. final class PresentationTest extends TestCase
    {
    /**
    * @test
    */
    public function presentationsShouldHaveTitles(): void
    {
    $this->expectException(InvalidPresentation::class);
    new Presentation('', '', '');
    }
    }

    View Slide

  7. Something should
    happen
    ● Do the thing
    ● Expect result

    View Slide

  8. final class PresentationTest extends TestCase
    {
    /**
    * @test
    */
    public function presentationsShouldAllowNewSubtitles(): void
    {
    $actual = new Presentation('With', 'a', 'title');
    $expectation = new Presentation('With', 'another', 'title');
    $actual->changeSubtitleTo('another');
    $this->assertEquals($expectation, $actual);
    }
    }

    View Slide

  9. What is a good test?

    View Slide

  10. A good test...
    ● Arrange
    ● Act
    ● Assert

    View Slide

  11. A good test...
    ● Setup
    ● Expect
    ● Execute
    ● Verify

    View Slide

  12. A good test...
    ● Setup
    ● Expect
    ● Perform
    ● Assert

    View Slide

  13. A good test...
    ● Given
    ● When
    ● Then

    View Slide

  14. What is TDD?

    View Slide

  15. “Test-Driven Development (TDD) is a
    technique for building software that guides
    software development by writing tests.” -
    Martin Fowler

    View Slide

  16. Three steps of
    TDD
    ● Red
    ● Green
    ● Refactor

    View Slide

  17. What is the difference between
    test-first & TDD?

    View Slide

  18. Recap
    ● Given, When, Then
    ● Red, Green, Refactor
    ● Client-first

    View Slide

  19. Good luck and have fun!

    View Slide

  20. Part II: Teamwork

    View Slide

  21. The Attitude Model

    View Slide

  22. Divergent

    View Slide

  23. Convergent

    View Slide

  24. Divergent
    Tend to be…
    ● Open
    ● Optimistic and curious
    ● Quick, sloppy and careless

    View Slide

  25. Convergent
    Tend to be...
    ● Closed
    ● Pessimistic and inquisitive
    ● Paced, diligent and careful

    View Slide

  26. The Double Design Diamond

    View Slide

  27. View Slide

  28. Good luck and have fun!

    View Slide

  29. Part III: DDD

    View Slide

  30. Value objects

    View Slide

  31. final class Name {
    private $lastName;
    private $firstName;
    private $insertion;
    public function __construct(string $lastName, string $firstName, string $insertion) {
    $this->lastName = $lastName;
    $this->firstName = $firstName;
    $this->insertion = $insertion;
    $this->nameMustHaveLastName();
    }
    private function nameMustHaveLastName(): void {
    if (!$this->lastName) {
    throw InvalidName::becauseLastNameIsMissing();
    }
    }
    public function getLastName(): string { /**/ }
    public function getFirstName(): string { /**/ }
    public function getInsertion(): string { /**/ }
    }

    View Slide

  32. final class EmailAddress {
    private $emailAddress;
    public function __construct(string $emailAddress) {
    $this->emailAddress = $emailAddress;
    $this->emailAddressMustBeAnActualEmailAddress();
    }
    private function emailAddressMustBeAnActualEmailAddress(): void {
    if (!filter_var($this->emailAddress, FILTER_VALIDATE_EMAIL)) {
    throw InvalidEmailAddress::becauseThisIsNotAnEmailAddress();
    }
    }
    public function asString(): string {
    return $this->emailAddress;
    }
    }

    View Slide

  33. Value objects
    ● Express a value
    ● Define allowed values
    ● Are immutable
    ● Are easy to test

    View Slide

  34. Entities

    View Slide

  35. final class Attendee {
    private $id;
    private $name;
    private $emailAddress;
    public function __construct(Uuid $id, Name $name, EmailAddress $emailAddress) {
    $this->id = $id;
    $this->name = $name;
    $this->emailAddress = $emailAddress;
    }
    public function getId(): Uuid { /**/ }
    public function getName(): Name { /**/ }
    public function setName(Name $name): Attendee { /**/ }
    public function getEmailAddress(): EmailAddress { /**/ }
    public function setEmailAddress(EmailAddress $emailAddress): Attendee {
    $this->emailAddress = $emailAddress;
    return $this;
    }
    }

    View Slide

  36. Entities
    ● Have identity
    ● Are more than their attributes
    ● Evolve over time
    ● Are slightly harder to test

    View Slide

  37. Services

    View Slide

  38. final class Registration {
    private $repository;
    public function __construct(AttendeeRepository $repository) {
    $this->repository = $repository;
    }
    public function registerNew(Attendee $attendee): void {
    $this->emailAddressMustBeUnique($attendee->getEmailAddress());
    $this->repository->add($attendee);
    }
    private function emailAddressMustBeUnique(EmailAddress $emailAddress): void {
    try {
    $this->repository->findByEmailAddress($emailAddress);
    } catch (AttendeeNotFound $e) {
    return;
    }
    throw RegistrationFailed::becauseEmailAddressIsNotUnique();
    }
    }

    View Slide

  39. Services
    ● Have no identity or attributes
    (Are not a “thing”)
    ● Tackle cross-concern operations
    ● Are harder to test

    View Slide

  40. Context
    Technische bouwblokken
    Quiz
    Case study I
    Case study II

    View Slide

  41. class Address

    View Slide

  42. class BicycleService

    View Slide

  43. class StreetAddress

    View Slide

  44. class Investment

    View Slide

  45. Good luck and have fun!

    View Slide

  46. Pim Elshoff
    developer.procurios.com
    @pelshoff #wczg
    https://joind.in/event/webcamp-zagreb-2019/tdd-ddd--teamwork

    View Slide