很多时候,算法的设计是归属于详细设计阶段的。一些公司甚至都没有设计而直接编码。这些往往导致很多算法的实现都混杂在业务模块中。典型的特点是,这些算法会依赖于业务实体的某些属性的实现。
举一个简单的例子,我曾经做过一个项目中,遇到一个排序功能:分部整理。这个排序比我们以往所学的排序不一样,所以很多人都不将它作为算法来看待,而是直接做为业务逻辑功能进行实现。
-
排序的基础数据是清单(一个业务实体)的编码
-
排序的依据是清单编码在检索库中的顺序
如果你细心的话,就会发现,其实上面的两条,和我们的一般排序方法实现起来是一样的!
-
比较对象:字符串、整数、浮点数等等
-
比较方法:比较大小、大小写敏感等等
根据上面的分析,设计这个算法的过程中,应该将清单编码列表作为一个参数传入。注意,这里是是编码列表,而不是实体对象列表。最好的情况是,重新声明一个数组。这样就能将算法和业务实体隔离开。另外,清点编码的检索作为一个排序的比较回调函数。这样,比较的业务也可以和算法分开。最后,算法其实也不需要实现了,因为这是通用的。
大家一定注意到了,上面的设计过程中,一直在强调接口编程。我们的算法如果不依赖于业务,就必须提取出来一个独立的接口。说到接口,我想多说几句,因为很多人在这里有一个误区。
我们在业务代码中,有很多接口。这些接口一般都是业务接口。是因为业务而不得不存在的接口。但是写得多了,很多人可能会将这些和我们所提倡的独立的接口想混淆。让他依赖接口编程,他就直接将业务对象实现的接口引入进来。这种方法的直接后果就是,这部分代码,别的地方不可能再用了!
依赖于业务抽象的算法实现,是有很多好处的:
- 算法简洁、易于阅读
- 层次清楚、易于扩充
- 抽象独立、易于复用
对于服用,不光是可以给别人服用,很多时候,就是因为抽象的好,因而可以使用到一些基础算法。复用代码的好处,就是不需要额外的维护啊。
算法设计,是应该高于业务设计的。这样才能体现算法的优势。否则石头一旦沉入大海,我们再也不能看清楚他们了。
分享到:
相关推荐
在讨论基于业务抽象规划的分布式动态服务组合算法之前,我们需要先了解相关的关键概念和技术背景。面向服务架构(SOA)是一种将业务功能作为服务进行封装,并通过网络提供给使用者的软件设计方法。SOA允许不同的软件...
三层架构和设计模式的结合还可能涉及到其他设计原则和模式,比如单一职责原则(每个类只负责一项任务)、依赖倒置原则(依赖于抽象而不是具体实现)、接口隔离原则(避免接口过大,导致不必要的依赖)以及策略模式...
抽象不应该依赖细节,细节应该依赖抽象。 - **接口隔离原则(ISP)**:不应该强迫客户依赖于它们不用的方法。 - **最少知识原则(LKP)**:一个对象应当对其他对象有尽可能少的了解。 ### UML 统一建模语言(UML)...
在IT领域,规则引擎是处理业务逻辑、决策支持系统的关键组成部分,而LEAPS(Lazy Evaluation Algorithm for Production Systems)算法则是这一领域内的前沿技术。由唐·巴托里(Don Batory)在德克萨斯大学奥斯汀...
在策略模式中,客户端依赖于抽象策略接口,而不是具体策略类,从而实现了这一原则。 在实际应用中,我们可以看到策略模式在很多场景下都非常实用,例如在电子商务系统中,不同的促销策略(如满减、打折、赠品等)...
这意味着在需求变化时,我们应该能够通过添加新的代码来扩展软件的行为,而不是修改已有的代码。这一原则的核心目标在于创建出稳定、灵活且易于维护的软件系统,避免因单一变更引发的连锁反应,从而导致软件变得脆弱...
它提倡高层模块依赖于抽象,而不是具体的实现。这意味着应该依赖于接口而非实现,这样可以减少模块间的耦合,并提高代码的灵活性和可测试性。 同时,依赖倒转原则与里氏代换原则密切相关,后者强调子类必须能够...
在实际开发中,面向接口编程是一种常见的设计原则,它强调依赖于接口而不是实现,有助于提高代码的可扩展性和可维护性。例如,服务层的接口定义了业务逻辑,而具体的实现类可以根据需求进行更换,不影响调用方,这...
在分页抽象业务层的创建中,我们通常会设计一个基类,包含分页参数(如当前页、每页条数)和分页方法。这个抽象类可以提供通用的查询逻辑,减少代码重复。例如,我们可以定义一个名为`BasePageService`的抽象类,...
针对接口编程原则强调的是编程时应该依赖于抽象接口,而不是具体的实现细节。这样可以提高系统的灵活性和可扩展性。 **应用场景与实践:** - **依赖接口:** 在编写代码时尽量依赖于接口而不是具体类。 - **接口...
通过遵循设计原则并运用设计模式,开发者可以创建出高效、灵活的编程框架,这些框架又为应用程序提供了稳定的开发环境,使得开发人员能够更专注于业务逻辑,而不是基础架构。因此,理解和掌握设计模式对于任何想要...
抽象不应该依赖细节,细节应该依赖抽象。 **应用场景:** - 当高层模块与低层模块紧密耦合时,考虑引入中间抽象层。 **好处:** - 降低模块间的耦合度。 - 提高系统的灵活性。 #### 4. 接口隔离原则(Interface ...
- **依赖倒置原则(DIP)**:依赖于抽象而不是具体实现。 - **接口隔离原则(ISP)**:客户端不应该强迫依赖它们不使用的方法。 - **迪米特法则(LSP)**:一个对象应该对其他对象有最少的了解。 5. **设计模式...
工作流技术在此基础上发挥了重要作用,它能够将复杂的业务过程抽象为一系列服务的有序执行。 网格服务工作流(GSF)调度是一个典型的NP问题,由于涉及的服务之间存在依赖关系和资源需求,使得调度的难度增加。传统的...
4. **依赖倒置原则(DIP)**: 高层次的模块不应该依赖于低层次的模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。 - 示例:通过接口或抽象类来定义高层模块和低层模块之间的交互。 5. **接口...
抽象不应该依赖细节,细节应该依赖抽象。 5. **接口隔离原则**:使用多个专门的接口,而不是一个总接口,避免强迫客户端依赖那些他们不用的方法。 书中详细介绍了多种设计模式,如: - **工厂模式**:提供一个...
抽象不应该依赖细节,细节应该依赖抽象。 5. **接口隔离原则**:客户端不应该被迫依赖它不需要的接口。 6. **迪米特法则(最少知道原则)**:一个对象应当对其他对象有尽可能少的了解。 以上就是关于设计模式的基础...