【问题标题】:Correct way of applying OOP concept of Aggregation应用 OOP 聚合概念的正确方法
【发布时间】:2016-09-10 16:15:48
【问题描述】:

我正在修复我的系统的 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();
   }

我认为这是不正确的,因为我没有看到重新创建相同方法的意义,只是说 Curriculum class HAS-A YearLevel。

考虑到课程由年级、学科和学年组成,我如何实施或应用HAS-A 概念?

此时我无法继续使用 setter 和 getter,因为我不知道哪种方式是正确的。我希望能够正确应用 OOP 概念。

如果有任何建议或帮助,我将不胜感激。

【问题讨论】:

  • #3 不是聚合。一旦您返回它,您构建的新事物就与它的“父”不再有任何关系。在 1 和 2 之间,您可以讨论组合/聚合和关联之间的差异,但这是没有意义的。做最适合您情况的事情。
  • 这些 SchoolYear 和 YearLevel 构造函数没有参数吗?哪一年?哪个级别?这些值对象是共享的还是可以共享并拥有自己的身份?

标签: java oop aggregation composition


【解决方案1】:

AssociationAggregationComposition 的“正确”概念都是关于生命周期和关系的。所以最重要的问题是“哪些对象可以独立于哪些对象而存在?”和“两个对象(A-owns-B、A-knows-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;
   }
}

如果您想在它们之间建立更牢固的关系,则需要 composition 概念,其中 A-is-composed-of B,因此它们的生命周期是相同的。如果你摧毁了A,你也摧毁了B。这意味着B不属于A就不能存在。就像一个建筑物是由房间组成的,但是一个房间可以没有建筑物而存在吗? 当您像第一种方法一样实例化 Curriculum 时,要映射您需要创建 YearLevelSchoolYear 的生命周期。

在我看来,您可以对这一点进行聚合。 如果您将Subjects 添加到您的Curriculum,您应该考虑使用合成。

【讨论】:

    【解决方案2】:

    第二种方法似乎是其中最好的方法,第一种和第三种方法似乎在类之间有很大的依赖性,不推荐。

    请注意,SchoolYeal 和 YearLevel 应该是接口或抽象,而不是实现,否则我们仍然会陷入依赖问题。

    【讨论】:

    • Wny 不能实现吗?我不建议抽象类,因为那样你就不能像问题中那样实现它们
    • 这个想法是忽略对象的实现以减少两个类之间的依赖关系。在第一种方法中,如果我们更改 SchoolYear 的实现并且我们使用例如新的实现类“FutureSchoolYear”,我们将需要在类 Circriculum 中更改它,另一方面,如果我们选择第二种方法,SchoolYear 作为接口,我们只需要让“FutureSchoolyear”实现这个接口。抽象和接口都是将此对象与当前类接口的两种方式,您可以根据关系在它们之间进行选择
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    相关资源
    最近更新 更多