2009-09-02 88 views
0

我正在使用CodeIgniter,並且我有一個取得模型讓我們說所有的食譜,你可以設置偏移量和限制。我是否應該擴展該功能以檢索單個配方?這是不錯的做法嗎?我是否應該實現多功能功能?

回答

2

您的目標應該是儘量減少代碼重複,同時最大限度地提高可理解性。這兩者往往不一致。您可以最終重複代碼最少,但有12個可選參數給函數。因此,一些常規提示:

  • 考慮將通用功能打包到第三個函數中,然後這兩個函數都可以根據需要調用它;
  • 如果函數的參數超過3-4個參數,則使用參數或參數數組;
  • 代碼重複將被最小化,但不能完全消除。有時最明確的解決方案涉及一定量的代碼重複;
  • 函數或對象的用途應該清楚。如果它根據參數完全改變,那麼你很可能會混淆人。

與您的特定情況下,我想你想要的東西,如落得:

function get_recipes($offset, $limit) { 
    // execute query and get resource 
    $ret = array(); 
    while ($row = mysql_fetch_assoc($rs)) { 
    $ret[] = build_recipe($row); 
    } 
    return $ret; 
} 

function get_recipe($id) { 
    // execute query and get row object 
    return build_recipe($row); 
} 

function build_recipe($row) { 
    // construct a recipe object from the row 
} 
+0

其實我已經合併get_recipe和get_recipes。如果設置了id並且其他參數爲null,則它只返回一個字段等。可以嗎? – alimango 2009-09-02 02:15:29

+0

我認爲這可能有點混亂,但很難說沒有具體細節。作爲一般規則,我更喜歡一種很像我所做的那樣具有明確命名功能的方案(儘管這三種方式可以命名得更好),它們使用功能分解來減少重複。 – cletus 2009-09-02 02:31:29

+1

我同意cletus將'get_recipe'與'get_recipes'分開。維護你的代碼的人更容易理解你的代碼。 – Randell 2009-09-02 02:42:33

1

在一般情況下,爲了清楚起見,功能應該做一個單一的任務。但是,「獲得N行」是一項任務 - 即使在N == 1時也是如此。所以我會說這個箱子是合格的,即該功能並非真正的「多用途」!)