2009-02-25 59 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()。

我想你是由代码气味决定的。特别是过长的参数列表;到达其他物体内部。你也可以尝试一下,看看你能否比以前更私密。

寻找方法,或方法集合&成员在一个类内形成一个连贯的子组 - 它们已经成熟,可以重新定位到它们自己的类中。

相关问题