機能を拡張する場合のパターンについて
C++ というわけではないけれど、C++ の機能を念頭においているので
本記事の前提条件は以下の通りです。
- 初心者向け
- とは言っても、何らかのプログラムはそれなりに書けるけど、C とか C++ はちょっと、という人向け
- ざっくり概要しか説明しないので細かいことは気にしないでいただきたい
- Visual Studio 2013 くらい~
- Windowsプログラム (CUI, GUI)
- コードの検証
- 開発環境: Visual Studio 2022, x64, Release ビルド
- 実行環境: Windows 10
- 本記事は上から順番に読む前提となっている
内容としては言語も OS もほぼ関係ないものとなっているが、C++ を念頭においている、ということでご承知おき頂きたい。
機能拡張のパターン
例えば、下記の機能を持った機械があるとする。
- 洗う
- 切る
- 焼く
これをどう拡張するか。
出来ることを増やす
ようするに、元々あった機能に同列の機能を追加する場合。
例えば下記の機能を追加する場合。
- 煮る
- 蒸す
- 混ぜる
いわゆる「継承」という手を使って、拡張するのがよさそう。
元々あった機能もそのまま利用できる。
拡張の仕方によって、お菓子作り向け(「ふるいにかける」「泡立てる」)とか、魚料理向け(「血抜きをする」「鱗をとる」)とかのバリエーションができそう。
元の機能を使った新しい機能を作る
- お好み焼きを作る
- 焼きそばを作る
- たこ焼きを作る
元の機械を新しい機械の中に埋め込み、新しい機械は必要な機能をもとの機械に委譲、必要な処理を行う。
いわゆる「コンポジション」ですかね。
元々あった機能を内部的に再利用しているということになりますか。
機械の埋め込み方をカートリッジ式にすると集約 (Aggregation) ということになりますか。(こうすると前述の、出来ることを増やした機械、を使える可能性もありますが、これを実現するためにはまた別の拡張方法を利用する必要があるかもしれません)
元の機能をグレードアップする
- 超高圧洗浄する
- レーザーで切る
- 1万℃で焼く
機械は大型化して別の施設においてあるが、制御盤が同じなので、元の機械の「焼く」ボタンを押すと1万℃で何かを焼き始めるということになる。
「操作方法」を再利用していることになる。
仮想関数を使った継承をすることになりそう(ポリモーフィズム)。
ちなみに「洗う」「切る」「焼く」の3つのボタンのある制御盤が元の機械からも分離できる構造だったとしたら、その制御盤はインターフェース(全てのメンバ関数が純粋仮想関数の抽象クラス)ということになりますかね。
委譲。...以上!