2010-09-03 50 views
8

我正在過渡到爲我所有的項目使用OOP,歷史上我創建的所有東西都非常小,OOP似乎不是一個有效的選擇,但現在它是大型項目。然而,最近我遇到了越來越多的「最佳實踐」問題,而且我無法找到答案。PHP OOP理論 - 在課堂內部或外部檢查錯誤?

例如,假設我有以下幾點:

class numbers{ 

    function __construct($number){ 
     $this->number = (int)$number; 
    } 

    function add($add){ 
     $this->added = $this->number + $add; 
    } 

    function multiply($multiply){ 
     $this->multiplied = $this->number * $multiply; 
    } 

    function minus($minus){ 
     $this->minused = $this->number - $minus; 
    } 

    function number(){ 
     return $this->number(); 
    } 
} 

現在,讓我們說,我想申請add,然後multiply然後minus。每個階段都可能失敗(我沒有在例子中包括這一點,但想象它在那裏)。這是我的問題在於,我應該做的:

$numbers = new numbers(8); 
if($numbers->add(7)){ 
    if($numbers->multiply(6)){ 
     if($numbers->minus(7){ 
      echo $numbers->number(); 
     }else{ 
      echo 'error minusing'; 
     } 
    }else{ 
     echo 'error multiplying number'; 
    } 
}else{ 
    echo 'error adding number'; 
} 

還是應該有一部分在我的構造函數,如:

class numbers{ 

    function __construct($number){ 
     $this->add(6); 
     $this->multiply(9); 
     $this->minus(7); 
     if($this->error){ 
      return false; 
     }else{ 
      return true; 
     } 
    } 

    function add($add){ 
     $this->added = $this->number + $add; 
     if(!this->added){ 
      $this->error = "couldn't be added"; 
     } 
    } 

    function multiply($multiply){ 
     $this->multiplied = $this->number * $multiply; 
     if(!this->multiplied){ 
      $this->error = "couldn't be multiplied"; 
     } 
    } 

    function minus($minus){ 
     $this->minused = $this->number - $minus; 
     if(!this->minused){ 
      $this->error = "couldn't be minused"; 
     } 
    } 

    function number(){ 
     return $this->number(); 
    } 

    function error(){ 
     return $this->error(); 
    } 

} 

,然後簡單地做:

$numbers = new numbers(5); 
if($numbers){ 
    echo $numbers->number(); 
}else{ 
    echo $numbers->error(); 
} 

對不起如果這個例子很長時間的囉嗦(也忽略了錯誤,我在這裏只是爲了描述我正在嘗試做什麼,這不是我正在使用的代碼),但是我不知道如何將短語沒有一個例子的問題。基本上,我應該在檢查課堂內部的錯誤,還是在我打電話給課堂時在外面做這些事情?

+0

@FrustratedWithFormsDesigner:爲什麼編輯?該方法被稱爲「減號」 - 在這種情況下使用動詞形式是完全可以接受的。我認爲你的編輯讓問題更加混亂,而不是更少。 – Gian 2010-09-03 14:43:54

+0

@Gian:當使用方法名稱作爲動詞時,通常最好清楚地說明你正在談論方法,而不是一般的更類似的動詞。這個:「我想要'加',然後'乘',然後'減'。」清楚地表明你在談論調用'minus'方法,而不是試圖誤用「minus」這個詞作爲動詞。 – FrustratedWithFormsDesigner 2010-09-03 14:59:10

+3

在英語世界中,它被稱爲減法。減號是一個標誌。 – 2010-09-03 15:10:12

回答

11

強化類內更新的一致性(即任何時候方法可以改變類的內部狀態,檢查輸入)幾乎總是有意義的。然後使用exceptions將其作爲調用者的問題,如果該輸入不正確,或者該操作違反某個類不變量。

+3

+1。說出比我的(現在已刪除的)響應更好的東西。我還沒有喝過咖啡。 – 2010-09-03 14:47:04

0

在類內完成的錯誤檢查應該考慮到類的方法將失敗的可能性。換句話說,如果你的數字類有一個除法,它應該檢查以確保分母不是零。

在類的實例(類外部)上執行的錯誤檢查應該驗證是否返回了屬性或類方法的正確結果。由於通常情況下這不應該發生在設計良好的班級,您通常會檢查極端情況。

但是,當您開始有一個跟蹤多個事物的類(例如您的案例)時,我通常會進一步將該類分開。創建用於處理數學函數的類,然後讓你的數字類使用這些數學類。通過這種方式,您可以更好地分離問題,更簡潔的代碼和更輕鬆的測試。

+0

那麼你應該提高我的答案。對於我所做的一切,我肯定會爲每一件可能出錯的事情添加檢查(除了內存不足之類的瘋狂事情)。 – 2010-09-03 15:11:06

0

就我個人而言,我會遠離你想要在第二個例子中的構造函數中做的事情。它硬編碼實施,並且違反了information hiding principal。否則,不知道是什麼類的內部呢,當你做$num = new Number(8);,很難理解爲什麼你要47回來......這也違反了沒有magic number principal ......

至於方法,他們看起來罰款我。您可能想在這些情況下拋出異常或返回布爾值。你選擇的是一個比這裏討論的要多得多的因素(比如你的偏好,班級正在做什麼,約定等等)...

哦,你有幾個無限循環問題你的班。function number()應該是:

function number() { 
    return $this->number; 
} 

與同爲error() ...

相關問題