オブジェクト指向の第一歩
オブジェクト指向とは?
Clean Architecture 第5章 オブジェクト指向プログラミング まとめより
「 OO とは何か?」この質問には、多くの意見と多くの答えがある。だが、ソフトウェアアーキテクトにとって、その答えは明らかだ。OO とは「ポリモーフィズムを使用することで、システムにあるすべてのソースコードの依存関係を絶対的に制御する能力」である。
Clean Architectureのとおりオブジェクト指向とは、変数・ロジックの集合体をクラスという括りで名前を与え、ときにそれらを抽象化して依存関係を制御するプログラミングの技法だと思っております。
正解がないオブジェクト指向
しかし肝心の「どういう切り口でクラス化・抽象化するのか?」には常に100点を取れるような方法は存在しません。わたしも新卒で入社した会社でこの切り口をどうみつけるかについて随分悩みました。私だけではなく部署の開発者全員が悩んでおり、仕方なくCのような作法でJavaを書いていたと思います。
正しいやり方・正しい抽象化は、ケースバイケースです。実稼働しているサービス、システムによって正しさは異なりますし、同じシステムであってもフェーズが進むと正しさも変わっていきます。オブジェクト指向い関する書籍がふんわりしていて概念の説明がおおく実例が少ないのは、実例を紹介しても職場では役にたたないためだと思われます。
オブジェクト指向の第一歩
オブジェクト指向に常に正しいやり方は存在しませんがを、オブジェクト指向するための最低条件のようなものは存在すると思っており、自分の経験の話になりますが、正しく具体的な名前をつけることそして名前で絶対に嘘をつかないことだと思っております。
これがオブジェクト指向の土台・基礎・はじめの一歩になります。
Thought worksアンソロジー 第5章 オブジェクト指向エクササイズより
5.2.1 9つのルール
- 1つのメソッドにいつインデントは1段階までにすること
- else句を使用しないこと
- すべてのプリミティブ型と文字列型をラップすること
- 1行につきドットは1つまでにすること
- 名前を省略しないこと
- すべてのエンティティを小さくすること
- 1つのクラスにつきインスタンス変数を2つまでにすること
- ファーストクラスコレクションを使用すること
- Getter, Setter, プロパティをしようしないこと
少し古い本の引用です。当時もこの内容は賛否両論あり、これを実務で行うのは過激すぎると思っています。このルールに従って実装すると、再利用なんて小難しいことは考えず、クラスを大量に作ることになります。関数も大量に作ることになります。そして、これら大量のラスと大量の関数に正しい名前をつけることを強いられます。とにかくたくさんつくるので名前に妥協できません。
正しく名前付けされたクラス(関数群)が揃うと、どういう処理がまとまって一つの機能を成しているのか?どういう機能がまとまってこのシステムが構成されているのか?など、システムのドメインが徐々にみえてきます。これがOOPの第一歩になるのだと思っております。
というのが私の意見なのですが、皆さんオブジェクト指向を始めるにあたって感じた違和感とか壁とか、それを乗り越えた切欠とか共有したいなとおもっております。