勉強会# ― エンジニアとしての解像度を高めるための勉強会

アーキテクチャ根底技法(7,8)

ポリシーと実装の分離

Separation of Policy and Implementation

インターフェースと実装の分離

Separation of Interface and Implementation

勉強会# ― エンジニアとしての解像度を高めるための勉強会

タネ本

『ソフトウェアアーキテクチャ
  ― ソフトウェア開発のためのパターン体系』

  • F.ブッシュマン(著), 金澤 典子(訳)
  • 近代科学社刊(2000/12/1)
勉強会# ― エンジニアとしての解像度を高めるための勉強会

ポリシーと実装の分離

ある機能を実装するとき、その アプリとしての実装(ポリシー)アプリに依存しないロジック(実装) とを混ぜないようにする

  • ポリシー: アプリとしてのロジック / 実装: アプリに依存しない独立した機能
  • 認証処理と認証方式, 業務AIモデルとTensorFlow, 年賀状印刷とプリンタドライバなど

インターフェースと実装の分離

ある機能を実装するとき、その 仕様/定義(インターフェース)実際の処理(実装) とを混ぜないようにする

  • ヘッダーファイルと実装ファイル, APIとデータ処理, UIとモデルなど
勉強会# ― エンジニアとしての解像度を高めるための勉強会

ポリシーと実装の…

GoFのストラテジーパターンもそれ

  • やりたいことに対して実装を柔軟に切り替えられる
  • 右図のポリシーは変更不要で実装を変更でき、提供内容を変化させられる
  • 実装は独立しているので、他アプリにも流用しやすい

1:書籍『オブジェクト指向における再利用のためのデザインパターン』の4人の共著者のこと。Gang of Four(4人のギャング)と呼ばれる

勉強会# ― エンジニアとしての解像度を高めるための勉強会

インターフェースと実装の...

  • 利用者はインターフェースだけを知っていれば良い
  • 外部設計と内部設計の違いを意識する
    • 外部設計(インターフェース): 何をするか
    • 内部設計(実装): どうやって実現するか
勉強会# ― エンジニアとしての解像度を高めるための勉強会

まとめ

  • ポリシーと実装の分離
    • 実装しようとしているものがアプリ独自のものか、他システムにも転用できるようなものかに着目して分けること
  • インターフェースと実装の分離
    • 「何をするものか」と「どういう実装になっているか」に着目してソースコードを分けること
勉強会# ― エンジニアとしての解像度を高めるための勉強会

演習

  1. 各社の国語辞典の役割に注目し、インターフェースと実装に分けてみましょう
  2. PCの印刷機能について注目し、ポリシーと実装に分けてみましょう

例:

鏡をインターフェースと実装に分けると…

  • インターフェース: 入射光を反射させる、映像を映す
  • 実装: 材質、反射率、凹面鏡、装飾、女王様からの質問回答機能

ソフトウェアアーキテクチャ ― ソフトウェア開発のためのパターン体系: https://www.amazon.co.jp/dp/4764902834

ライブラリ視点と、もう少し具体的なクラスの視点

クリーンアーキテクチャのユースケース層と下位層(インターフェースアダプターやドライバー)との関係でもある

プリンタドライバだとすると、画像データやPDFなど様々なデータを同じラスター画像として変換する部分がポリシーの部分、プリンタ機種ごとに異なる処理やドライバの部分が実装

ポリシーと実装については先日のエンジンを考えると良いかもしれない。車体側のエンジンマウントがポリシーで、載せるエンジンの種類が実装。エンジンが変えられないと困る。もし変えられないと、藤原拓海も須藤京一のランエボⅢにいろは坂で再戦して勝つどころか86を手放すことになっていたかもしれないわけで、重要さも分かると思う

外から見て何をするか、という視点は重要になる。抽象化を活用するなどして「つまりこういうこと」を見いだせないと。MBOで目標を設定する再にも、ゴールとなる状態を表す場所に「〜によって〇〇をする」と手段が混じっていることがある。核は何をするものなのか、外から見てそれは何をするのかが意識できるようになると良い

余談になるが、インターフェースと実装クラスに分けたとき、外から触るのはインターフェースだけにすることに注意してほしい。 よくあるのが継承関係にあるParentとChildA, ChildBに対して、使うときにParentではなくChildA, ChildBを見てしまっているケース。 これはリスコフの置換原則にも違反するので要注意。 継承関係のあるクラスにおいて、 - 子クラスを意識するのはオブジェクトを作成するときだけ - 使うときは親クラスだけを見る。子クラスは一切触らない というソースコードにすること

* アプリとして何かを作る時に、実装しようとしているものがアプリ独自のものか、他システムにも転用できるようなものかに着目して分けること

モジュールなど一塊の機能を作る時に、「何をするものか」と「どういう実装になっているか」に着目して分けること

国語辞典: インターフェース=単語/連語/句の意味や用例を提示すること 実装=説明の仕方や解釈の違い、フォントや色遣い、装丁、デジタル/紙