初めての書き込みなので何を書こうか迷うのですが、ありきたりな話題で。
きわめて現実に近いフィクションの話です(仕事ではC++使用禁止、使用できる部署でもtemplateは使用禁止らしいから、デバドラでデバイスオブジェクトをコンテナに突っ込むなんて論外)。
職場では主にATAのドライバとファイルシステム関係の作業をしているのですが(人が作ったものの改造)、ATAドライバへ対応コントローラを追加する必要が出ました。
ハードディスクやDVDドライブへは簡単に書くと
アプリケーション→ファイルシステム→ATAドライバ→ATAマクロ(コントローラ)→HDD/DVD
の経路でアクセスすることになります。
で、ATAドライバから見るとATAマクロがありHDD/DVDが有る訳です。ここにコントローラが追加されるのだから、最初はコントローラオブジェクトを追加し、ATAドライバからはコントローラ経由でデバイスへアクセスするのが普通の流れだなと考えていたわけです。
こんな感じ
class ata_device {
// 実装
};
class ata_macro {??????? // ATAマクロの基底クラス
??? ata_device device[2];??? // Master/Slaveで2台分
}
vector macro;
このように定義するとmacro[n].device[m]みたいにHDD/DVDへアクセスすることになる訳ですよね。
これは物理的な機器接続を考えると自然なんですが、デバイスが1台しか接続されていないコントローラや、物理的に1台しか接続できないコントローラがあったりすると、上位層(ファイルシステム)に対して連番もしくは連続名(/dev/hda,/dev/hdbみたいに)にならないのでちょっと面白くないです。
そんなことを考えていたときに職場のとある人に話してみたら、デバイス主体で考えろと言われました。
つまり、
class ata_device {
??? ata_macro& macro;
}
vector device;
これで、アクティブなデバイスのみをコンテナに入れると。
自分的にはこの実装は
アプリケーション→ファイルシステム→HDD/DVD→ATAマクロ
となっているようで非常に気持ちが悪かったのですが、上位層から見ればHDD/DVDへアクセス出来れば良くてATAマクロなんて関係ないからこの実装の方が良いと思えてきました。ストラテジパターンみたいなものなのかな(違うかも)。
こういうの書くの初めてなのでわかり難かったらごめんなさい。
# あれ?名前が出てない