`
lingcm
  • 浏览: 19715 次
社区版块
存档分类
最新评论

具有臭味的代码

阅读更多
下面介绍几种具有坏味道的代码结构,其中很多经验学习自Eclipse,与Martin Fowler不同的是,我找到的几种坏味道都存在于设计理念之中,而不是缺乏设计模式的抽象,也不是未重构的代码。先别急着反驳,也别急着嗤之以鼻,先想想这些设计理念的优点,看看是不是微不足道,再看看这些理念的缺点,是不是有可能铸成大错,作者还给出了去掉这些坏味道的某个思路,即作者自己的思路,仅供参考。最后,别忘了想想自己手中的软件的设计,看看会不会遇到其中的熟面孔啊。。。。。

1。味道:控件耦合。
“如果第一个复选框被选中,那么下面的文本域全部失效。”通过这种方式表述的效果在软件开发中经常遇到,很多人称之为“界面逻辑”,想想看,界面逻辑真的可以直接变成代码吗?
典型重构思路:有限状态机。
状态与控件属性集一一对应,控件属性被改变时,状态机收到事件,检查状态是否发生了迁移,如果是则向控件属性集的控制器发出状态迁移事件,控制器批量改变控件状态。

2。味道:控件/绘制器存在状态。
有人认为Motif和Windows已经差别很大了,有没有想过它们和IBM收银机上的字符界面差别有多大呢?既然差别这么大的绘制器仍然存在相同的复杂了(有时是很复杂的)状态,那我们为什么不把它们extract出来而要让它们冗余呢?
典型重构思路:视图的模型。
视图有视图的模型,并不是MVC中的模型,这种方式就是Swing的基础。

3。味道:视图发出有意义的事件。
什么?你的意思是视图应该发出无意义的事件咯?不是这样吗?视图应该不了解任何业务逻辑,也不应该了解任何界面逻辑,如果界面逻辑真的存在的话。
典型重构思路:事件翻译器。
视图发出无意义的事件,比如鼠标事件,键盘事件,或某个控件的事件,事件翻译器把低级事件翻译为高级事件,再把高级事件包装成请求,请求被传递给一个根控制器。

4。味道:动作/命令知道自己的形象。
很多时候,一个Action或者一个Command都知道自己叫什么名字,能不能被禁用,有没有被禁用,图标如何,甚至还知道及时帮助的字符串,执行需要什么条件,返回什么结果等等,如果这么做的话Action和Command就有了自己的视图状态,发出了第2种味道。
典型重构思路:动作代理。
重磅的工作交给代理完成,动作/命令只是一个视图的模型罢了。在UI系统装载之初,动作/命令被装载并绘制在界面上,直到用户点击或触发了这个动作/命令,它的代理才被调入并开始工作。

5。味道:模型知道自己的每一个用处。
有n种视图对应同一个模型,比如对一个网页制作工具来说,一个html文件至少有三种视图:代码、设计、预览。如果模型同时能满足这三种视图的需求的话,这个模型就太重磅了,而且还不好添加一种新视图。比如Dreamwaver的代码/设计页面。
典型重构思路1:一个模型,多个维度。
如果一个模型拥有n个维度,则n个对象,就可以确定一个事实,n-1个对象就可以得到一个线性聚集,n-2个对象就可以得到一个二维表。每个维度就是一组Interface,而事实的类型,其实是不可见的,(内部的巨大类型),只能通过维度确定事实,再提取事实的属性。
典型重构思路2:适配器模式。
模型首先实现最必要的接口,然后当需要模型实现某个非必要接口时,模型会主动或被动的适配为一个满足需求接口的“意外”对象。

6。味道:控制器变成顾问类。
有些人认为我们的社会需要复合型的人才,因为每个人都要具备管理的能力,控制器也要懂管理,它要负责视图和模型之间的交互。但是仔细想想,如果被模型以外的对象知道了业务逻辑的话,那模型还可以替换吗?
典型重构思路:控制器标准化。
控制器将请求包装为命令,并将命令交给命令堆栈执行。控制器并不了解模型,模型只能由模型自己了解,控制器也不知道领域逻辑,它只是做一些机械的翻译工作,并利用视图和模型提供的(互补相关)的素材,创建和模型相关的命令。

7。味道:模型变成无所不知博士。
在没有发生上面六种情况的时候,千万不要大意啊,你很有可能发生了这一种情况,恰恰是因为控制器和视图都不知道业务逻辑,模型才有可能发展为Dr.Know。但是视图往往是树状结构的啊,它怎么和Dr.Know合作呢?通过代理?还是Facade?
典型重构思路:复杂模型结构(树状、图状、知识/操作分离)。
如果有可能,模型也是树状的,可以和视图一一对应;如果这一点做不到,不要紧,可以把大模型划分成轻量小板块,或者迭代子,再用关系对象解释它们之间的关系;如果还不行,那总得做到知识和操作分离吧。。。。。。。
分享到:
评论

相关推荐

    QT代码统计器QT代码统计器

    通过定期进行代码统计和分析,可以发现潜在的代码异味(code smell),并及时进行重构,以保持代码的可读性和可维护性。 总之,QT代码统计器是QT开发环境中一个实用的辅助工具,它通过提供详细的代码统计信息,帮助...

    Source Counter【代码统计工具】

    这款工具在IT行业中尤其对于项目管理和软件开发团队具有很高的实用价值,因为它可以帮助量化开发工作量,评估项目的进度,以及进行代码质量分析。 代码统计是软件工程中的一个重要环节,它能够提供关于代码库的详细...

    代码大全chm格式----其它书不要,这本书不可不要

    如何通过良好的命名约定、注释和文档来提高代码的可理解性,以及如何避免代码异味。 2. **设计模式**:介绍了多种被广泛接受的设计模式,如工厂模式、观察者模式、单例模式等,这些模式可以帮助解决常见的编程问题...

    Ruby-Flay分析代码结构的相似之处

    Flay是Ruby社区中的一款开源工具,专门用于分析代码结构的相似之处,从而帮助开发者发现潜在的重复代码、重构机会以及可能的代码异味。 Flay通过检查代码中的不同元素,如文字值、变量、类和方法名称,甚至包括空格...

    代码统计工具

    它可以反映出项目的工作量,但需要注意,不同编程语言和编程风格的代码行数并不具有直接可比性。 - 代码统计工具通常会区分注释行、空行和实际执行的代码行,提供更精确的统计结果。 2. **数文件行数**: - 统计...

    sonar-2.14代码质量管理

    SonarQube通过对源代码进行静态分析,可以检测出诸如代码异味、潜在错误、复杂度过高、重复代码等质量问题。这些分析结果不仅展示了问题的严重程度,还提供了修复建议,使得开发者能够在编码阶段就能及时发现并改进...

    重构-改善既有代码的设计

    这一主题在软件开发领域具有极其重要的地位,它不仅关乎代码质量的提升,更直接影响到软件的可维护性、可扩展性和开发效率。 ### 一、重构的概念 重构是指在不改变软件外部行为的前提下,对代码进行结构上的调整,...

    重构 改善既有代码的设计(十分经典的计算机书籍)

    - **代码“异味”检测**:这部分讲解了如何识别代码中存在的问题,即所谓的“代码异味”。这些异味可能是冗余代码、复杂的逻辑结构或者其他不利于维护的因素。 - **重构技巧集锦**:本书的核心部分,提供了超过70种...

    sonar代码管理工具6.7.5

    SonarQube是一款强大的代码质量管理工具,主要用于检测和分析源代码中的潜在问题,如bug、代码异味、重复代码以及不遵循编码规范的情况。其6.7.5版本是该产品的一个稳定版本,提供了多种功能来提升软件开发的质量...

    代码大全经典

    3. **重构与改善**:书中详细阐述了重构的必要性和方法,包括识别代码异味、提取函数、移动函数、替换条件表达式等重构技术,旨在优化代码结构,提高代码可读性。 4. **错误处理**:书中讨论了错误处理策略,强调...

    代码质量扫描工具sonarqube-7.1,包含中文包

    SonarQube是一款强大的代码质量管理工具,主要用于检测和分析源代码中的潜在问题,包括但不限于代码异味、错误、漏洞和代码复杂性。它提供了一个统一的平台,帮助开发团队实现持续集成和持续质量改进,支持多种编程...

    代码统计工具 + 截屏工具

    5. **代码质量检测**:一些工具还能进行静态代码分析,检查潜在的编码错误、不规范的编程习惯或代码异味,提升代码质量。 6. **历史趋势**:集成版本控制系统(如Git)的统计工具可以展示代码随时间的变化,帮助...

    NebulisAnalytics开源代码跟踪软件

    这个工具在JavaScript开发领域中具有广泛的应用价值,尤其是在处理"其它杂项"类别的编程任务时,能够帮助开发者更好地理解和优化他们的代码库。 1. **实时分析**:Nebulis Analytics的核心特性在于其实时性。它能够...

    重构_改善既有代码的设计(中文版)

    6. **代码异味(Code Smell)**:代码异味是指代码中可能存在问题或需要改进的迹象。识别并消除这些异味是重构工作的起点,如过长的函数、重复代码、复杂的条件表达式等。 7. **设计模式与重构**:设计模式是解决...

    重构—改善既有代码的设计.pdf

    3. **重构时机**:重构可以在发现代码异味(Code Smell)时进行,这些异味可能包括重复代码、过长函数、复杂的条件表达式等。及时识别并消除这些异味有助于维护代码健康。 4. **重构步骤**:通常包括识别问题、编写...

    PhpDependencyAnalysis一个静态代码分析工具用来创建可定制的依赖图

    这种分析方法可以发现潜在的错误、代码异味、不一致性和复杂性,帮助开发者提前预防和修复问题,而不是等到运行时才发现。 **2. 依赖图的生成** `PhpDependencyAnalysis` 的核心功能是生成依赖图,它通过解析PHP...

    jacoco+sonar代码覆盖率工具.zip

    SonarQube通过分析代码的复杂性、潜在漏洞、代码异味(code smell)和重复代码来提升代码质量和可维护性。它还可以集成持续集成工具如Jenkins,确保每次代码提交都会进行质量检查。 在`sonarqube-6.7.7.zip`中,...

    统计源代码量源码(java编程)

    10. **代码质量管理**:统计源代码量也是代码质量管理的一部分,可以用来评估代码复杂度,找出潜在的代码异味(code smell),并进行重构,以提高代码质量和可维护性。 以上就是关于“统计源代码量源码”程序的一些...

    重构:改善基既有的代码设计.

    《重构:改善既有代码设计》是一本经典的软件开发著作,主要针对Java编程语言,但其核心理念和原则在任何编程语言中都具有普遍价值。本书深入探讨了如何通过一系列微小而频繁的改进,逐步优化已有代码,以提高代码...

    重构改善既有代码的设计

    4. **关注“代码异味”**:识别代码中的不良模式或结构,这些往往是重构的目标。 5. **使用合适的工具**:现代IDE和其他工具可以提供自动化的重构支持,极大地提高了重构效率。 #### 三、重构的实践方法 1. **命名...

Global site tag (gtag.js) - Google Analytics