`
ihuashao
  • 浏览: 4547060 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

算法设计应该依赖抽象而不是业务

阅读更多

很多时候,算法的设计是归属于详细设计阶段的。一些公司甚至都没有设计而直接编码。这些往往导致很多算法的实现都混杂在业务模块中。典型的特点是,这些算法会依赖于业务实体的某些属性的实现。

举一个简单的例子,我曾经做过一个项目中,遇到一个排序功能:分部整理。这个排序比我们以往所学的排序不一样,所以很多人都不将它作为算法来看待,而是直接做为业务逻辑功能进行实现。

  1. 排序的基础数据是清单(一个业务实体)的编码
  2. 排序的依据是清单编码在检索库中的顺序

如果你细心的话,就会发现,其实上面的两条,和我们的一般排序方法实现起来是一样的!

  1. 比较对象:字符串、整数、浮点数等等
  2. 比较方法:比较大小、大小写敏感等等

根据上面的分析,设计这个算法的过程中,应该将清单编码列表作为一个参数传入。注意,这里是是编码列表,而不是实体对象列表。最好的情况是,重新声明一个数组。这样就能将算法和业务实体隔离开。另外,清点编码的检索作为一个排序的比较回调函数。这样,比较的业务也可以和算法分开。最后,算法其实也不需要实现了,因为这是通用的。

大家一定注意到了,上面的设计过程中,一直在强调接口编程。我们的算法如果不依赖于业务,就必须提取出来一个独立的接口。说到接口,我想多说几句,因为很多人在这里有一个误区。

我们在业务代码中,有很多接口。这些接口一般都是业务接口。是因为业务而不得不存在的接口。但是写得多了,很多人可能会将这些和我们所提倡的独立的接口想混淆。让他依赖接口编程,他就直接将业务对象实现的接口引入进来。这种方法的直接后果就是,这部分代码,别的地方不可能再用了!

依赖于业务抽象的算法实现,是有很多好处的:

  1. 算法简洁、易于阅读
  2. 层次清楚、易于扩充
  3. 抽象独立、易于复用

对于服用,不光是可以给别人服用,很多时候,就是因为抽象的好,因而可以使用到一些基础算法。复用代码的好处,就是不需要额外的维护啊。

算法设计,是应该高于业务设计的。这样才能体现算法的优势。否则石头一旦沉入大海,我们再也不能看清楚他们了。

分享到:
评论

相关推荐

    人工智能-项目实践-嵌入式-基于Linux系统的应用程序,旨在搭建一套完整的多进程多线程通讯的消息框架. 支持多SOC的嵌入

    抽象:将具体功能业务抽象化,减少依赖 下沉:下沉组件,组件化。工具化、自动化。 上升:上升业务逻辑,打薄业务层,专注于业务。 量化:对系统性能、算法等能够量化分析。 闭环:软件闭环,逻辑闭环。

    软件设计规范

    而需求分析,必须是现实实用的,而不是同构/仿真的-这似乎是反对象分析的。因为这里强调的是和软件的交互界面,这个界面远远没有反映现实世界的结构。须知,软件强调的是数据处理,是输入输出。否则,就不能达到最...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    依赖倒转原则 接口隔离原则 迪米特原则 设计模式 结构模式 适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 创建模式 抽象工厂模式 工厂方法模式 建造这模式 原型模式 单例...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    问答系统的系统设计方案.pdf

    响应状态码也应该精确,这⾥是内部返回响应,主要包含状态码,提⽰信息,数据,如下图通⽤返回结构体: 三、软件系统概念原型下的视图 三、软件系统概念原型下的视图 ⼀个系统⽆论⼤⼩,皆可分模块,通过视图勾划出...

    软件工程知识点

    详细设计需要从实现每个模块功能的程序算法和模块内部的局部数据结构等细节内容上给出设计说明,并以“详细设计说明书”的形式提交书面报告。 3.编码和单元测试 编码是对软件的实现,一般由程序员完成,并以获得源...

    ChineseSemanticKB:ChineseSemanticKB,中文语义知识库,面向中文处理的12类,百万规模的语义常用词典,包括34万抽象语义库,34万反义语义库,43万同义语义库等,可支持句子扩展,转写,事件抽象与泛化等多种应用场景

    语义知识是自然语言处理中非常重要的一个基础资源,与学术界追求算法模型不同,工业界的自然语言处理对于复杂的语法,语义语义等多种资源依赖度很高,具体体现在: 1,具有落地场景的自然语言处理任务都是业务高度...

    面向对象与UML资料

    描述设计细节和算法——注释 93 前置条件 93 对书写契约的一些建议 93 用例enterItem的契约 93 概念模型的修改 93 标识状态 94 事件、状态和转移 94 状态图 94 用例状态图 95 系统状态图 95 状态无关和状态相关类型 ...

    数据库系统应用开发方法.pdf

    数据库系统应⽤开发⽅法 数据库系统应⽤开发⽅法 ⼀、软件过程模型 1.瀑布模型 阶段: 项⽬规划、系统分析、总体设计、详细设计、编码调试和集成测试、运⾏... 应⽤程序详细设计: 设计各模块处理流程和算法、数据结构

    传智播客扫地僧视频讲义源码

    本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...

    asp.net知识库

    在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中...

    浅析人工智能在软件工程中的应用.docx

    而需求分析结构则是先将数据输入,通过SDGP的处理来得到软件设计结构,然后通过大量的实践与研究,或者下载,安装和调试,使图规划器得以实现,并使求解和建模在实际问题的抽象层次得以解决。 3 软件质量的不确定性...

    java 面试题 总结

    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...

    超级有影响力霸气的Java面试题大全文档

    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...

    最新Java面试宝典pdf版

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    Java面试笔试资料大全

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

    Java面试宝典2010版

    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...

Global site tag (gtag.js) - Google Analytics