我正在将我创建的几个应用程序(刮板)重构为一个应用程序。有一些刮板,如TwitterScraper
,FacebookScraper
等。名称只是为了更好地解释问题。
假设我想使用这些刮板检索人。我们可以在每个爬虫中使用不同的方式进行搜索。例如,在 Facebook 中,我们可以按姓名、年龄等搜索……或者简单地获取某个特定组中的所有用户,这意味着我们有两种搜索方式。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)
}
}
设计它的好方法是什么?