我試圖設計一個拼圖應用程序,使用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