【モデリング】最適な抽象化をするためには?

こんにちは。
エンベデットソリューション事業部の鷲澤です。

ここ数年、オブジェクト指向に基づいたモデリングに関して社内で勉強会を開催してきました。
その中で、受講者から出た質問に「抽象化の最適な粒度が分からない」という質問が多数挙がりました。
自分自身の考えを整理するためにも、今回は「最適な抽象化をするためには?」というテーマでまとめていきたいと思います。


【はじめに】

今回の記事では、前提条件として「モデリングはオブジェクト指向に基づいて行う」という考えで記載しています。

まず、最適な抽象化の粒度が分からない原因を考えてみました。

原因として考えられるのは、抽象化において論理的思考が働いていないためと思われます。
つまり、最適な抽象化の粒度が分からない人というのは、抽象化も含め、モデリング自体をただなんとなく、経験上こうだろうのように非論理的にモデリングをしている可能性があります。
そのため「最適な抽象化」を理解してもらうために、まずオブジェクトの定義から説明します。


【オブジェクトとは?】

オブジェクトの定義は下記です。

オブジェクトとは
「ある人(主体)」が
「ある目的をもって」
「ある視点から認識した(観点)」
対象のこと。

下記の図を使って補足すると、オブジェクトとは、ある人が目的や観点というフィルターを通して、五感などを使って認知した概念ということになります。

このオブジェクトという概念を使った考え方のことが、オブジェクト指向ということになります。


【モデリングにおけるオブジェクト指向の本質】

今回の記事ではオブジェクト指向の詳細な説明は省きますが、
結論から言うと、モデリングにおけるオブジェクト指向の本質とは「論理思考」です。

上記に説明したオブジェクトを使って、この世のすべての物事を論理的に解釈するため手法という位置づけです。
モデリングを習得するにはある程度慣れが必要だと思っていますが、その理由はオブジェクト指向の論理に基づいて考える癖をつけるのに時間が掛かるからです。

勉強会でも説明していますが、モデリング とは「理解すること」と同義です。
モデリングはオブジェクト指向という論理思考を使って、理解した内容を表現すれば良いだけです。
機械学習や深層学習のように、よく分からないけど結果は出るものと比べると、真逆の考え方になります。

全てをモデリングする(理解する)ということは大変です。
それゆえに、モデリングは網羅性を保障するのには不向きな手法です。
そのため大事になることが、明確にモデリングのスコープを決めることです。


【最適な抽象化をするためには?】

それではみなさん、上記の説明を踏まえた上で、最適な抽象化を決める上で大事になってくるポイントはなんでしょうか?
下記を読む前に少し考えてみてください。

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

大事なポイントとしては2つあります。

【ポイント①】

一つ目のポイントとして、何が変化するかを見極めることです。

抽象化の最大の利点は再利用性の向上です。
それじゃあ全部抽象化しちゃえと思う人がいるかもしれませんが、抽象化はコストとトレードオフの関係にあります。
なんでもかんでも抽象化してしまうと、開発においては莫大なコストが掛かり現実的ではありません。
そのため、コストを鑑みながら今後の変化を考えて、必要な部分だけ抽象化するということが必要になります。

なにが変化するかを検討する上では、顧客の要求から検討を始めるのが基本です。
オブジェクトが持つ責務や、オブジェクト間の関係に着目して、変化の可能性を分析しましょう。
変化しそうな要素を見つけたら、顧客にも今後変化する可能性を確認してみましょう。
顧客との認識合わせに繋げると同時に、モデルのスコープも定まります。

設計モデルの作成ならば、何が変化するか検討する上で、参考になるのがデザインパターンです。
デザインパターンは、ある変化観点ごとにまとめた設計パターンといえます。
例えば、Factoryパターンならば「オブジェクト生成」、Commandパターンならば「要求」のように、何の変化に対するパターンなのかが明確になっています。

【ポイント②】

二つ目のポイントは、オブジェクトの定義である「誰が」オブジェクトを捉えるかの部分です。
言い換えると、誰のためのモデルなのか?誰がそのモデルを見る可能性があるのか?ということになります。

抽象化をすると、オブジェクトの責務が隠蔽されて曖昧になります。
ただし、見る人によっては、抽象化をすることで理解し易くなることもありますし、理解し辛くなることもあります。
つまり、「モデルを見る人が理解できる表現方法で記載されているか?」が、抽象化のポイントになります。

設計モデル作成時ならば、他の設計者やレビュアー、試験仕様書作成者などがモデルを見ることも考慮した表現を使いましょうということになります。
モデル作成者が誰のために向けて記載したモデルなのかを、モデル上にコメントで残す等して明確にしておきましょう。
モデル作成者のスコープを明確にしておくことで、スコープ外の人にモデルを否定されても反論できます。


【まとめ】

最適な抽象化をするためには、下記の2つのポイントを考慮してスコープを明確にすること。
① 変化に対して抽象化すること

② 誰が見るモデルなのかを意識すること

今回記載した内容は、勉強会に参加されたことが無い方には、何のことを言っているか分からない部分が多々あると思います。
しかし、IoT等によりオブジェクト同士の関係が複雑化する中で、生産性を求められる開発者には、全員に理解して欲しい内容だと感じています。