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

昨日の日記の通り、「捨てられる」とか「局所化する」という発想は重要。これはモジュール化につながる。よく多重度の設計を間違えたとか、継承より集約を使用した方が良かったとか設計ではそういうことを考えがちだが、捨てられる部分であれば大きな問題にはならない。もちろん、高レベルな階層部分(以下、アプリ部分)でなく低レベルな階層部分(以下、ベース部分)ほど捨てられなくなるので、ベース部分の設計は重要になる。


しかし、例えばPythonのような抽象度の高い記述のできる高級言語であれば、かなりの部分のベース処理を自前で書かなくて良い。もちろんアプリケーションの分野固有のベース処理は自前で必要になる。しかも、デザインパターンと呼ばれるほとんどは、C++のような低級言語でいかに抽象化するかということが多いと思うので、オブジェクト指向プログラミングの実装のための設計は、だいぶ自分で考えなくて良くなる。


あと思ったのが、アプリとかシステムの設計でなく、単なるオブジェクト指向プログラミングの実装のための設計は意外と難しく、C++Javaはそういう部分の言語的サポートが少ないのではと思った。例えば、以下の質問に初心者に対して分かりやすく明確にいくつ答えられるだろう?


何をオブジェクトにする?実装継承の多重継承を使用していけない理由は?ダイアモンド継承の欠点は?継承と集約をどう使い分ける?多重度の設計で一般的に気をつけることは?Mixinはインタフェースの多重継承の代わりになる?Mixinとインタフェースの多重継承との違いは何?オブジェクト間の関係付けのパターン(Mediatorなど)を全て把握して最良のパターンを選択できる?デザインパターンを駆使した設計でシンプルでメンテナンス性が増す?MRO(メソッド解決順序)は言語によってどう違う、またどこを設計で気をつけるべき?


逆にこういう実装のための設計というのはプログラミングを意識的にたくさん書くことで少しずつ身に付けていくしかない。私は設計での考え方として、「とりあえずやってみる指向プログラミング」を推進しているのだが、C++みたいな開発の遅い言語では間違いが許されない。特にベース部分は1発で成功しなければならない。仮に失敗してもずーっとそれを使用しつずける必要がある。しかし、Pythonみたいな言語ではコードを簡単に書けるので、アプリ部分のような捨てても良い部分は、とにかく書いてみることができる。ベース部分に関しても自分で記述する部分は絶対量的に少ないので設計ミスを入れ込む可能性はかなり減る。