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

【個人的】オブジェクト指向の現在地

 【個人的】オブジェクト指向の現在地

More Decks by 虎の穴ラボ株式会社

Other Decks in Technology

Transcript

  1. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 【個人的】オブジェクト指向の現在地

    虎の穴ラボ 新規開発チーム 河野 裕隆 T O R A N O A N A L a b
  2. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 自己紹介

    河野裕隆 • 2019/08入社 • 新規開発チーム ◦ クリエイティア他 虎の穴ラボへの入社理由 • スキルを高めあえる仲間がほしい • ユーザーに近い仕事がしたい 2 好きなもの • VOCALOID(初音ミク) • 謎解き、クイズ 今期アニメ • まちカドまぞく2
  3. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. さっそくですが

    オブジェクト指向 ってなんですか? 3
  4. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. •

    人によって粒度、対象が違う言葉 ◦ OOD(設計) ◦ OOA(分析) ◦ OOP(プログラミング) ▪ 現代だと基本的にこれの話が多い • 元となる考えは40年以上前 What’s OO? 4
  5. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. •

    メッセージングベース(Smalltalk) ◦ オブジェクト間のメッセージのやり取りで表現 • 抽象データ型ベース(C++) ◦ カプセル化、継承、多態性←こっちが主流 OOPの解釈 5
  6. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. •

    カプセル化 • 継承 • 多態性 もちろん、そんなことはない 以下をやっていれば良い設計か 6
  7. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 「カプセル化?メンバ変数はprivateにして、Lombokで@Data※!」

    「継承は同じ処理やっているところをまとめればいいんでしょ?」 「多態性ね、全部のクラスにinterface作っておかないと・・・」 オブジェクト指向の目的から離れてワードだけが先行している 例えば 7
  8. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 「カプセル化?メンバ変数はprivateにして、Lombokで@Data※!」

    ※LombokはJavaのライブラリ、@Dataでprivate fieldのgetterとsetterが自動生成される 「継承は同じ処理やっているところをまとめればいいんでしょ?」 最近だと継承よりコンポジションなんて言われることも増えた また再利用性としてではなく部分型(クラスの系統付け)に使われている 「多態性ね、全部のクラスにinterface作っておかないと・・・」 Yegor氏のブログ読むと幸せになれるかも https://www.yegor256.com/2018/09/18/fear-of-coupling.html 関数を渡すことでも実装できる(関数型っぽい考え方) 例えば 8
  9. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. •

    ひとえにオブジェクト指向と言ってもコンテキストで意味が異なる • できてから40年以上経っている 良い設計を表すバズワード感 =>「オブジェクト指向」をキーワードにするのはやめ たい 問題点 9
  10. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. じゃあ、何で話すか

    10
  11. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. 抽象データ型ベース・・・

    の「目的」で話そう 11
  12. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. •

    読みやすいコード • 変更しやすいコード • バグを生みにくいコード これらを達成するためにある OO自体は「目的」じゃなくて「手段」 抽象データ型ベースのOOの目的とは・・・? 12
  13. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. ✘

    「カプセル化できていないよ?外から触らないならprivateにして」 ◎ 「読んだときに余計な情報になっちゃうから外から見えないprivate にして関心事をわけたほうが良いよ」 =>関心事の分離はGRASP(実践UML)の責任性割り当てパターン等参照  個人的にバズワードっぽい「オブジェクト指向」より実践的な気がします つまり・・・ 13
  14. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. •

    読みやすいコード • 変更しやすいコード • バグを生みにくいコード これらを達成するためにある これらを達成する方法はOOだけではない!!! 抽象データ型ベースのOOの目的とは・・・? 14
  15. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. •

    継承、ポリモーフィズム(リスコフの置換原則を満たした派生型の定義方 法) ◦ Go, TypeScriptの構造的部分型 • オブジェクトに名前、状態、振る舞いを持たせる ◦ 今や状態はステートレスが良いと言われる ▪ 関数型の考え方 OO、OOPのちょっとした反例 15
  16. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. •

    OOPといえばJava・・・だが、関数型のパラダイムを取り入れる ◦ ラムダ式(Java 8) ◦ Pattern Matching for switch(Java 19で3rd Preview) ▪ 代数的データ型っぽいのも使えるようになる ◦ Immutableな設計の増加(List.of, LocalDateなど) JavaだからOOPではない!OOで書くからOOPになる OOPで書く必要もない 関数型の考え方 16
  17. Copyright (C) 2022 Toranoana Lab Inc. All Rights Reserved. •

    やや古い考え方になっている部分もある ◦ 厳密にオブジェクトにデータ構造と振る舞いの一体化を目指す ▪ =>Controllerとかのレイヤードアーキが使えない • 目的と対策として妥当な部分が多いので考え方の根底には持っておくべ き ◦ (対策の技術が根本としてOOとしての考え方かは別) • 抽象的ではあるがアーキごとの「良い設計」を学ぶことがベスト ◦ オブジェクト機能を利用したプログラミング ▪ https://speakerdeck.com/kishida/things-java-beginners-should-know?slide=51 OOの現在地まとめ 17