模块设计优化实战

前几天有个新人在进行模块分解时,碰到了问题,他自己已经基本做好了,但总觉得不对劲,却理不清楚怎么做才能更好一些。因此找我帮他分析一下。

由于他并没有绘制任何图形化的东西,也没有任何文字形式的描述,只是口述了自己的困惑。我搞明白他的问题,花了些时间,我觉得这是不值得的。这里我必须再次强调一下,如果你希望与别人交流以尽快获得帮助,那么请务必将问题表达清楚,除了口述外,使用合适的工具、图形和文字将事半功倍。

为了更好的说明问题,我把他的现状用简单的类图画出来,加以说明,以便让大家明白他的问题所在。

其实功能也不复杂,在一个窗口中需要展示一些信息,并能够响应用户的操作。用户输入的信息,需要用到特定的算法进行计算,而计算过程中,需要用到一些参数,这些参数来自于数据库。在系统启动后,这些参数已经由数据库操作类完成了读取,这里为了说明方便,假设为结构A和结构B,且这两个结构由于某些环境的原因,不可以调整。

他现在的实现是,展示窗口类中同时封装有业务相关的内容,当用户在窗口中修改某项内容时,直接在窗口类中进行处理,调用算法函数,完成处理,并重新展示计算后的信息。而在算法类中,某个算法需要分别用到结构A和结构B中的部分信息,因此直接在算法函数中,访问数据库操作类来获得所需的参数。

对于一个新人来说,这样的实现可以说已经比较不错了。已经使用到了类的分工,进行了一些封装。但如果想更进一步的话,似乎有些地方还有改进的空间。下面来分析一下。

在进行类的设计时,很重要的一点,是我们需要明确它的职责和关系。职责单一,内聚度高;关系单一,耦合度低。这是一个基础的目标。

在上面的几个类中,我们可以看到几个问题。

对于展示窗口类,存在职责不明确问题。窗口和视图等信息展示和交互类,一般赋予它们的职责是两个,一是向用户展示信息,二是接受用户的响应。尽量不要涉及具体的业务。

对于算法类,耦合度存在问题。可以看作是工具,它必须和具体的业务无关,经常可以将算法和工具类封装成动态库。这里算法类依赖于数据库操作类,显然大大增加了耦合度,是一个很差的设计。

最后说一说数据库操作类,似乎扩展性存在问题。它只是完成了一些参数从数据库中读取,然后保存在已定义的数据结构中。假设后续需求发生变化,这些参数使用其它形式保存,比如XML,比如INI,那么这个类就需要重新写了。当然,就这个项目短期来说,也许也不是那么重要,但从长远来看,也许优化一下会更好。

基于这些问题,我对他的设计进行了一下改进,希望能够解决目前的一些问题。

在新的设计中,首先将展示窗口类中的业务部分剥离,构建业务类。展示窗口类只与业务类相关,与其它类都没有关系。只要展示的内容和交互方式不变,业务的变化将不再影响窗口展示类。

其次,将算法类中算法所需的参数,定义为一个数据结构,作为算法的输入参数。这样算法类就完全独立了。外部需要使用算法时,必须给出算法所需的参数信息。这里算法类只有业务类会使用它,因此由业务类负责提供参数,而不再由算法类自己去找参数。

对于数据库操作类,其实它真正的核心是对两个结构的封装,数据库只不过是数据的来源而已。考虑到未来数据的来源可能有其它形式,因此将其抽象成一个接口类,两个结构为其成员变量。可以预见的成员函数包括根据数据来源的初始化函数,以及两个结构的获取函数。当未来需要增加新的数据来源时,只要派生相应的子类来重写接口类就可以了。原有的数据库操作类完全不用调整。

对于新的系统参数的处理设计,也许可以找到某个设计模式的影子,可以向着工厂类来演化。

最后,由于算法类需要的参数,与结构A和结构B并不一致,所以这里需要有个适配处理。可以考虑由系统参数接口类提供接口函数来实现,但更建议独立封装一个结构间的适配类。因为系统参数接口类并不需要承担这个职责。

当然,以上的设计肯定还可以进一步优化,留待大家探索。只是希望大家能够从以上的设计优化的思考过程中,吸收到一部分有益的经验,那我就很满足了。

时间: 2024-10-05 23:53:38

模块设计优化实战的相关文章

2017.7.1 慕课网-Java从零打造企业级电商项目实战:用户模块设计与开发

2. 用户模块设计与开发 2.1 要实现的功能 2.2 mmall_user表 2.3 用户模块接口设计 (1)门户-用户接口 http://git.oschina.net/imooccode/happymmallwiki/wikis/%E9%97%A8%E6%88%B7_%E7%94%A8%E6%88%B7%E6%8E%A5%E5%8F%A3 (2)后台-用户接口 http://git.oschina.net/imooccode/happymmallwiki/wikis/%E5%90%8E%E

网易视频云:HBase优化实战

网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,提供稳定流畅.低时延.高并发的视频直播.录制.存储.转码及点播等音视频的PAAS服务,在线教育.远程医疗.娱乐秀场.在线金融等各行业及企业用户只需经过简单的开发即可打造在线音视频平台.现在,网易视频云的技术专家给大家分享一则技术文:HBase优化实战. 背景 Datastream一直以来在使用HBase分流日志,每天的数据量很大,日均大概在80亿条,10TB的数据.对于像Datastream这种数据量巨大.对写入要求

框架模块设计经验总结

转自:http://www.cnblogs.com/zgynhqf/archive/2011/07/15/2107593.html 这是原创,尊重原创............ 框架模块设计经验总结 三个月没写日志了,比较懒散--下半年准备做OEA 的 B/S 版本,比较复杂,需要从架构设计开始认真入手.正好今天到了部门反思的时间,今天先把原来的一些设计经验总结一下,以方便将来回顾. 直入主题,这篇日志主要用于总结一些框架级别的模块设计经验. 总述 一个大型的框架,必然由多个较独立的子系统/子模块

高并发,大容量,高性能数据库设计优化

1.数据存储 a.集中式---->分布式 复制m/s.切分 a.1切分 垂直切分(按功能模块) 难点:跨域的表关联--->应用程序 事务---------->分布式的事务(单独数据源的小事务,然后通过程序控制) 某些表访问剧增----->读写分离 读写分离(异构数据源之间的读写分离) 相同数据源,只需要master/slave 难点:异构数据源之间的全量复制问题 异构数据源之间的增量同步问题(解析日志) 水平切分(按记录切分---->找规则) a.2 数据切分及整合的中间件

Java程序性能优化——设计优化

原文出自:http://blog.csdn.net/anxpp/article/details/51914119,转载请注明出处,谢谢! 1.前言 OK,之前写了一篇文章:"23种设计模式介绍以及在Java中的应用"详细介绍了如何将设计模式应用到Java编程中,而本文旨在介绍如何利用他们优化我们的程序,使其性能更佳. 设计模式的详细介绍请参照上面链接中的文章,不是本文的重点. 而Java程序的性能优化,不一定就仅仅是以提高系统性能为目的的,还可能是以用户体验.系统可维护性等为目的. 2

PHP服务缓存加速优化实战

PHP服务缓存加速优化实战: (1)操作码介绍及缓存原理: 当客户端请求一个PHP程序的时候,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码(Operate Code)文件. 该文件是执行PHP代码后的一种二进制表示形式. 默认情况下,这个编译好的操作码文件由PHP引擎执行后进行丢弃. 操作码文件缓存机制就是将编译还的文件保存下来,并放到共享内存中,以便于下一次调用该PHP页面的时候重用它,避免了相同的代码重复度,节省了PHP引擎重复编译的时间. 降低了服务器负载,同时减少了服务

Android UI性能优化实战 识别绘制中的性能问题

出自:[张鸿洋的博客]来源:http://blog.csdn.net/lmj623565791/article/details/45556391 1.概述 2015年初google发布了Android性能优化典范,发了16个小视频供大家欣赏,当时我也将其下载,通过微信公众号给大家推送了百度云的下载地址(地址在文末,ps:欢迎大家订阅公众号),那么近期google又在udacity上开了系列类的相关课程.有了上述的参考,那么本性能优化实战教程就有了坚实的基础,本系列将结合实例为大家展示如何去识别.

面向.Net程序员的后端性能优化实战

最近2个月没做什么新项目 完全是对于旧的系统进行性能优化 避免超时 死锁 数据处理能力不够等常见的性能问题 这里不从架构方面出发 毕竟动大手脚成本比较高 那么我们以实例为前提 从细节开始 优化角度 一.业务逻辑优化 二.DB优化 三.数据处理优化 四.锁与性能 五.cpu飙高小结 六.crash现象分析 业务逻辑优化 这一条不具有普遍性 不同的业务不同的场景 如果归纳起来 就是在不影响业务的前提下进行流程精简 1. 废弃冗余逻辑 常见于各种基于数据库的检查 很多同学在维护别人代码的时候 没有深入

解析大型.NET ERP系统 权限模块设计与实现

权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 说明 谁 部门+岗位职责 也可以不与部门岗位绑定,省略角色定义. 能否 能(True) 否(False) 用0或1,true/false表示能否执行 做 增加/删除/修改/查询/统计/打印/过帐 权限对象 哪些 通用的/本人的/本组别的/本部门的/本公司的/其他的/多帐套的 范围:行政部的办公文具