重构36计(4)

第十九计:避免类的臃肿

  在我接触过的大部分项目中,总会有一个“大胖子“类特别惹眼,一般来说,这“大胖子“实际上是整个系统的核心类之一,之所以“胖“,主要原因是很多人都会把自己需要的函数加到这个类中,却没有人主动请缨来为它“减肥“。可以通过以下几种方式来为它“瘦身”:

  1、按照某种特性(如功能、类型等)将这个类拆分成多个类。

  2、合并冗余函数,保持函数粒度的最小化。

  3、去除重复代码。

  如果实在不能再“瘦”了,那就通过实现相应的接口,让它“看上去很瘦“,举个例子:

  

public class BigBoy{public void foo1();public void foo2();public void foo3();public void foo4();public void foo5();public void foo6();public void foo7();public void foo8();public void foo9();// 还有很多...
}

 

这个类有很多函数,这让类的使用者很头疼,没办法,它不能再“瘦“了,不过,我们可以根据某种特性把这些函数抽象成多个接口,例如foo1、foo2、foo3可以抽象成一个接口:

public interface LittleBoy{public void foo1();public void foo2();public void foo3();
}

 

然后让BigBoy实现这个接口,并提供一个将BigBoy变成LitterBoy的函数:

 

 

public class BigBoy implements LittleBoy{public LittleBoy asLittleBoy{)return this;}public void foo1();public void foo2();public void foo3();public void foo4();public void foo5();public void foo6();public void foo7();public void foo8();public void foo9();// 还有很多...
}

 

这样,类的使用者得到将是“瘦版“的BigBoy,使用难度大大降低了,因此,对于需要使用该类所有函数中某个子集的用户,我们可以提供一个包含该函数子集的接口实现对象即可。

 

第二十计:保持代码风格的一致性

  程序员或多或少都有各自的代码风格,当我们看和自己风格不同的人写的代码时都觉得有点别扭,甚至会影响读代码的流畅性,记得以前有个同事把for语句当if语句用,像下面这样,太个性了,看他的代码真有点头疼。

  

for(;value>10;){...
}

整个程序保持一致的代码风格还是比较重要的,如果看着就像一个人写那就太到位了,所以,最好能在项目初期就统一程序的命名规范、通过逻辑处理规范、注释规范等。

 

第二十一计:成员变量要封装

  大部分情况下,类中的成员变量都应该被声明为私有的,为那些需要被其他类访问的变量增加set或者get函数。如果成员变量声明为公有的,那么类就失去了对它们的控制权!封装成员变量有以下几个好处:

  1、在为成员变量赋值时进行有效性校验或其他预处理操作。

  2、在返回成员变量的值时进行二次包装,当该变量不可用或未初始化时返回默认值。

  为成员变量分别增加set和get函数是一件挺繁琐的事情,很多人嫌麻烦,觉得公有成员变量更方便,不过从可维护性和可扩展性的角度看,添加set和get是值得的,Eclipse中可以自动生成set和get函数的,非常方便。

 

第二十二计:用自注释性变量代替复杂条件

  嵌套层次较深的IF判断、没有注释的复杂条件大大增加了程序的逻辑复杂性,严重降低代码的可读性。对于子条件较多的条件判定,可以为各个子条件引入具有自注释性的临时变量来降低复杂性。例如下面是判断登录用户是否能进入网站的后台管理界面:

  

if(userName!=null && userName.equals(name) && (userState != INACTIVE || userState != DELETE) && userPassword!=null && userPassword.equals(password) && (userGroup == "Manager" || userGroup == "Root")){...
}

 

 

  下面是修改后的版本:

  boolean isUserNameValid = userName!=null && userName.equals(name);
  boolean isUserActive = userState != INACTIVE || userState != DELETE;boolean isUserPasswordCorrect = userPassword!=null && userPassword.equals(password);boolean isUserHasAuth = userGroup == "Manager" || userGroup == "Root";
if(isUserNameValid && isUserActive && isUserPasswordCorrect && isUserHasAuth){...}

 

第二种方式不仅使条件判断更具有可读性,还能重用子条件。

 

第二十三计:避免重复代码

  重复代码是破坏程序可维护性的重量级选手之一,大量的重复代码会使代码量膨胀,修改重复的代码也很繁琐,改了一处后必须同时修改和它重复的代码,因此非常引入Bug,当有人修改了某处代码而忘记修改其他除重复的代码,那么Bug就出现了。所以,一旦要拷贝某段代码,请先考虑把这段代码通用化。

 

第二十四计:增加注释

  记得在第一个公司工作的时候,公司很多程序员的代码注释率在40%左右,一般都是先写注释,然后紧接着写代码,因为注释也是一种文档。很多人觉得写注释浪费时间或者没有必要,所以他们的代码中没有绿色,或者只是星星点点,如果代码有一定的复杂性,那么其他人看这部分代码可能会比代码作者要费劲的多,注释就是帮助别人快速理解自己写的代码。

 

转载于:https://www.cnblogs.com/west-link/archive/2012/04/18/2447071.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle透明网关 中文,Oracle透明网关的一些文章

Oracle透明网关的一些文章: http://www.oracle.com/technetwork/database/gateways/index.html Oracle透明网关的认证清单见下: http://www.oracle.com/technetwork/database/gateways/certmatrix-168347.pdf Oracle透明网关的相关MOS文章: How to Configure DG4MSQL (Database…

HDOJ1879(继续畅通工程)

题目链接 最小生成树的题。克鲁斯卡尔算法。 View Code 1 #include <stdio.h>2 #define N 1003 #define M 50004 struct node5 {6 int a,b,d;7 }edge[M];8 int n;9 int p[N]; 10 void make_set() 11 { 12 int i; 13 for(i1;i<n;i) p[i]i; 14 } 15 int …

学不会的JAVA,消不了的忧愁! 1

亲爱的网友&#xff0c;和大家一样&#xff0c;来这里看贴子的&#xff0c;都会有一个共同的地方&#xff0c;那就是对JAVA有着或深或浅的爱好。 或许是我太笨吧&#xff0c;有不少书上明明写着&#xff0c;JAVA是一种很容易学习的编程语言&#xff0c;但我断断续续学过近两年的…

bug是什么PHP,bug是什么

在程序设计中&#xff0c;bug一词&#xff0c;是我们经常听到的&#xff0c;那么bug是什么意思&#xff0c;下面我们来总结一下。什么是bug?在IT中&#xff0c;bug一般表示程序中出现的错误&#xff0c;因为软件运行中出现错误&#xff0c;或者是硬件造成的错误&#xff0c;出…

程序员的十层楼

转自&#xff1a;http://sunfengcheng.iteye.com/blog/326198 自西方文艺复兴以来&#xff0c;中国在自然科学方面落后西方很多&#xff0c;软件领域也不例外。当然现在中国的许多程序员们对此可能有许多不同的意见&#xff0c;有些人认为中国的程序员水平远落后于西方&#xf…

php 渐变色,段落每行渐变色文本效果

这次给大家带来段落每行渐变色文本效果&#xff0c;段落每行渐变色文本效果的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。今天小编在Codepen上看到一个CSS写的效果。一个段落的每行文本是渐变效果。对于单行文本或单个词实现渐变填充效果并不是什么…

linux中apache配置文件在哪,linux网站服务Apache的安装与配置方法详解

这篇文章介绍下linux网站服务apache的安装与配置方法&#xff0c;包括挂载光盘&#xff0c;安装http服务&#xff0c;管理httpd服务&#xff0c;httpd的配置文件几大部分。具体详情可以参考下文。1.挂载光盘自己习惯将光盘挂载在/media/cdrom目录&#xff0c;在做本地yum源的时…

mysql数据到导入导出

问题&#xff1a;500M的库表数据&#xff0c;需要导入到新的数据库中。 首先通过控制台进入mysqlmysql -u root -p 12345CREATE DATABASE demo DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;use demo&#xff1b;切换数据库source file.sql 导入数据&#xff0c;这其中…

linux安装数据库依赖包,Linux下安装DB2的包依赖

检查的时候&#xff0c;报包依赖错误&#xff0c;解决办法yum install libaio-0.3.109-13.el7.i686yum install libstdc.so.6yum install pam-devel.i686yum install pam.i686yum whatprovides package-name1.DBT3514W The db2prereqcheck utility failed to find the followi…

SEO笔记—网页结构优化(四)

网页结构优化是页面优化的重点之一&#xff0c;它是对网页内容布局的规划&#xff0c;合理的网页结构能够有效地提高用户体验和搜索引擎的友好性。网页主要包含导航栏、栏目以及正文三部分组成&#xff0c;对网页结构的主要也是围绕这三部分进行的。 1、页面重要区域分布规律 搜…

linux下spi有哪些函数,linux下怎么快速的使用 SPI 驱动。

ek_spi_devices 数组就在本文件内。/** SPI devices.*/static struct spi_board_info ek_spi_devices[] {#if !(defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_AT91)){/* DataFlash chip */.modalias "mtd_dataflash",.chip_select 1,.max_speed_hz 15 * 100…

hasLayout和filter滤镜的细节

filter:alpha(opacity60); IE(<9)透明滤镜失效。 如果我们设置宽度后filter就会有效果&#xff0c;而这个没有设置宽度hasLayout 属性值是0 熟悉haslayout 的都知道&#xff0c;这个表示当前容器不是一个有形体 在IE中filter套用到容器上时&#xff0c;容器必需是「有形体」…

printf函数源码linux,再来一版简易的printf函数实现

以前发过两版简易的串口printf函数实现&#xff0c;最近搞了一段时间Linux的库文件&#xff0c;回过头又有不同的理解。这一版函数基于MSP430F169&#xff0c;%d %x %o %b的实现不再由自己编写函数&#xff0c;而是调用MSP430-GCC的标准库函数&#xff1a;#include char *itoa(…

GTK+ 2.4 or later isn't available

.configure: error: GTK 2.4 or later isnt available, sudo yum install gtk2.0-devel 转载于:https://www.cnblogs.com/greencolor/archive/2012/05/02/2478397.html

linux搭建rabbitmq环境,RabbitMQlinux-centos环境配置

安装erlangyum install -y openssl openssl-devel ncurses-develcurl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash#源码安装wget http://erlang.org/download/otp_src_22.2.tar.gztar -zxvf otp_src_22.2.tar.gz.configure --…

SQL 查询横表变竖表

首先是三张表&#xff0c; CNo对应的是课程&#xff0c;在这里我就粘贴了。 主表 人名表 按照常规查询 SELECT s.SName, c.CName,s2.SCgrade FROM S s INNER JOIN SC s2 ON s2.SNo s.SNo INNER JOIN C c ON c.CNo s2.CNo 那么结果是这样的 但是这是横表 不是我想…

回调方法

http://zhidao.baidu.com/question/152400264.html 在Java中&#xff0c;就是类A调用类B中的某个方法b&#xff0c;然后类B又在某个时候反过来调用类A中的某个方法a&#xff0c;对于A来说&#xff0c;这个a方法便叫做回调方法pubilc interface CallBack{ public void callba…

linux如何获取声卡信息,ubuntu下怎么查看声卡型号?

在Ubuntu上查看声卡型号执行如下命令&#xff1a;~# lspci |grep -i audio~/WorkSpace/mobvoi_test$ lspci |grep -i audio02:02.0 Multimedia audio controller: Ensoniq ES1371 / Creative Labs CT2518/ES1373 (rev 02)1、查看声卡信息~# cat /proc/asound/cards/WorkSpace/m…

linux错误日志重定向,Linux shell 重定向标准错误输出

文件描述符文件描述符是程序发送输出和获取输入的地方。当执行一个程序时&#xff0c;运行该程序的进程打开了3个文件描述符&#xff0c;分别是&#xff1a;0(标准输入)、1(标准输出)和2(标准错误输出)。重定向输出符号(>)是1>的简写&#xff0c;它通知shell重定向标准输…

linux apache中文名称图片,Apache、NGINX支持中文URL图片、文件名的终极解决方案

本帖最后由 vzandy 于 2013-3-15 15:40 编辑Apache(32位)&#xff1a;安装环境&#xff1a;CentOS 5.6 Apache 2.2.15安装结果&#xff1a;安装后支持“中文图片、文件名”链接直接打开以下为安装过程&#xff1a;1、下载安装包wget ftp://ftp.aconus.com/fc5/mod_encoding/mo…