web-dev-qa-db-ja.com

封印されたクラスを使用する場合の低結合?

通常、クラスを分離しようとするときは、制御の反転を使用します。最近、コンポーネントが封印されているサードパーティのライブラリを使用しています。この状況に対処するためのデザインパターンはありますか?それらには封印された複数のコンポーネントクラスがあり、私はそれらを頻繁に使用する必要があります。私はそれを継承し、それが封印されてそれが不可能であることに気付くまで、それを操作するためのインターフェースを与えようとしていました。

ライブラリは大きく変更されないため(メジャーバージョンのみ)、この特定のシナリオでクラスを結合したままにしておくことで簡単に回避できましたが、そうでない場合について疑問に思いました。

サードパーティの封印されたクラスを使用する場合、コード内の結合を低く保つにはどうすればよいですか?

4
Shelby115

いくつかのコメントが述べているように、ライブラリを誤って使用しているか、適切に設計されたライブラリではない可能性があります。しかし、これを無視すると、バリエーションファサードパターンが適切であるように思われます。

私はあなたのアプリケーションについて十分な情報を持っていませんが、頭のてっぺんから2つのアプローチを考えることができます。

シンプル

class MyObject
{
     private _libraryObject;
     public MyObject(LibraryObject source)
     {
           _libraryObject = source;
     }

     public MyProperty1
     {
         get { return _libraryObject.Property1; }
         set { _libraryObject.Property1 = value; }
     }
 }

複雑ですが、さらに分離されています

//Inside repository class
GetObject()
{
     MyObject myObject = new MyObject();
     Mapper.Map(libraryObject, myObject); //Translate a LibraryObject to MyObject
     return myObject;
}

これで、継承を含め、このクラスでやりたいことが何でもできるようになりました。

2
TheCatWhisperer