作成したいくつかのアプリケーション (スクレーパー) を 1 つのアプリケーションにリファクタリングしています。TwitterScraper
、 などのスクレーパーがいくつかありますFacebookScraper
。名前は、問題をよりよく説明するためのものです。
それらのスクレーパーを使用して人を取得したいとしましょう。各スクレーパーでさまざまな方法を使用して検索できます。たとえば、Facebook では、名前、年齢などで検索することも、単に特定のグループのすべてのユーザーを取得することもできます。つまり、そこで検索するには 2 つの方法があります。同じことは Twitter などでも起こりえます...
以下のデザインを考えました。
public interface IScraper {
IEnumerable<User> Search(IParameter parameters);
}
そして持っています:
public class FacebookGroupsScraper : IScraper {
public IEnumerable<User> Search(IParameter parameters) {
//... search here using the group url, etc.
}
}
public class FacebookOtherScraper : IScraper {
public IEnumerable<User> Search(IParameter parameters) {
//... search here using the name, age, country, or whatever...
}
}
しかし、私は間違いなくLiskov Substitution Principleに違反しています。なぜなら、各メソッドで次のようなことをしなければならないからです:
public class FacebookOtherScraper : IScraper {
public IEnumerable<User> Search(IParameter parameters) {
var p = parameters as FacebookOtherParameter;
//We can only work here with the expected parameters
//(FacebookOtherParameter class in this case)
}
}
それを設計するための良い方法は何でしょうか?