我可以执行一个很好的经验法则或测试来确定方法或字段是否属于某个类吗?如何识别成员何时不属于?
我发现在面向对象设计中我唯一最大的绊脚石就是试图弄清楚究竟是什么。似乎有太多的案例答案是:“它可以在那里或那里。”
以下是我正在努力解决的事情类型的快速示例:
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部门不应该了解员工的技能。我将扮演魔鬼的拥护者,以说明我的混乱发挥作用。
IT部门由两个Employee集合组成。它不应该能够委托给那些收藏品吗? AddSkill方法仍属于Employee类。 IT部门只是指示其员工团队为每个成员添加技能。
答案 0 :(得分:4)
此时我倾向于将List(Of Employee)
放入其自己的类中,以便它可以拥有自己的方法AddSkill()。
我猜你是通过代码闻起来的。特别是过长的论点清单;到达其他物体。您也可以尝试一下,看看您是否可以比以前更多地私有化。
注意方法或方法集合&在一个班级中形成一个连贯的小组的成员 - 他们已经适合搬迁到他们自己的班级。
答案 1 :(得分:3)
查看SOLID原则。这些将为您提供方法所属的指导。
修改强>
“不应该[IT部门]能够委托给那些收藏品吗?”
“ITApartment类是否可以”通过“并通过它所组成的List(Of Employee)委托给Employee类(就像上面调用e.AddSkill时所做的那样)。”
是
代表团是OO编程的工作原理。您将详细信息委托给单一责任类。您委派实现,因此您可以依赖抽象而不是实现。
BTW,AddSkillToGroup
是私有的,这令人困惑。它并没有隐藏任何有可能改变的实现细节。这没有理由是私密的。 [私人经常被过度使用并且使用不当。非常非常少应该是私人的;只有在绝对必要时才应将其声明为私人。]
由于已将实施委托给Employee,AddSkillToGroup
不是此类的实现细节。