Skip to content

Instantly share code, notes, and snippets.

@lacolaco
Created April 10, 2017 05:37
Show Gist options
  • Save lacolaco/31dfd524bff4839c6632187faab825ef to your computer and use it in GitHub Desktop.
Save lacolaco/31dfd524bff4839c6632187faab825ef to your computer and use it in GitHub Desktop.
オブジェクト指向について教える

オブジェクト指向プログラミング

  • プログラミングの抽象化に関する精神論
  • 厳密な定義はない
  • いくつかの抽象化の手法をグループ化して名前をつけてあるだけ

カプセル化: Encapusulation

  • ソースコードのフレキシビリティを高めるためのソースコードのデザイン
    • いいデザインにはセンスが必要
    • 鍛える
  • フレキシビリティ
    • 仕様の変更
    • ソースコードの中で変わらない部分と変わりうる部分を分割し、変わりうる部分をいかに容易に、安全に変更できるようにするかの方法論
  • コードの集合に名前を付けて隠蔽する
    • 命名に対するセンス
    • 隠蔽する単位に対するセンス
  • 関心の分離
    • 知るべき者が知るべきを知る
  • ソースコードを意味論的に眺めたときの違和感に対するセンス

継承: Inheritance

  • カプセル化の欠点であるソースコードの膨張をカバーするための差分プログラミングの手法
  • 意味論的に重なり合う抽象化モデルに関して、ソースコード上の実装も重ね合わせる
  • 本質 = インターフェースの共有と束縛を行うひとつの方法
    • AnimalとDog
  • 重要なのはプログラムの構成部品をいかに意味論的にモデル化できるか
    • 正しくhas-a, is-a関係を構築する
  • ただ似たような処理をまとめるための仕組みではない
  • 言語機能に依存する場合が多い

ポリモーフィズム: Polymorphism

  • ソースコードの再利用性を高めるための手法
  • プログラムの構成部品同士の依存性を低くする: 疎結合
    • 必要最低限のインターフェースを要求する
    • 関心の分離
  • カプセル化とインターフェースの共有の上に成り立つ
    • 継承とポリモーフィズムは独立する
    • 継承によるインターフェースの共有により副次的にポリモーフィズムを得られる場合が多い
    • インターフェースを共有する方法は継承だけではない
    • 言語機能に依る

クラス、オブジェクト、インスタンス...

  • 本質ではない
    • カプセル化・継承・ポリモーフィズムを実現するための具体的な言語機能にすぎない

オブジェクト指向は目指すものではない

  • 正しく美しいプログラムを書いた結果として出来上がっているもの
    • ソースコードに対する美意識を養う
  • 意味論的に整理されたソースコードを目指すための手法であることを忘れない
    • 短ければいいわけではない
    • クラスをたくさん使えばいいわけではない
  • ソースコードは書く時間より読まれる時間のほうが長い
    • 他人あるいは1年後の自分が読む時のことを考える
    • 適切に意味を与えられたソースコードは、プログラムを実行しなくても何が起きるか予測できる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment