坦率地说,我在学术界教授的这些概念在面向对象和类设计的上下文中确实具有重要性。从头开始为系统建模时,这些概念对我们有很大帮助。关联,聚合和组合完全属于UML的类图,并且完全独立于诸如内存问题之类的技术约束。
此外,您还必须考虑要建模的系统的更高级别或业务目标。我们的系统中正在考虑“房屋”和“房间”之类的对象,但不能紧密关联(通过组合)。例如,如果我要对房地产系统进行建模,则可能必须知道什么房间属于什么房子。但是,让我在建立一个调查或人口普查系统的模型时,我想知道在某个区域的房屋的每个房间中有多少人居住,那么我就不需要通过构图将房屋与房屋联系起来。
另一个例子可能是果园和某种水果。可以说,只有在果园里种上苹果树时,我才能考虑果园。最重要的是,整个系统的要求确实很重要。
封装是面向对象设计的支柱之一。您需要捆绑数据以及将对数据执行的操作。同样,您还必须从外部世界中隐藏对象的某些属性,以使该对象能够在有效状态下生存。当2个对象交互时,它们必须通过接口相互交互。这就是封装在设计OO系统时所确保的。
这些概念如何应用于代码:
关联:关联表示对象之间的关系。它使程序员知道在其类中编写哪些方法以使它们彼此交互。您可以找到几个代码和类图示例来了解关联。在您的教和学生的例子,有一个关系教学和通过教。因此,您只需编写一组方法(技术上称为接口),即可通过该方法了解哪个学生有哪些老师,以及哪个老师有哪些学生。关联还使系统建模者可以帮助数据库设计人员了解需要保留在数据库中的属性和字段。
组成:
如果一个对象是另一个对象的组成部分,那么我可能不得不在另一个对象的构造函数中指出这种关系。例如,在您的房屋和房间场景中,如果我们想知道哪个房间属于哪种房屋类型,我们可以编写以下代码。
class House{
string _HouseType;
public:
void setHouseType(string house_type)
{
this. _HouseType = house_type;
}
string getHouseType()
{
return _HouseType;
}
};
House HouseObject = new House();
class Room{
public:
Room(string HouseType) {
this._HouseType = HouseObject.getHouseType(); //as in my system a room cannot exist without a house
}
};
程序员在调用对象的析构函数时还将确保另一个对象的析构函数也被调用。这很关键。
聚合:
让我们说,如果对象之间的关系很弱,那么对于程序员来说,这将意味着使用实例变量来表示这种关系。然后编写一个mutator函数(setter),以从另一个对象为该对象提供价值。
class Department{
string dept_name;
public:
void setDeptName(string name)
{
this.dept_name=name;
}
string getDeptName()
{
return dept_name;
}
};
Department DepartmentObject = new Department();
class Teacher{
string dept_name;
public:
setDeptName(string name)
{
this.dept_name = DepartmentObject.getDeptName(); //You only need to invoje this method when needed (aggregation)
}
}
};