什么是聚合?
聚合可以很好地表达对象是什么和做什么。换句话说,聚合是把执行同一任务的代码整合到一起。
关于聚合原则,在Gamedevtuts+以前的文章里,有一篇关于“隐藏行动规则”的非编程文章,里面的例子讲的很好,可以参考。
不要把很多游戏捆版在一个包里… 每个单独的游戏可能都是一个好游戏。如果放在一起,他们就会彼此不相容。
这一原则同样适用于面向对象编程。每个对象应该只有一个职责,对象的每个行为应该只做一个任务。只要超出了范围,代码的维护就会增加工作量。
为什么有用?
按照功能来组织的,只执行单一任务的代码,被称为具有“高聚合”。高聚合的代码是可重用的,单纯的,易懂的。高聚合也使对象更精悍,功能更集中。
相反的,随意组织起来,执行多个任务的代码,被称为“低聚合”。这样的代码不好理解,不易维护和重用,一般比较复杂。低聚合创建的对象臃肿,且功能散乱。
高聚合显而易见是好的,低聚合则很差。所以我们编程时一定要力求做到高聚合。
如何应用
那么我们如何把高聚合原则应用到面向对象编程里? 首先,用对象的方式编程就是对聚合性的提高。当然每个对象本身也应该有高聚合性。我们同样用上篇文章里的三个游戏例子来看聚合原则是如何应用的。
小行星游戏(Asteroids)
回想一下上一课,我们定义了飞船这个对象,它具有旋转,移动,开火等行为。
如果我们在一段代码里把三个行为都写在一起,就会显得很混乱。所以我们应该把每个行为都分开用函数来定义。函数可以分离功能,把相关的代码组合在一起,创建高聚合的程序。
在程序里,我们通过创建类来定义对象。Java语言里类的代码就像这样:
/**
* 飞船类
*/
public class Ship {
/**
* 函数– 执行旋转飞船的行为(任务)
*/
public void rotate() {
// 旋转飞船的代码
}
/**
*函数–执行移动飞船的行为(任务)
*/
public void move() {
//移动飞船的代码
}
/**
*函数–执行移动飞船开火射击的行为(任务)
*/
public void fire() {
//飞船发射子弹的代码
}
}
就像你看到的,每个行为都有一个函数,而程序代码在这个简略结构里被很好的组织起来了。
先不用担心具体的语法,在这个教程系列后面的部分,我们会讨论到具体的程序细节。俄罗斯方块(Tetris)
再回想一下俄罗斯方块游戏,俄罗斯方块这个对象具有下落,左右移动,旋转三个行为。基本的类结构如下:。
/**
* 俄罗斯方块游戏类
*/
public class Tetromino {
/**
* 函数 – 更新方块的位置
*/
public void fall() {
//更新方块位置的代码
}
/**
*函数 – 左右移动方块
*/
public void move() {
//左右移动方块的代码
}
/**
*函数 – 旋转方块
*/
public void rotate() {
//旋转方块的代码
}
}
同样的,对象的行为都被分到各自的函数。你可能注意到了,“下落”这个方法执行的是“更新方块的位置”。这是因为下落的行为是一直在持续发生的,而不是一次性触发的,所以我们不能只执行“让方块下落”这样的任务。下落的方块每次向下移动一定的位移量,所以我们通过更新方块的位置来反映下落速度。
吃豆人(Pac-Man)
“鬼”这个对象有移动和改变状态两种行为,对它我们还要增加一些东西来实现高聚合。
/**
* “鬼”的类
*/
public class Ghost {
/**
* 函数 – 移动鬼
*/
public void move() {
// 鬼以当前方向移动的代码
}
/**
*函数- 改变鬼的方向
*/
public void changeDirection() {
//改变鬼方向的代码
}
/**
*函数- 改变鬼的速度
*/
public void changeSpeed() {
//改变鬼速度的代码
}
/**
*函数- 改变鬼的颜色
*/
public void changeColor() {
//改变鬼颜色的代码
}
/**
*函数- 改变鬼的状态
*/
public void changeState() {
//改变鬼状态的代码
//这个函数会调用其他三个函数:改变鬼的方向,改变鬼的速度,改变鬼的颜色
}
}
更改鬼的状态额外增加了三个函数: 改变方向,改变颜色,改变速度。这三个函数不在我们开始的行为列表里,因为它们其实不是对象的行为。这些函数被称为“辅助函数”,它们有助于程序维持高聚合。
鬼改变状态(当吃豆人吃到超能豆的时候)这一行为需要执行三个任务:变成蓝色,调转方向,移动变慢。要维持高聚合,所以我们就不要把三个任务放在同一个函数里。我们把它们分到三个子函数里,最后在一个主函数里统一调用。
在描述函数/或者行为时常用到“and”,它的意思就是告诉我们应该创建更多的函数来执行任务。
总之,聚合原则就是要把相关的代码组织在一起,执行单一的任务。聚合帮助我们创建可维护的,可重用的代码。
分享到:
相关推荐
**OOP设计原则详解** 面向对象编程(Object-Oriented Programming,简称OOP)是一种流行的编程范式,它强调将数据和操作数据的方法封装在一起,形成独立的对象。OOP设计原则是指导我们如何构建可维护、可扩展和可...
在实际的软件开发中,OOP是解决复杂问题的有效工具,通过封装、继承和多态等核心原则,可以构建出易于理解和管理的代码结构。 **封装** 是OOP的基础,它将数据和操作数据的方法捆绑在一起,形成一个独立的实体——...
5. **聚合与组合**:`AccessControlSystem`可以聚合`User`、`Card`和`Door`对象,形成整体的系统结构。而`Door`可以组合`Lock`对象来控制门的实际开关操作。 6. **异常处理**:在验证权限或处理操作时,可能会遇到...
**趣图解析**:开放封闭原则的图解通常会展示一个类通过继承或者聚合的方式扩展其功能,同时保持原有类的稳定不变。 ##### 3. 里氏替换原则(Liskov Substitution Principle, LSP) **定义**:里氏替换原则指出,...
我们将会分析其核心设计原则,关键类结构以及如何通过OOP实现系统的模块化和可扩展性。 首先,让我们理解OOP的核心概念。面向对象编程是一种编程范式,它将数据和操作数据的方法封装在一起,形成对象。对象是类的...
**聚合关系PPT模板**主要应用于讲解面向对象编程(OOP)原理中的聚合关系概念,通过视觉化的方式帮助理解和记忆。这种类型的模板通常会包括但不限于以下几个方面的内容: 1. **概念介绍**:首先对聚合关系的基本概念...
本项目以“Java OOP项目”为主题,旨在探讨如何在Java中应用面向对象设计原则和模式来创建一个实际的应用程序。 【描述】:“风格风格饿饭但是发反对感广泛的豆腐干广泛豆腐干地方 广泛个” 这段描述虽然看似不...
封装是OOP的核心原则之一,它允许我们将数据和操作这些数据的方法捆绑在一起,并通过访问控制修饰符(如`private`, `protected`, `public`)来限制外部对这些成员的直接访问。 - **私有变量**:`private int id;` -...
6. **合成/聚合复用原则**:优先使用对象组合,而不是继承,以减少耦合度。 7. **使用记录和类的适当时机**:在适当的情况下使用记录(structs)而非类,以保持轻量级和性能。 8. **避免全局变量**:全局变量可能...
源码提供了实现设备管理功能的详细代码结构,我们可以从中学习到很多关于OOP设计原则和实践的知识。 首先,面向对象编程是现代软件开发中的主流方法论,它以“对象”为核心,强调数据和操作数据的方法的封装。在这...
封装是OOP的基本原则之一,它隐藏了类内部的实现细节,仅通过公共接口与外界交互。在本项目中,类的私有成员变量可以通过getter和setter方法进行访问和修改,以此实现数据的安全性。 3. 继承 继承允许我们创建一...
聚合原则主张一个代码单元应该负责一个明确的任务,便于在不同场景下重用。 可扩展性是设计中另一个关键因素,意味着代码应设计得足够灵活,以适应未来可能的变化。例如,当添加新的子类时,原有代码应能不受影响地...
这个项目的核心目标是运用OOP原则来设计、实现并展示一个具有实际功能的软件系统。OOP是一种强大的编程范式,它强调数据封装、继承、多态和抽象等概念,以创建可维护、可扩展的代码结构。 【描述】中提到的"My-OOP-...
合成/聚合复用原则主张通过合成/聚合的方式复用代码,而不是通过继承。 **关键知识点:** - **定义:** 使用组合而非继承来复用代码。 - **实现方式:** - 在类内部持有其他对象的引用。 - 通过这些对象来实现所...
良好的OOP实践不仅可以提高代码的可读性、可维护性和可扩展性,还能帮助开发者遵循SOLID原则和有效地应用设计模式。以下是“良好OOP的10条黄金法则”,旨在为你的编程实践提供指导: 1. **单一职责原则(Single ...
在面向对象编程(OOP)中,对象是数据和操作这些数据的方法的集合,而设计原则则是为了更好地利用这些特性来构造复杂的系统。本文主要探讨的是“优先使用组合而非继承”这一原则。 **组合**是通过创建一个对象来...
2. **封装**:OOP的一个重要原则是封装,即隐藏对象内部细节,只对外提供必要的接口。在租车系统中,`Car`对象可以隐藏其状态(如是否已被租出),仅通过公共方法进行交互。 3. **继承**:如果有一系列特定类型的车...
OOD涉及到类和对象的详细设计,包括接口定义、继承、聚合、组合等关系。此外,设计模式如工厂模式、单例模式、观察者模式等也会在这个阶段被应用,以解决常见的设计问题。 **面向对象编程(OOP)**: OOP是实现设计...
此外,还可能涉及到模块化(如CommonJS或ES6模块)、设计模式(如工厂模式、观察者模式)以及如何在实际项目中应用这些OOP原则。 总的来说,"workshop-oop"提供了一个机会,让我们深入学习JavaScript中的面向对象...
通过这样的实践,学生可以加深对OOP原则的理解,并学习如何在实际项目中应用这些原则。 由于标签为空,我们无法得知这个项目可能涉及的具体技术或语言,比如Java、C++或Python等。但是,上述内容涵盖了OOP的基本...