2012-03-07 40 views
3

我有這個類,嘗試從Google地圖Web服務API獲取數據的多種方法。定期打破代碼的設計模式?

如果一個方法失敗,它會嘗試另一個方法。等

像這樣(僞代碼):

FUNCTION FIND_ADDRESS(house_number, postcode) 

    get location co-ordinates for postcode from local database 

    if location returns false, try getting location from maps service 

    if map service fails, return "postcode not found", exit 

    get address components using location co-ordinates 

    if address components doesn't contain street name, return street name not found, exit 

    if street name exists, get all address_components + location for house number, street_name and postcode 

    if no results, try again without the postcode, 

    if still no results, return location co-ordinates for postcode found earlier in code 

END 

正如你所看到的,這是非常程序!

我在想方法來改進代碼,我已經外部化了所有可重用的代碼,添加了異常處理,以確切地知道代碼在哪裏失敗。

但我想知道是否有人知道設計模式或類似的解決方案。

因爲基本上我想的東西,如果失敗嘗試別的東西,如果它失敗,其他依此類推,直到我得到一個完整的地址

任何想法想什麼?

回答

5

你可能要考慮Chain of Responsibility.

在面向對象設計,鏈方面的責任的模式是由命令對象的來源和一系列處理對象的設計模式。每個處理對象都包含用於定義它可以處理的命令對象類型的邏輯;其餘的被傳遞給鏈中的下一個處理對象。還有一種機制可以將新的處理對象添加到該鏈的末尾。

所以不是有許多的if/else或try/catch塊,你這樣做

$finderChain = new AddressFinder; 
$finder 
    ->add(new LocalFinder) 
    ->add(new MapsService) 
    ->add(…); 

$result = $finder->find($houseNo, $postCode); 

在內部,你會送$的HouseNo和$郵政編碼爲LocalFinder。如果它沒有找到想要的數據,則鏈中的下一個元素的任務是嘗試查找所需的數據。重複此操作直到達到鏈的末端或生成所需的數據。

0

使用嵌套try{} catch{}

-1

你只有6「如果」的是沒有太多可言,我用的是最多需要50個,如果的和程序工作就好了代碼工作。沒有適合您當前問題的軟件模式概念。 DP不是一個特定問題的解決方案,它是一個解決經常性問題的概念。閱讀模式可以幫助我個人學習更多的解決方案,甚至社會問題,編碼模式,流程建模,結對編程等社會問題,它提供了很多深思熟慮的想法。

+2

Dude ...總有一種更好的方法可以做正確的事情:) :) – 2012-03-07 09:27:42

+1

-1我對這個答案有幾個問題1)第一部分(ifs的數量)與問題無關 - 作者明確要求見解如何去關於實施具備回退功能的處理程序2)「沒有軟件模式」僅僅因爲你無法想象而是不真實的。相反,有 - 見戈登的答案。爲什麼不等到人們提出這樣的答案之前想出什麼? 3)「DP不是一個特定問題的解決方案......」當DPs解決了一類反覆出現的問題後,你終於將它們應用於一個特定的問題,不是嗎? – 2012-03-07 09:37:33

2

我會嘗試一些周圍像:

public function getAddress($houseNumber,$postCode){ 

    // as far as i know, if the function returns a LOOSE true, the condition is true 
    if($data = location.coordinates()){ 

     // $data was returned a value, do additional parsing here 

     // if you need to return early because of an error, you can in here 

     //if all proccesses deem your data valid, return the data you want returned 
     if(processedAsValid){ 
      return $some_value; 
     } 
    } 

    //if the previous didn't return, it goes here. $data is overwritten 
    //or you can use some other variable name 
    if($data = maps.service()){ 

     //some more parsing 

     return $some_other_data; 
    } 

    // if non of the above was satisfied (and thus none returned yet), return a FALSE 
    return FALSE; 

} 
+0

我認爲這樣更容易閱讀。有道理,謝謝! :) – 2012-03-07 09:19:45

2

它不是一個它是程序性的問題/ OOP /不管。

如果你很容易理解和維護代碼,那麼很好。如果你能在6個月內做到這一點,那就更好了。

你的功能塊看起來很好 - 只要注意你的嵌套有多深。越淺越好。