我试图设计一个拼图应用程序,使用bdd
,ddd
和oop
。这个应用程序的目的是检查页面是否启动,如果它包含某些元素或不包括链接,图像等DDD:建模拼图应用程序
使用BDD,写我的场景,我想出了像Page
类, Link
,Image
等,其具有如url
,src
,alt
的性质。
,我有是我看到两种可能性,检查抗住网站的问题:1。 使用另一个类,一类crawler
,这将使用包含在前面的类中的数据和打网络来检查页面时,如果它们所包含的预期元件等:
$crawler = new Crawler();
$page = new Page($url);
$pageReturned = $crawler->get($page);
if ($pageReturned->isUp()) {
// continue with the checking of element...
$image = new Image($src, $alt);
if ($pageReturned->contains($image)) {
// check other things
} else {
// image not found on the page
}
}
具有包括在类本身这种“爬行”行为(其看起来更像
oop
我),这意味着我会问页面是否已启动,如果它包含给定元素等:$page = new Page($url); if ($page->isUp()) { $image = new Image($src, $alt); if ($page->contains($image)) { // check other things } else { // image not found on the page } }
我会尝试使用#2,但我想知道我怎么可以这样做,而不必依赖于某个库的爬行类。我希望能够稍后在不同的库之间切换,如goutte
或guzzle
甚至直接使用curl
。
也许我错过了oop
这一点......也许有更好/更聪明的做法,因此我的问题。 :)
这就是SOLID中的D起作用的地方 - 依赖性倒置。更高层次的课程只应该依赖于抽象,而不是具体的课程。如果各种爬行实现实现一个公共接口,并且调用代码仅对此接口起作用 - 则可以根据需要注入所需的具体实现。 – dbugger
为什么要打扰一个复杂的领域模型?问题中唯一真正的目标是“爬虫”,它在执行“爬行”行为时需要保持状态。其余的“对象”只是数据结构。 “页面”是否有转换的状态?它的行为在其一生中是否有变化?如果不是,它只是一个数据结构,将被你的'Crawler'使用。 – 2016-06-01 20:39:29