Search on the blog

2014年8月2日土曜日

エンジニア日記(2)サードパーティのAPIが変わった

 最近、セキュリティ上の関係で使用しているサードパーティのライブラリを急遽バージョンアップすることになった。バージョンアップするとライブラリが提供するコンテナの型や、APIがごっそり変更になってしまい、それらを使用している箇所をすべて書き換えなければいけなくなった。

話を単純化して例を示すと以下のような感じ。もともと
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 件のコメント:

コメントを投稿