我正在修复系统的OOP设计,因为我认为架构存在缺陷。我要重写正确的面向对象应用程序的类,例如它的继承,接口和聚合/组合,以便正确重用代码和关系。
说我有课程班,学科班,学年班,年级班,我想将HAS-A
(聚合)的概念应用为
课程HAS-A
主题
课程HAS-A
年级
课程HAS-A
学年
主题HAS-A
学年
主题HAS-A
年级
这样就足够了:
public class Curriculum {
SchoolYear schoolYear = new SchoolYear();
YearLevel yearLevel = new YearLevel();
}
或使用构造函数初始化它:
public class Curriculum {
SchoolYear schoolYear;
YearLevel yearLevel;
public Curriculum(SchoolYear sy, YearLevel yl ){
this.schoolYear = sy;
this.yearLevel = yl;
}
或者只是在以下方法中创建类的实例:
public DefaultListModel getAllYearLevel(){
YearLevel yl = new YearLevel();
return yl.getAllYearLevels();
}
我不认为是正确的,因为我没有看到重新创建相同方法只是说课程类HAS-A
YearLevel。
如果课程由年级,科目和学年组成,我如何实施或应用HAS-A
概念?
此时我无法继续使用setter和getter,因为我不知道哪种方法是正确的。我希望能够正确应用OOP概念。
我很感激任何建议或帮助。
答案 0 :(得分:2)
关联,聚合和合成的“正确”概念都与生命周期和关系有关。所以最重要的问题是“哪些对象可以独立于哪些对象存在?”和“两个物体之间的关系有多强(A-owns-B,A-know-B,A-composed-of-B)?”
如果您想为您的班级Curriculum
(作为所有者)使用聚合概念,则意味着Curriculum
会有SchoolYear
并且也会有一个YearLevel
,但他们都有自己的生命周期。因此,如果您销毁Curriculum
,其他对象仍然存在。这可以像你的第二种方法一样实现:
public class Curriculum {
SchoolYear schoolYear;
YearLevel yearLevel;
public Curriculum(SchoolYear sy, YearLevel yl ){
this.schoolYear = sy;
this.yearLevel = yl;
}
}
如果你想在它们之间建立更强的关系,你需要组合概念,其中A是由B组成的,所以它们的生命周期是相同的。如果你摧毁A你也会摧毁B.这意味着B不能存在而不属于A.就像建筑物是由房间组成的,但是房间是否可以没有建筑物?
要映射生成周期,当您像第一种方法实例化YearLevel
时,需要创建SchoolYear
和Curriculum
。
从我的观点来看,你对这一方面的聚合很好。
如果您要将Subjects
添加到Curriculum
,则应考虑使用合成。
答案 1 :(得分:0)
第二种方法似乎是最好的,第一种和第三种方法似乎在不推荐的类之间有很大的依赖性。
请注意,SchoolYeal和YearLevel应该是接口或摘要,但不是实现,否则我们仍然会陷入依赖问题。