見出し画像

ソフトウエア開発に関する一私見〜オブジェクト指向とモデル〜

オブジェクト指向は難しい?

私は生業としてソフトウエア開発をやっています。昨今(かなぁ?)では組込みソフトウエアの世界でもオブジェクト指向ってやつで設計を行なっております。ところがこの『オブジェクト指向』が難しい。
わたしが分からないのではなく、分からない若手を分からせるのが非常に難しいのです。

何かの本で
「分かった人には見えている世界を、その世界が見えていない人を見える様に説明するのは基本的にはできない。」
とか書いてあったと思います。※後で探しておこう。
どんなに論理的かつ詳細に説明できたとしても世界が見える様になるのには本人の気付きを待つしかないって事ですね。

何故、説明しても分からないのか。
おそらく分からないのではなく、腑に落ちしないのだと考えています。
なんとなく分かったような気がするけど自分の言葉で説明しようとしても言葉が出てこない。
あるいは、例を挙げようと思っても思いつかない。
そんな感じでは無いでしょうか。

難しいのは何故か

身近な話ではc++やpythonなどのオブジェクト指向言語(正しいのか?)で書いたソースコードのできです。確かにクラスがあり、メソッドを呼んではいます。
でも、90%が以上同じコードの異なるクラスがあったり、継承したクラスが継承元とは似ても似つかない挙動をしたり(必要なデータテーブルを使いたいがゆえに継承している。データ管理のクラスに括り出せば良いのに)

なんだかなぁですが、本人達はおかしいとは思っていないようです。
データをクラスに入れて、そのデータを扱うメソッドを作っている。(カプセル化)
内部で使う変数、関数はpurivateにしている。(抽象化? なんか違う。)
また、似たコードがあれば派生させている。(継承)
各メソッドは派生先で上書きされ新しい機能を実現している。(ポリモーフィズム)

よく言われるオブジェクト指向プログラミングの原則に適合していると思っているようです。

個人的には、この原則が難しくしているのではと考えています。いや、オブジェクト指向を誤解させているにではと考えています。

オブジェクト指向本は正しいか?

オブジェクト指向プログラミングの学習でテキストや入門書などで学ぶ人が多いと思います。

犬は哺乳類で、馬も同じとか、車に乗用車とトラック含まれるだの。
オブジェクト指向が分かっている人には、何を言わんとしているかはわかりますが、これから学ぶ人には言葉上のことしかわらからないと思います。最初わたしもこれでオブジェクト指向プログラミングは良く分からないと、使わずにいました。

最近は、この教え方がオブジェクト指向の考え方ではなく開発言語の構造の説明になっているのが原因ではないかと思っています。

では、開発言語ではなくオブジェクト指向そのものをどのように理解すれば良いでしょう。
そこでタイトルに書いた"モデル"が出てきます。

モデルで考えるオブジェクト指向

モデルと聞いて何を想像しますか?
ファッションモデル、ビジネスモデル、3Dモデル、ガンプラ(ガンダムプラモデル)など。
これらに共通することは何でしょうか。
みな対象物(モデルのことです)の外からの見たときの見え方、振る舞いなどを表現しています。

ファッションモデルは、その服を着た時に周りの人からどのように見えるかを示してくれます。ビジネスモデルは、ビジネスと言う形を持たないモノをその振る舞いを外から見えるように示します。
3Dモデル、ガンプラも同様にある物体の形状を三次元で手に取って見られるようにしています。
ここで大事なのは"外からどう見えるか"です。中がどうなっているかは問うていません。(ガンプラは中は空洞ですよね。)
つまり、対象物を対象物を外から見たとき特徴振る舞いを示すのがモデルだといえると思います。
これをオブジェクト指向に当てはめるとどうでしょう。

例えば、対象を"自動車"としたら、

オブジェクト:
  自動車
見た目の特徴:
  タイヤがある。ハンドルがある。アクセル、ブレーキがある。
振る舞い:
  アクセルを踏むと進む。ブレーキを踏むと止まる。
  ハンドルを回すと曲がる。

どうですか。そんなにむつかしくないですよね。
これをもとに"派生"させてみると。

オブジェクト:
 トラック
見た目の特徴:
 タイヤがある。ハンドルがある。アクセル、ブレーキがある。
 荷台がある。
振る舞い:
 アクセルを踏むと進む。ブレーキを踏むと止まる。
 ハンドルを回すと曲がる。
 バックするとき注意を促す音声が出る。

太字の部分が派生によって追加された部分です。
例えばpython風に書いてみると。

class 自動車:
  タイヤ
  ハンドル
  アクセル
  ブレーキ
  def アクセルを踏む(self):
    進む
  def ブレーキを踏む(self):
    止まる
  def ハンドルを回す(self):
    曲がる
  def ギアをバックにする。
    バックする。

class トラック(自動車):
  荷台
  def ギアをバックにする
   super().ギアをバックにする
    注意を促す音声を出す。

といった感じです。

このようにオブジェクト指向はモデルで考えるとわかりやすくなると思いますが、どうでしょうか。


この記事が気に入ったらサポートをしてみませんか?