Yuki's Tech Blog

仕事で得た知見や勉強した技術を書きます。

【オブジェクト指向設計実践ガイド】第1章 オブジェクト指向設計を読んで学んだことをざっくりまとめてみた

目次

背景

変化に強いソフトウェアを作れるようになりたいなと思い、以前から気になっていたオブジェクト指向設計に入門しました。

そもそもオブジェクトとは

プログラミングにおけるオブジェクトとは、「データと自分自身の手続き(処理手順)を1つのまとまりとして定義したもの」です。オブジェクトは何かしらのクラスから生成されているので、クラスに定義してあるメソッドや、そのクラスの継承元のクラスに定義してあるメソッドを使用することができます。オブジェクトは自分自身のデータと自分自身の振る舞いを持ちます。

オブジェクト指向とは何か、オブジェクト指向プログラミング、オブジェクト指向言語との違いは何か

オブジェクト指向とは、さまざまなオブジェクトを組み合わせてソフトウェアを開発しようとする考え方のことです。 オブジェクト指向では、世界を、オブジェクト間で受け渡されるメッセージの連続としてモデル化しています。手続型では、世界を、手続きの集まりとしてモデル化しています。

オブジェクト指向という言葉を聞くと、オブジェクト指向プログラミングって何?となります。オブジェクト指向プログラミングとは、オブジェクト指向の考え方をプログラミングに応用したプログラム記述手法のことです。つまり、オブジェクト指向プログラミングは、オブジェクトの定義やオブジェクト間の相互関係、相互作用を記述することでプログラムを構築していく手法のことです。

また、オブジェクト指向言語とは何?ともなりますが、オブジェクト指向言語とは、オブジェクト指向プログラミングに必要な機能(クラスやプロトタイプ、メソッド、インスタンス化等々)を言語仕様として備えている言語のことです。

オブジェクト指向でソフトウェアを開発すると何が嬉しいのか?

個人的な考えになりますが、以下の点でメリットがあるのかなと思いました。

  1. オブジェクトがデータと手続きを持っているので、変更箇所が局所化されている。そのため、変更を加えやすい
  2. オブジェクトがデータと手続きを持っているので、そのオブジェクトを再利用することで、プログラムを効率的に作れる

ただ、これらのメリットは、あくまで適切なオブジェクト指向設計をした際に得られるものだと私は思います。

オブジェクト指向設計とは何か

オブジェクト指向設計とは、ざっくりいうと、オブジェクトが変更を許容できるように、オブジェクト間の依存関係をどのように管理するかを決定することです。オブジェクト指向設計をする際に、SOLID、DRY、デメテルの法則といった原理原則やデザインパターンを使用します。

オブジェクトがお互いのことを知ることで、オブジェクト間に依存関係が作られます。そういう依存関係が大量にあることで、1つのオブジェクトを修正することで、全てのオブジェクトを修正する必要があるでしょう。 また、オブジェクトが本来持つべきではない情報を持つことによって、その状況でしか利用できない再利用性のないオブジェクトが作られます。これはReactコンポーネントでも同様です。

このような依存関係を管理するには、適切なオブジェクト指向設計をする必要があります。

良い設計とは何か

ソフトウェア開発における良い設計とは、未来を予測するのではなく、未来を受け入れるための選択肢を保護することです。拡張の余地を残すことで、変更に強いソフトウェアを作ることができます。

この考え方では、未来に何が起こるのかを予測するのではなく、未来に何かが起こることを認めています。未来に何が起こるのかを予想して設計すると、もし未来で想定したことが起きなかった場合、変更コストが高くつきます。未来を想定するのではなく、未来に何かが起こることを認めて、拡張の余地を残すことが良い設計と言えます。

参考記事

オブジェクト指向言語(オブジェクト指向プログラミング言語)とは - 意味をわかりやすく - IT用語辞典 e-Words

設計とは - 意味をわかりやすく - IT用語辞典 e-Words

オブジェクト指向プログラミング(OOP)とは - 意味をわかりやすく - IT用語辞典 e-Words

オブジェクト指向言語(オブジェクト指向プログラミング言語)とは - 意味をわかりやすく - IT用語辞典 e-Words

オブジェクト指向 - Wikipedia

オブジェクト指向分析設計 - Wikipedia