惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
S
Schneier on Security
H
Help Net Security
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
H
Hacker News: Front Page
C
Check Point Blog
P
Privacy International News Feed
IT之家
IT之家
爱范儿
爱范儿
AWS News Blog
AWS News Blog
The Hacker News
The Hacker News
Stack Overflow Blog
Stack Overflow Blog
Project Zero
Project Zero
Microsoft Azure Blog
Microsoft Azure Blog
量子位
The Cloudflare Blog
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Cybersecurity and Infrastructure Security Agency CISA
I
Intezer
Martin Fowler
Martin Fowler
Scott Helme
Scott Helme
酷 壳 – CoolShell
酷 壳 – CoolShell
A
Arctic Wolf
T
Threat Research - Cisco Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
The Exploit Database - CXSecurity.com
B
Blog
Simon Willison's Weblog
Simon Willison's Weblog
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
博客园_首页
J
Java Code Geeks
K
Kaspersky official blog
Webroot Blog
Webroot Blog
C
CERT Recently Published Vulnerability Notes
H
Heimdal Security Blog
G
Google Developers Blog
T
Tor Project blog
W
WeLiveSecurity
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Blog — PlanetScale
Blog — PlanetScale
小众软件
小众软件
有赞技术团队
有赞技术团队

博客园 - niceboy

Redhat Linux 7.3 虚拟机通过USB挂载NTFS格式的移动硬盘 自己写的一个记录日常事务的小软件,也可以作为密码保险箱和提醒工具 访问IIS元数据库失败解决办法 海事卫星通信 关于GPS车载终端的研究 操作或事件已被禁用模式阻止 售前工程师的来世今生(转载自IT售前论坛的经典基础知识)【转】 用Oracle Instant client 打包Oracle客户端 Oracle数据库中 编号自动增长的实现 关于FTP端口【转】 轻松掌握使用 SQL Server 浏览器,解决SQL Server 2005跨网段不能连接问题 论《金瓶梅》与项目管理中人际关系协调 软件开发质量管理层次模型 软件开发中项目需求管理简述 软件测试的基本概念和方法 Web应用程序的整体测试 VSS使用手册 .Net 2.0新功能:重构(Refactoring)(4) .Net 2.0新功能:重构(Refactoring)(3)
.Net 2.0新功能:重构(Refactoring)(2)
niceboy · 2008-08-21 · via 博客园 - niceboy

Kent Beck提出了“代码坏味道”的说法,和我们所提出的“队伍变形”是同样的意思,队伍变形的信号是什么呢?以下列述的代码症状就是“队伍变形”的强烈信号:

代码中存在重复的代码

中国有118 家整车生产企业,数量几乎等于美、日、欧所有汽车厂家数之和,但是全国的年产量却不及一个外国大汽车公司的产量。重复建设只会导致效率的低效和资源的浪费。

程序代码更是不能搞重复建设,如果同一个类中有相同的代码块,请把它提炼成类的一个独立方法,如果不同类中具有相同的代码,请把它提炼成一个新类,永远不要重复代码。

过大的类和过长的方法

过大的类往往是类抽象不合理的结果,类抽象不合理将降低了代码的复用率。方法是类王国中的诸侯国, 诸侯国太大势必动摇中央集权。过长的方法由于包含的逻辑过于复杂,错误机率将直线上升,而可读性则直线下降,类的健壮性很容易被打破。当看到一个过长的方 法时,需要想办法将其划分为多个小方法,以便于分而治之。

牵一毛而需要动全身的修改

当你发现修改一个小功能,或增加一个小功能时,就引发一次代码地震,也许是你的设计抽象度不够理想,功能代码太过分散所引起的。

类之间需要过多的通讯

A类需要调用B类的过多方法访问B的内部数据,在关系上这两个类显得有点狎昵,可能这两个类本应该在一起,而不应该分家。

过度耦合的信息链

“计算机是这样一门科学,它相信可以通过添加一个中间层解决任何问题”,所以往往中间层会被过多地追加到程序中。如果你在代码中看到需要获取一个信息,需要一个类的方法调用另一个类的方法,层层挂接,就象输油管一样节节相连。这往往是因为衔接层太多造成的,需要查看就否有可移除的中间层,或是否可以提供更直接的调用方法。

各立山头干革命

如果你发现有两个类或两个方法虽然命名不同但却拥有相似或相同的功能,你会发现往往是因为开发团队成员协调不够造成的。笔者曾经写了一个颇好用的字符串处理类,但因为没有及时通告团队其他人员,后来发现项目中居然有三个字符串处理类。革命资源是珍贵的,我们不应各立山头干革命。

不完美的设计

在笔者刚完成的一个比对报警项目中,曾安排阿朱开发报警模块,即通过Socket向指定的短信平台、语音平台及客户端报 警器插件发送报警报文信息,阿朱出色地完成了这项任务。后来用户又提出了实时比对的需求,即要求第三方系统以报文形式向比对报警系统发送请求,比对报警系 统接收并响应这个请求。这又需要用到Socket报文通讯,由于原来的设计没有将报文通讯模块独立出来,所以无法复用阿朱开发的代码。后来我及时调整了这个设计,新增了一个报文收发模块,使系统所有的对外通讯都复用这个模块,系统的整体设计也显得更加合理。

每个系统都或多或少存在不完美的设计,刚开始可能注意不到,到后来才会慢慢凸显出来,此时唯有勇于更改才是最好的出路。

缺少必要的注释

虽然许多软件工程的 书籍常提醒程序员需要防止过多注释,但这个担心好象并没有什么必要。往往程序员更感兴趣的是功能实现而非代码注释,因为前者更能带来成就感,所以代码注释 往往不是过多而是过少,过于简单。人的记忆曲线下降的坡度是陡得吓人的,当过了一段时间后再回头补注释时,很容易发生"提笔忘字,愈言且止"的情形。

曾在网上看到过微软的代码注释,其详尽程度让人叹为观止,也从中体悟到了微软成功的一个经验。 

5、如何使用重构

VS.NET 2005中包括一个菜单“重构”,你可以用它来实现一些常见的重构任务。

VS.NET 2005进行重构的方法有以下几个:

重构类型

<1>提取方法

<2>重命名

<3>封装字段

<4>提取接口

<5>将局部变量提升为参数

<6>移除参数

<7>重新排列参数

【1】提取方法

<1>可以通过从现有成员的代码块中提取选定的代码来创建新方法。

<2>创建的新方法中包含选定的代码,而现有成员中的选定代码被替换为对新方法的调用。

<3>代码段转换为其自己的方法,使您可以快速而准确地重新组织代码,以获得更好的重用和可靠性。

优点

<1>通过强调离散的可重用方法鼓励最佳的编码做法。

<2>鼓励通过较好的组织获得自记录代码。当使用描述性名称时,高级别方法可以像读取一系列注释一样进行读取。

<3>鼓励创建细化方法,以简化重载。

<4>减少代码重复。