1

作成したいくつかのアプリケーション (スクレーパー) を 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)
    }
}

それを設計するための良い方法は何でしょうか?

4

2 に答える 2

0

私は通常、この場合にジェネリックを行います。(以下のコードはコンパイルできない可能性があることに注意してください)

public interface IScraper<T> where T : IParameter
{
    IEnumerable<User> Search(T parameters);
}

public class FacebookParameter : IParameter{
    public string GroupUrl{ get; set; }
}

public class FacebookGroupsScraper : IScraper<FacebookParameter> {
    public IEnumerable<User> Search(FacebookParameter parameters) {
        //... search here using the group url, etc.
    }
}

ただし、消費者レベルでの使用方法を忘れていました。

于 2013-09-18T01:25:24.233 に答える