以下类在Java中显示Composition
的概念:
//Imagine constructors, accessors & mutators has already been created..
class Person{
private String name;
private Job job; //Person has Job
}
class Job{
private String name;
private double salary;
}
我的问题是:如果我想从Person获得薪水,以下哪两个选项是更好的做法?
1。找人的工作,然后从人的工作中获得工资
System.out.println( person.getJob().getSalary() );
2。亲自创建一个getSalary方法,所以我可以这样做:
System.out.println(person.getSalary());
创建一种从工作中获得薪水的方法。
class Person{
private String name;
private Job job;
public static double getSalary(){ //Is doing this redundant and bad practice?
job.getSalary();
}
}
答案 0 :(得分:1)
方法2比方法1好一点,因为从一个人获得薪水的代码不依赖于任何类型的Person->Salary
关系实现。您可以自由更改薪水的计算方式。在现实生活中,你可以问一个人什么是薪水而不了解他的工作。在你的代码中,骗子甚至可以为他返回想象中的薪水等等。
老实说,我坚持认为方法1不能以任何方式被视为坏或错,在常见情况下它只有一点点缺点......
答案 1 :(得分:0)
一般而且我个人喜欢方法1,因为每次重定向(如何调用这个?)会使代码变得更复杂一些。想象一下,整个代码对每个关系都有重定向。即使它更难沟通:'你的意思是Person.Salary还是Person.Job.Salary?'。
但是在你的例子中,我更喜欢方法2,因为我可以想象扩展Person除了养老金之外还有多个工作或工作。
答案 2 :(得分:0)
有一个"法律"说应该避免使用1号选项,它是Demeter's law又名最少知识的原则
特别是
对象 A 可以请求对象的服务(调用方法) 实例 B ,但是对象A不应该通过"对象 B 访问另一个对象 C ,以请求其服务
HTH, 卡罗