我有一个关于面向对象设计的简单问题,但我在找出什么是最佳解决方案时遇到了一些困难。假设我有一个带有一些方法和相当大量属性的对象,可能是一个Employee对象。属性,如FirstName,Address等,表示数据结构。然后在Employee对象上可能有方法,比如IsDueForPromotion(),这更像是OO性质。
混合这对我来说感觉不对,我想将两者分开,但我不知道如何以一种好的方式做到这一点。我一直在考虑将所有属性数据放在一个struct中,并在employee对象中有一个内部struct对象,私有EmployeeStruct employeData ...
我不确定这是一个非常好的主意,也许我应该在同一个班级中拥有所有的方法和原则并与之相配。如果我将数据与方法分开,我是否会使事情变得复杂?
如果有人对此有任何想法,我将非常感激。
Ĵ
答案 0 :(得分:3)
OO-design的想法不是将数据和相应的方法封装在一起吗?
这里的问题是Employee对象如何知道促销的开始。我想这个方法属于某个类的其他地方,该类具有判断它的信息。非常愚蠢的例子Manager m = new Manager(); manager.IsDueForPromotion(employeeobject);
但访问Employee字段的其他方法属于此类。
我提出的关于IsDueForPromotion的问题取决于您的应用程序,以及您的员工是否仅为POJO或DTO,或者是否也可以关联更多“智能”方法。
答案 1 :(得分:1)
如果您的数据变得比行为慢,您可能想尝试访问者模式:
class Employee {
String name;
String surName;
int age;
// blah blah
// ...getters
// ...setters
// other boilerplate
void accept(EmployeeVisitor visitor) {
visitor.visitName(name);
visitor.visitAge(age);
// ...
}
}
interface EmployeeVisitor {
void visitName(String name);
void visitAge(int age);
}
使用此设计,您可以添加新操作,而无需更改 Employee类。 检查还使用规范模式。
答案 2 :(得分:0)
对象操作(方法)应该使用属性。所以我觉得将它们放在一起会更好。
如果它不需要属性,它是一种实用方法,应该定义else ware,可以在某个helper类中。
答案 3 :(得分:0)
嗯,OO是一种将属于同一位置的数据和功能分组的方法。我真的不明白为什么你会在“有大量数据时”发出异常。我能想到的唯一原因是易读性。
就我个人而言,我认为通过提供一个单独的结构来保存数据会让事情变得不必要。我也很矛盾,这是好的做法。一方面,一个类如何实现它的功能,或者存储它的数据应该是从外部世界隐藏的。另一方面,如果数据属于某个类,那么将它存储在类似结构的东西中会感觉不自然。
查看您拥有的数据并查看是否可以将其建模为较小的域对象可能会很有趣。例如,有一个Address对象,它包含street,housenumber,state,zip,country等值。这样,您的Employee对象将只保存一个Address对象。然后可以为您的Company对象等重用Address对象。
答案 4 :(得分:0)
面向对象编程的基本原理是将FirstName和Address等数据与其附带的功能(如IsDueForPromotion())进行分组。无论对象持有多少数据,它仍将保存该数据。您想要从对象中删除数据的唯一时间是它与该对象无关,例如将公司名称存储在Employee对象中时应该存储在公司对象中。