2010-11-11 75 views
0

我正在處理一個案例日誌系統。每個案例都可以附帶註釋,因此我將創建一個Case類和一個Comment類,並在Case類中嵌入一個Comment對象。與內部對象接口

我在考慮如何爲嵌入式評論對象提供接口。我可以讓它成爲公共成員,讓程序員直接訪問它($case -> comment -> addComment()),或者將其設置爲私有,並將方法放在Case類中以通過Comment對象提供對評論的訪問(p。ublic function addComment() { return ($this -> comment -> addComment()); })。

考慮它,後一種風格意味着Case對象變成依賴於Comment對象。但是,在前一種情況下,程序員可能可以執行諸如使Case對象的註釋屬性不屬於該情況的註釋屬性,或者甚至是不屬於註釋對象的項目!

在這兩種方法中,這被認爲是最佳實踐?

回答

1

我不正是明白你的意思,但是...

我想你需要的東西是這樣的:

class Case { 
    private $comment; 

    public function getComment() { 
     // Add some checks if necessary 
     ... 
     return $this->comment; 
    } 

    public function addComment(Comment $comment) { 
     // Add some checks if necessary 
     ...   
     $this->comment = $comment; 
    } 
} 

您也可以選擇讓你的$評論屬性格式保護。如果你想擴展對象,這是特別有用的。

總是大量使用封裝,這是OOP的最大優點之一。建立一個受保護的或私有的類屬性總是明智的。沒有它,當你設置屬性時,你不能強制檢查它。請記住,如果您將一個物業公開,每個類都可以在不進行任何檢查的情況下訪問和修改它。想想那可能的後果!

$評論是不是一個原始類型,其評論CLAS

好運的一個實例的引用!

@Gordon:沒關係。即使是評論的情況下,你把它公開,你仍然可以做到這一點是這樣的:

// $Case is a Case object, doh ;)... 
$Case->comment = "Just a string value"; 

,突然你的評論是一種最原始的,而你希望評論類的實例...這可能會給你幾個錯誤。如果您將其設置爲受保護的或私有屬性,則在該類之外的代碼行是不可能的。然後,你不得不使用一個setter爲它想:

public function setComment(Comment $comment) { 
    ... 
} 

你的函數需要一個評論,並在別的給出將拋出一個錯誤。這將確保你的對象是一致的。

@Gordon:這不是您在Case類中構建的Comment類方法。上述方法僅適用於您的Case類。他們唯一做的事情是獲取屬於Case類的Comment對象,並且設置屬於Case類的Comment對象。一旦你用getter成功地檢索了Comment對象,就可以觸發Comment類中定義的所有公共方法。所以它對Comment對象本身沒有任何作用。

您的評論仍然完全獨立。這些對象之間的關係(很可能)保存在Case對象的表中。你的案例類是唯一知道關係的類。因此,您仍可以將您的評論類用於其他目的。

你的案例類需要以某種方式知道你的評論類,這是要走的路!

順便說一句,考慮一個多對多的關係。我假設一個案例可以有更多的一個評論。

祝你好運!

+0

$ comment不是原始類型,它是對註釋類實例的引用 – GordonM 2010-11-11 08:03:02

+0

這將建議將註釋屬性設置爲私有類,並將註釋類方法包裝到宿主類中。我理解這給出的優點,但是雖然我對OOP相對陌生,但我的理解是,對象之外的其他對象之間的依賴關係被認爲是不好的? – GordonM 2010-11-11 09:15:54

+0

多對多需求意味着某種內部評論集合。可能不僅僅是對私人評論對象的引用,您可能希望擁有您的Case方法可以管理的一系列評論。您可以修改您的個案,因爲有人建議添加和刪除收藏中的評論。您可能還需要通過ID或評論列表檢索特定評論的方法。你可能想要自己構建你的評論類,也許要進行單元測試,並讓它工作。然後添加Case方法來管理這些方法的集合。 – 2010-11-11 14:46:17

1

Case類應該有自己的方法來添加/刪除註釋。這可以讓您改變未來評論的實施方式。你可以讓這些方法簡單地將調用包裝到你的評論類中,但是將來完全改變它。