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

OOC keynote: Object Oriented Diversity

nrs
February 16, 2020

OOC keynote: Object Oriented Diversity

Object Oriented Conference の基調講演です。

# URL
HomePage: https://nrslib.com
Twitter: https://twitter.com/nrslib

nrs

February 16, 2020
Tweet

More Decks by nrs

Other Decks in Technology

Transcript

  1. Object Oriented Diversity
    Masanobu Naruse

    View Slide

  2. あなたのオブジェクト指向は何ですか
    2

    View Slide

  3. 3

    View Slide

  4. 4

    View Slide

  5. 5

    View Slide

  6. 6

    View Slide

  7. 7

    View Slide

  8. 8
    オブジェクト指向

    View Slide

  9. 9
    なんか違う

    View Slide

  10. 10
    それ
    オブジェクト指向
    じゃないよ

    View Slide

  11. 11
    それ
    オブジェクト指向
    じゃないよ
    いや
    オブジェクト指向
    だよ

    View Slide

  12. 12

    View Slide

  13. 13
    それ
    オブジェクト指向
    じゃないよ
    いや
    オブジェクト指向
    だよ

    View Slide

  14. 14
    それ
    オブジェクト指向
    じゃないよ
    いや
    オブジェクト指向
    だよ
    C++ Smalltalk

    View Slide

  15. 15
    それ
    オブジェクト指向
    じゃないよ
    いや
    オブジェクト指向
    だよ
    抽象データ型
    メッセージ
    パッシング

    View Slide

  16. Object Oriented Diversity
    Masanobu Naruse

    View Slide

  17. Object Oriented Diversity
    Masanobu Naruse

    View Slide

  18. 18
    Diversity

    View Slide

  19. 19
    多様性

    View Slide

  20. 多様性を上手く扱うには?
    20

    View Slide

  21. 多様性を上手く扱うには?
    21

    View Slide

  22. 多様性
    22

    View Slide

  23. Polymorphism
    23

    View Slide

  24. オブジェクト指向プログラミングを見てみよう!
    24

    View Slide

  25. 25
    public class ProposalSubmitService
    {
    private readonly IProposalRepository proposalRepository;
    public ProposalSubmitService(IProposalRepository proposalRepository)
    {
    this.proposalRepository = proposalRepository;
    }
    public void Handle(ProposalSubmitCommand command)
    {
    ...
    var proposal = new Proposal(command.Title, command.Outline);
    proposalRepository.Save(proposal);
    ...
    }
    }

    View Slide

  26. 26
    public class ProposalSubmitService
    {
    private readonly IProposalRepository proposalRepository;
    public ProposalSubmitService(IProposalRepository proposalRepository)
    {
    this.proposalRepository = proposalRepository;
    }
    public void Handle(ProposalSubmitCommand command)
    {
    ...
    var proposal = new Proposal(command.Title, command.Outline);
    proposalRepository.Save(proposal);
    ...
    }
    }

    View Slide

  27. 27
    public class ProposalSubmitService
    {
    private readonly IProposalRepository proposalRepository;
    public ProposalSubmitService(IProposalRepository proposalRepository)
    {
    this.proposalRepository = proposalRepository;
    }
    public void Handle(ProposalSubmitCommand command)
    {
    ...
    var proposal = new Proposal(command.Title, command.Outline);
    proposalRepository.Save(proposal);
    ...
    }
    }

    View Slide

  28. 28
    public class ProposalSubmitService
    {
    private readonly IProposalRepository proposalRepository;
    public ProposalSubmitService(IProposalRepository proposalRepository)
    {
    this.proposalRepository = proposalRepository;
    }
    public void Handle(ProposalSubmitCommand command)
    {
    ...
    var proposal = new Proposal(command.Title, command.Outline);
    proposalRepository.Save(proposal);
    ...
    }
    }

    View Slide

  29. 29
    public class ProposalSubmitService
    {
    private readonly IProposalRepository proposalRepository;
    public ProposalSubmitService(IProposalRepository proposalRepository)
    {
    this.proposalRepository = proposalRepository;
    }
    public void Handle(ProposalSubmitCommand command)
    {
    ...
    var proposal = new Proposal(command.Title, command.Outline);
    proposalRepository.Save(proposal);
    ...
    }
    }

    View Slide

  30. 30
    public interface IProposalRepository
    {
    Proposal Find(ProposalId id);
    void Save(Proposal proposal);
    void Delete(Proposal proposal);
    }

    View Slide

  31. 31
    public interface IProposalRepository
    {
    Proposal Find(ProposalId id);
    void Save(Proposal proposal);
    void Delete(Proposal proposal);
    }

    View Slide

  32. 32
    public class ProposalSubmitService
    {
    private readonly IProposalRepository proposalRepository;
    public ProposalSubmitService(IProposalRepository proposalRepository)
    {
    this.proposalRepository = proposalRepository;
    }
    public void Handle(ProposalSubmitCommand command)
    {
    ...
    var proposal = new Proposal(command.Title, command.Outline);
    proposalRepository.Save(proposal);
    ...
    }
    }

    View Slide

  33. 33
    public class ProposalSubmitService
    {
    private readonly IProposalRepository proposalRepository;
    public ProposalSubmitService(IProposalRepository proposalRepository)
    {
    this.proposalRepository = proposalRepository;
    }
    public void Handle(ProposalSubmitCommand command)
    {
    ...
    var proposal = new Proposal(command.Title, command.Outline);
    proposalRepository.Save(proposal);
    ...
    }
    }

    View Slide

  34. 34
    public class ProposalSubmitService
    {
    private readonly IProposalRepository proposalRepository;
    public ProposalSubmitService(IProposalRepository proposalRepository)
    {
    this.proposalRepository = proposalRepository;
    }
    public void Handle(ProposalSubmitCommand command)
    {
    ...
    var proposal = new Proposal(command.Title, command.Outline);
    proposalRepository.Save(proposal);
    ...
    }
    }

    View Slide

  35. 35
    public void Main(string input)
    {
    var repository = CreateRepository(input);
    var proposalSubmitService = new ProposalSubmitService(repository);
    var command = new ProposalSubmitCommand();
    proposalSubmitService.Handle(command);
    }
    private IProposalRepository CreateRepository(string input)
    {
    switch (input)
    {
    case "local" :
    return new InMemoryProposalRepository();
    case "production" :
    return new SqlProposalRepository();
    default:
    throw new ArgumentOutOfRangeException();
    }
    }

    View Slide

  36. 36
    public void Main(string input)
    {
    var repository = CreateRepository(input);
    var proposalSubmitService = new ProposalSubmitService(repository);
    var command = new ProposalSubmitCommand();
    proposalSubmitService.Handle(command);
    }
    private IProposalRepository CreateRepository(string input)
    {
    switch (input)
    {
    case "local" :
    return new InMemoryProposalRepository();
    case "production" :
    return new SqlProposalRepository();
    default:
    throw new ArgumentOutOfRangeException();
    }
    }

    View Slide

  37. 37
    public void Main(string input)
    {
    var repository = CreateRepository(input);
    var proposalSubmitService = new ProposalSubmitService(repository);
    var command = new ProposalSubmitCommand();
    proposalSubmitService.Handle(command);
    }
    private IProposalRepository CreateRepository(string input)
    {
    switch (input)
    {
    case "local" :
    return new InMemoryProposalRepository();
    case "production" :
    return new SqlProposalRepository();
    default:
    throw new ArgumentOutOfRangeException();
    }
    }

    View Slide

  38. 38
    public void Main(string input)
    {
    var repository = CreateRepository(input);
    var proposalSubmitService = new ProposalSubmitService(repository);
    var command = new ProposalSubmitCommand();
    proposalSubmitService.Handle(command);
    }
    private IProposalRepository CreateRepository(string input)
    {
    switch (input)
    {
    case "local" :
    return new InMemoryProposalRepository();
    case "production" :
    return new SqlProposalRepository();
    default:
    throw new ArgumentOutOfRangeException();
    }
    }

    View Slide

  39. 39
    public void Main(string input)
    {
    var repository = CreateRepository(input);
    var proposalSubmitService = new ProposalSubmitService(repository);
    var command = new ProposalSubmitCommand();
    proposalSubmitService.Handle(command);
    }
    private IProposalRepository CreateRepository(string input)
    {
    switch (input)
    {
    case "local" :
    return new InMemoryProposalRepository();
    case "production" :
    return new SqlProposalRepository();
    default:
    throw new ArgumentOutOfRangeException();
    }
    }

    View Slide

  40. 40
    オブジェクト指向

    View Slide

  41. 41
    public interface オブジェクト指向
    {
    }

    View Slide

  42. 42
    それ
    オブジェクト指向
    じゃないよ
    いや
    オブジェクト指向
    だよ
    C++ Smalltalk

    View Slide

  43. 43

    View Slide

  44. コードを小説として捉えたとき
    44

    View Slide

  45. Polymorphism の役割は?
    45

    View Slide

  46. 46
    文脈

    View Slide

  47. 47
    コンテキスト

    View Slide

  48. IT技術分野には多くのコンテキストがある
    48

    View Slide

  49. モデル
    49

    View Slide

  50. エンティティ
    50

    View Slide

  51. ドメイン
    51

    View Slide

  52. コンテキストが存在することを意識しよう
    52

    View Slide

  53. プログラミングでも便利
    53

    View Slide

  54. UserContext
    54

    View Slide

  55. HttpContext
    55

    View Slide

  56. コンテキストを恐れないで
    56

    View Slide

  57. 57
    重要なのはどのコンテキストなのかを意識すること

    View Slide

  58. 58
    多様性を受け入れよう

    View Slide

  59. 多様性を恐れないための心構え
    59

    View Slide

  60. 60

    View Slide

  61. 61

    View Slide

  62. 62

    View Slide

  63. あなたの考えを
    あなたのコンテキストで
    63

    View Slide

  64. 64

    View Slide

  65. 65

    View Slide

  66. Object Oriented Diversity
    Masanobu Naruse

    View Slide

  67. Auther Masanobu Naruse
    HomePage https://nrslib.com
    Twitter @nrslib

    View Slide