18
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

オブジェクト指向を学ぶ前に学びたい「哲学、設計、実装、指標、パターン」

Posted at

はじめに

動機

オブジェクト指向についての記事がたくさんありますが、
「結局なんだかよくわからん」となっている人が多そうなので、
そんな人たちの道しるべになればなーと思って書きました。

内容

オブジェクト指向を学ぶ人にとって「なんもわからん」になる理由、

それは
プログラムの知識というより、問題解決の姿勢や理念 (の集積)」
オブジェクト指向とは、その理念に基づいて複数のフェーズが織りなす複合的な技術
であるということが伝わっていないことだと思います。

そこで、この記事では「オブジェクト指向を学ぶ」より前に、
関連する情報を整理する「知識の置き場所」を作る事を目指して、
主に分類を目的に書いています。

分類について

ただし、この分類は一般的なものではなく、
定義についてもより良いものがあるかもしれません。
アドバイスなどがあれば、お気軽にコメントなどをいただけると助かります。

また、分類それぞれに合わせて、
調べるためのキーワードを載せていますので、足掛かりにしてください。

5種類の視点

オブジェクト指向の哲学

哲学というと大げさに見えるかもしれませんが、
「どうしてオブジェクト指向という言葉ができたか」
「それが何を目指していたのか」
こうした背景の知識や精神を哲学として分類したいと思います。

もしあなたが「サクッと使いたいだけなんだ」と思っても、
まずは焦らずにこうした知識に触れてください。

オブジェクト指向は優れた「問題解決の手法」ですが、
魔法の道具ではありません。
使い方を知らなければ、ナイフの刃を自分で握るような事態になります。

大まかなキーワードは以下のようなものがあります。

  • 柔軟性
  • 大規模開発
  • 構造化・モデル化
  • 抽象化・パターン化
  • 振る舞いの隠蔽とモジュール化
  • メッセージング・相互作用
  • C++
  • Smalltalk

オブジェクト指向の設計

哲学として、
どのような場面でオブジェクト指向を使うべきかを学んだあとは、
特性を生かす場面で適用させていくことになります。
その運用を考えるのが設計です。

もしあなたが急いでいるとしても、
「オブジェクト指向は現実の物体(オブジェクト)を扱うような~」という説明を信じているなら、
もう少し哲学に関心を持ってから設計に入ったほうが良いかもしれません。
オブジェクトが「物体」であるという固定概念は、目的である柔軟性からほど遠いものです。

大まかなキーワードは以下のようなものがあります。

  • 関心の分離
  • 単一責任
  • インタフェース
  • 依存性の管理
  • UML (Universal Modeling Language)

オブジェクト指向の実装

オブジェクト指向のプログラミングにおいて、
実装はその設計を実現する手段にすぎません。

チームメンバーが正しくオブジェクト指向を理解し、
それを全員で推進できるなら、
特別な言語や実装技術に依存する要素はほとんどなくなります。

また、どれほど優れたプログラマーでも、
オブジェクト指向に根差していない設計の上では、
オブジェクト指向を実現することはまず不可能です。

とはいえ、オブジェクト指向を進める手助けとして、
以下のような知識や技術を持っておくと、
作業効率が大きく上がることは間違いありません。
人力に頼らなくてよいようにするために、自動化があるのです。

大まかなキーワードは以下のようなものがあります。

  • カプセル化
  • 継承と包含
  • 名前
  • 副作用
  • 高階関数と関数合成

オブジェクト指向のパターン

オブジェクト指向の特徴をよりよく生かすためには、
ときに「天才的なひらめき」が必要になることがあります。
しかし誰にでもそれができるわけではありません。

そこで、オブジェクト指向を実践してきたエンジニアや研究者たちが、
様々なプログラムで効果的だった・よく使われる手法を、
パターンとして残してくれていますので、使わせてもらいましょう。

なお、具体的なパターンには以下のようなものがあります。
概要については独自のもので、
「何を目的としてパターンが生まれたのか」を表しています。
もし間違いがあればご指摘ください。

パターン名 概要
Chain of Responsibility pattern 処理責任の分割
State pattern 分岐の隠蔽と処理実装の分割
Decorator pattern インスタンスの機能と実装の分割
パターン名 概要
Observer pattern 状態管理の分離
Facade pattern インスタンス管理の分離
Proxy pattern 要求処理、対象管理の分離
Command pattern 要求詳細の分離

大まかなキーワードは以下のようなものがあります。

  • GOF (Gang of four)
  • MVC
  • Clean Architecture
  • DI (Dependency Injection)

オブジェクト指向の指標

オブジェクト指向は原理原則の類なので、
その実現方法には実装する人ごとの違いが出来てしまします。

また、プログラミングをするときに常に余裕があるとも限らず、
つい乱暴な書き方をしてしまうこともあるでしょう。

そうしたプロジェクトを助けてくれるのが、
コードの品質を計測する「指標」です。

指標はあくまでものさしであり、
開発の目的にはなりませんが、
「仕事の価値の裏付け」や「チームの成熟度」など、
様々な場面で使える道具となります。

この指標について、心の片隅に置いておいてください。

大まかなキーワードは以下のようなものがあります。

  • 凝集度
  • 結合度
  • 循環的複雑度
  • 継承の深さ

参考

オブジェクト指向の勉強で初心者向けの日本語ページを集めてみました。
今回の僕の記事が、こうした知識をかみ砕く力になること願っています。

なお、こちらは完全に独断と偏見で選んでいるため、
「俺のベストはこれだ!」があればコメントでリンクをください。

18
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?