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重新定位这样的方法吗?

编辑:

到目前为止,似乎一致认为 IT 部门不应该了解员工的技能。我将扮演恶魔的拥护者,以说明我的困惑在哪里起作用。

ITDepartment 由两个 Employee 集合组成。它不应该能够委托给那些收集项目吗?AddSkill 方法仍然属于 Employee 类。IT 部门只是指示其员工组为其每个成员添加一项技能。

4

2 回答 2

4

在这一点上,我倾向于制作List(Of Employee)自己的类,以便它可以拥有自己的方法 AddSkill()。

我猜你是通过代码气味来决定的。特别是过长的参数列表;到达其他物体内部。您也可以尝试一下,看看您是否可以将更多内容设为私有。

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

于 2009-02-25T16:22:06.333 回答
3

查看SOLID原则。这些将为您提供有关方法所属位置的指导。


编辑

“[ITDepartment] 不应该能够委托给那些收集项目吗?”

“[是否] ITDepartment 类可以通过它所组成的 List(Of Employee) 来“通过”并委托给 Employee 类(就像它在上面调用 e.AddSkill 时所做的那样)。“

是的。

委托是面向对象编程的工作方式。您将详细信息委托给单一责任类。您委托实现,因此您可以依赖抽象而不是实现。

顺便说一句,AddSkillToGroup是私人的,这令人困惑。它不会隐藏任何可能更改的实现细节。这没有理由保密。[private 经常被过度使用和不当使用。非常非常少应该是私有的;并且仅在绝对必要时才应将其声明为私有。]

由于实现已委托给 Employee,AddSkillToGroup因此不是此类的实现细节。

于 2009-02-25T16:09:03.307 回答