重构实践:体验interface的威力(一)

背景

    GIX4是一个建筑行业的指标计算软件,用于数据统计、分析。导入的大量数据,大部分呈现逻辑上的树状结构(关于它的重构,见:《重构一个繁琐的数据结构》),关系复杂。这些数据,需要经过由底向上的汇总,并进行业务上的计算,然后以另一形式展现给用户。开发一段时间后,表现系统的应用层出现以下问题:

    1.速度慢

<    系统的计算分为两类,在这里,我简单地叫它们:正常计算过程、复杂计算过程。而复杂计算过程,其实也是由前者进行组合、循环而成。所以,正常计算过程的速度,直接影响其它的计算过程。

    在老版本的计算实现中,计算的速度已经达到了无法接受的地步。对一个一般的项目的所有数据进行计算,所需要的时间大概是2分钟,而如果是复杂计算过程,则肯定会超过20分钟……

    2.代码复用度较低

    这里所说的代码主要是指应用层中的领域模型及领域模型的处理过程。

    系统使用DDD的思想进行架构,使用OpenExpressApp作为开发框架。但是由于目前的框架还处在待完善阶段,而且框架的重点并不是使用强大的ORM来实现富OO的模型,所以在对象模型的设计中,并未使用类的继承。领域模型无法复用相同的“概念”,所以处理的过程,也只有单独写,没法复用。



 

历史代码介绍

    普通计算过程中,使用到的领域模型,呈现如下零散的结构:

图1 类的物理结构

    所有模型,都直接从BussenessBase(这个类不在应用层,而是在OpenExpressApp框架中使用的CSLA框架中)继承下来,然后添加各自特殊的业务属性。而对应每一个模型的计算过程,都有一个独立的类。我在图中写仅画出其中一个类ProjectIndicatorEntity_Calc。其实,模型类中的重复代码勉强还是可以忍受的。但是,在这些Calc计算过程里面的代码,80%都是相同的,真的是让人无法忍受。而且计算过程作为业务逻辑的核心,修改一下逻辑是很正常的。所以,一下修改,就得修改好几个类……

    另外,由于这些模型类是系统的核心所在,对它们的改动,都必须要慎之又慎。否则系统中的其它功能,很可能会随着改动而出现BUG。:(



 

思考

    其实,逻辑上,类的关系,应该呈现下图中的结构:

图2 类的逻辑结构

    应用层中,最上层的基类ProjectIndicator,是所有指标类的基类,它就代表一个抽象的“指标”。而ProjectQuantityIndicator是一种“量”的指标,所以继承指标。ProjectIndicatorRatio、ProjectCostIndicator是一种指标,却不是量指标,继承ProjectIndicator。右下四个类全部继承ProjectQuantityIndicator,表示都是特殊的量指标。

    以上结构直接反映了客观世界,有得于业务的把握和代码的组织。

    并不是开发人员不想使用这样的结构进行编程,而是由于文章开头提到的固有原因,所以才导致图1中的继承层次。对于这件事,我暂时也没有什么好的办法,或者说我的办法并不能彻底的解决这个问题,所以,模型类的继承,暂时也只好这样了,等待有了好办法后,再对它们进行重构吧。

    但是,我觉得这里虽然“物理上”并不能实现继承,但是“逻辑上”它们肯定是继承的。既然逻辑上有这样的“概念”,那我就使用一个接口来先表示这个概念,然后各类都实现这个“概念”即可。对于模型来说,这样做的改动的确是很小的,只需要在继承上加个接口声明即可。



接口

    这里提取出IProjectIndicator和IProjectQuantityIndicator两个接口,然后让类实现,如图3:

图3 物理和逻辑并存

    在图中可以看到:右上是逻辑继承,左下是物理继承。

    这样,就完成了本次重构中的第一个重要环节。我称它为:“建立概念”。



 

未完待续……

 

今天暂时写到这里。

时间不早了,还在公司。再不回家,老婆骂了……

:)

时间: 2024-10-30 11:08:31

重构实践:体验interface的威力(一)的相关文章

重构实践:体验interface的威力(二)

    前一篇博客 写了在这次重构中,如何找到关键的概念,并将它提取成为接口.这样,重构的方案基本上就已经被确定了.这篇博客主要说一些有意义的细节: 抽象实现     提取接口模型后,各"指标"类已经呈现出一种正确的逻辑关系.那么,现在更重要的就是重构上文中提到的"普通计算过程".由于计算过程依然有很多种,并且有通用的抽象部分.再加上接口模型已经定义出了大量重要的业务属性,所以我在这里使用约束的泛型抽象类来定义最上层基类.这里捡重点的几个计算类,组织类图如下: 图1

网页设计:脚本素材重构用户体验

原文:http://blog.rexsong.com/?p=1166 设计网站的同志背景主要有两种:学计算机.学艺术.基本上会写代码的不懂设计,会设计的不懂代码,这个格局似乎到今天还没变.某些学计算机的同学,有自己的审美品位,也能够做出看起来不错的网站,但学艺术的同学普遍难搞懂代码,我曾经还去过望京央美宿舍辅导朋友. 论坛对技术的推动起到了至关重要的作用,03年的时候,我每天在蓝色经典翻老帖子,04,05年主要呆无忧脚本和中国XML联盟,ChinaUI我认为没什么技术含量,我又不搞艺术. 当年无

我的重构初体验

  4个月前我得到了人生中的第一份职位--"重构工程师".那时就经常有人问我:"这份职位是做什么?""重构需要什么技术?",当时我的回答是:"重构就是前端咯."然而经过这个4个月的工作之后,我发现当时我的回答可能不那么的正确.那么,作为一位仍然还是"新人"的重构工程师,说一下关于这份职位现在我的理解和学习到的东西吧.当然,有错误或不当的地方还请各位前辈多多指教. 重构工程师是做什么的?需要什么样的素质? 对

iOS 遗留系统重构实践

在过去的几个月内,我主导着团队完成了一项工程浩大(累积八个人月的工作量)的重构工作--为我们的App替换数据库.之所以能够把这种伤筋动骨的事情称之为重构,是因为在这段时间内,我们每天向主干合并两到三次代码,期间App上线五次,用户没有感知到任何影响.在这篇文章中,我将讲述我们如何在不影响系统外部行为,也不影响正常交付的情况下,替换掉了数据库实现. 背景 在一个有着良好分层结构的系统中,每一层都有它自己的职责:显示层负责响应用户事件,调用业务层的逻辑,最后做数据呈现:业务逻辑层负责业务规则与数据处

《OEA - 实体扩展属性系统 - 设计方案说明书》

 这篇设计文档是 12 月份写来参加公司的研发峰会的,自己倒是信心满满,不过最后还是没有入围.现在想想也没啥大用,所以贴出来,期待与园友交流.     文档有点长,没全部贴在博客中,有兴趣的可以下载附件中的 PDF.  附件:<实体扩展属性系统-系统设计说明书.pdf> ================= 分隔线 ======================     目录 前言... 4 1 背景与需求... 5 1.1 产品 721 客户化开发的需要... 5 1.2 实体动态列... 6

《Web前端开发最佳实践》——2.2 前端代码重构

2.2 前端代码重构 代码重构是业内经常讨论的一个热门话题.重构指的是在不改变代码外部行为的情况下进行源代码修改,重构之前需要考虑的是重构后如何才能保证外部行为不改变.对于后端代码来说,可以通过大量的自动化测试来确保重构后的代码逻辑,可对于普遍缺乏自动化测试的前端代码来说,重构之前一定要考虑再三才能下手.我曾经有一次不算太成功的前端重构经历,所幸的是没有导致太大的问题,但教训是惨痛的.此次重构的项目本身没有足够的自动化测试,尤其是针对前端的自动化测试,其实在重构之前也预想到了重构的风险.先来介绍

《重构与模式(修订版)》目录—导读

版权声明 重构与模式(修订版) Authorized translation from the English language edition, entitled: Refactoring to Patterns, 978-0-321-21335-8 by Joshua Kerievsky, published by Pearson Education, Inc., publishing as Addison- Wesley Professional, Copyright 2005 Pears

eclipse 重构(转)

  Eclipse中的重构类型        如果你看一下Eclipse的重构菜单,可以看到四部分.第一部分是撤销和重做.其他的三部分包含Eclipse提供的三种类型的重构.        第一种类型的重构改变代码的物理结构,像Rename和Move.第二种是在类层次上改变代码结构,例如Pull Up和Push Down.第三种是改变类内部的代码,像Extract Method和Encapsulate Field.这三部分的重构列表如下. 类型1 物理结构 l         Rename l 

C++程序设计-第15周 数据结构扩展与GUI开发体验

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [目的] 1. 体验用面向对象的方法操作数组和动态链表2. 体验窗口程序的实现 第一部分 引言 大学中的学习死守着课本非常的没有劲.我不是说课本和课堂没用,而是说在课内的学习之余要有所拓展和扩充.大学的课程(和课本)成为一个体系,受到各种因素的制约,势必会形成一个框框,所涉及的内容可能就会形成"铁路警察,各管一段"的局面.课程和课本是有局限的,采用的是"