話を単純化して例を示すと以下のような感じ。もともと
int main() { ThirdPartysContainer<string> container; container["hoge"] = "fuga"; cout << container["hoge"] << endl; return 0; }のようにbraketsで要素にアクセスすることができるThirdPartyContainerという(key, value)型のクラスが提供されていた。
しかしバージョンアップすると、bracketsを使ったアクセスが出来なくなり、代わりにgetter/setterを使わなければいけなくなった。
int main() { ThirdPartysContainer<string> container; container.set("hoge", "fuga"); cout << container.get("hoge") << endl; return 0; }で、ThirdPartyContainerクラスを使っている箇所を新しいAPIを使うように書き換えろと。
ThirdPartyContainerクラスはいろいろな箇所で使われていて、書き換えるソースは膨大な量になった。さらに、書き換えたソースは動作検証しないといけない。
こんなことにならないようにするためには、サードパーティのクラスを隠蔽して、個々の機能からは見えないようにしておくべきだった。アダプターパターンを使って、将来変更される可能性があるサードパーティのクラスをラッピングしておくべきだったのだ。
template <typename T> class ThirdPartysContainerWrapper { ThirdPartysContainer<T> contaier; public: T getData(const string key) { return contaier[key]; } void setData(const string key, const T val) { contaier[key] = val; } };みたいなクラスを作っておいて、個別のクラスからは、
int main() { ThirdPartysContainerWrapper<string> container; container.setData("hoge", "fuga"); cout << container.getData("hoge") << endl; return 0; }のような使い方をするようにしておけば、改修箇所はラッパークラスだけでよかったのになと。
0 件のコメント:
コメントを投稿