2009-02-25 60 views
5

有沒有一個很好的經驗法則或測試,我可以執行以確定一個方法或領域是否屬於一個類?如何識別一個成員不屬於什麼時候?是否有啓發式來確定方法或字段是否屬於類中?

我發現我在面向對象設計中唯一最大的絆腳石是試圖弄清楚什麼去了哪裏。似乎有太多的情況,答案是:「它可以在這裏那裏。」

這裏的事情,我掙扎類型的一個簡單的例子:

Public Class ITDepartment 

    Private _sysadmins As List(Of Employee) 
    Private _developers As List(Of Employee) 

    // properties, public stuff... 

    Private Sub AddSkillToGroup(ByVal emps As List(Of Employee), ByVal skill As Skill) 
     For Each e As Employee In emps 
      e.AddSkill(skill) 
     Next 
    End Sub 

End Class 

ITDepartment對象管理的2組Employees ...但它應該知道,Employees有技能?像AddSkillToGroup這樣的方法應該重新定位嗎?

編輯:

看來這個共識到目前爲止是,ITDepartment不應該瞭解員工的技能。我會扮演魔鬼的擁護者來說明我的困惑在哪裏發揮作用。

IT部門由兩個員工集合組成。它不應該能夠委託給那些收集物品嗎? AddSkill方法仍然屬於Employee類。 IT部門只是指示其員工組爲每個成員添加技能。

+0

你問如果你應該委託?答案總是「是」。還是你問如何委託?如果是這樣,請解決您的問題。還是你問關於代表團的其他問題? – 2009-02-25 19:32:47

+0

我想知道ITDepartment類是否可以「通過」,並通過由它組成的List(Employee)來委託給Employee類(就像它在調用上面的e.AddSkill時所做的那樣)。 – 2009-02-25 20:34:59

回答

3

看看SOLID的原則。這些將爲您提供一種方法所屬的指導。


編輯

「應該不是[ITDepartment]可以委託給這些藏品?」

「[是] ITDepartment類可以」通過「並通過List(Of Employee)委託給Employee類,它是由它組成的(就像它在調用上面的e.AddSkill時所做的那樣)。 「

是的。

代表團是面向對象編程的工作原理。您將細節委託給單一責任人類。您委託實現,以便您可以依賴抽象而不是實現。

順便說一句,AddSkillToGroup是私人的,這是混亂。它並不隱藏任何可能改變的實現細節。這是沒有理由的私人。 [私人往往被過度使用和使用不當。很少,應該是私人的;只有在絕對必要時才應聲明爲私人。]

由於實施已委派給員工,因此AddSkillToGroup不是此類的實施細節。

+0

它是私有的,因爲它是一個實現細節。它可以是一個名爲`TrainEmployees()`的公共方法的「幫手」方法,它增加了技能並頒發了證書或其他東西。我不明白爲什麼這很奇怪。 – 2009-02-26 15:50:37

4

我傾向於使List(Of Employee)成爲它自己的類,因此它可以有自己的方法AddSkill()。

我想你是由代碼氣味決定的。特別是過長的參數列表;到達其他物體內部。你也可以嘗試一下,看看你能否比以前更私密。

尋找方法,或方法集合&成員在一個類內形成一個連貫的子組 - 它們已經成熟,可以重新定位到它們自己的類中。

相關問題