是否有一个很好的经验法则或测试我可以执行以确定方法或字段是否属于类?如何识别会员何时不属于?
我发现在面向对象设计中我唯一最大的绊脚石就是试图弄清楚究竟是什么.似乎有太多的案例答案是:"它可以在这里或那里."
这是我正在努力解决的事情的一个简单例子:
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
Run Code Online (Sandbox Code Playgroud)
该ITDepartment对象管理两组Employees...但它应该知道Employees有技能吗?应该AddSkillToGroup重新安置一个方法吗?
编辑:
到目前为止,共识似乎是IT部门不应该了解员工的技能.我将扮演魔鬼的拥护者,以说明我的混乱发挥作用.
IT部门由两个Employee集合组成.它不应该能够委托给那些收藏品吗?AddSkill方法仍属于Employee类.IT部门只是指示其员工团队为每个成员添加技能.
看看SOLID原则。这些将为您提供有关方法所属位置的指导。
编辑
“[IT部门]不应该能够委托这些收集项目吗?”
“ITDepartment 类可以通过其组成的 List(Of Employee) 来“穿透”并委托给 Employee 类(就像它在上面调用 e.AddSkill 时所做的那样)。”
是的。
委托是面向对象编程的工作原理。您将详细信息委托给单一责任类。您委托实现,这样您就可以依赖抽象而不是实现。
顺便说一句,AddSkillToGroup是私有的,这令人困惑。它不会隐藏任何有可能改变的实现细节。没有理由将其保密。[private 经常被过度使用和使用不当。非常非常少的事情应该是私人的;并且只有在绝对必要时才应将其声明为私有。]
由于实现已委托给 Employee,因此AddSkillToGroup不是此类的实现细节。