对
于每个编码人员来说,避免重复代码可能是大家都想做的。对于有一定经验(对基本的OO原则有一定经验)的开发人员来说,大部分情况下都能比较自然地避免重
复代码的问题,写代码的时候,感觉有逻辑重复的情况,会很自然的凭感觉经验做相应的处理和复用。 以下是个人经验,供新手参考。
既然我们在用Java之类的面向对象的语言编码,那么重复代码可以大致分为如下两种情况:
1、类型体系之内(父类型和子类型、子类型之间)存在重复逻辑代码
2、类型体系之外的重复代码
【类型体系内的重复代码处理】
1、如果重复代码属于类型本身操作(即应该是以实例方法存在),则很自然的应用重构技巧,公共代码往上走。如果Sub Type之间有这种重复代码,把重复代码迁移到DefaultAdatper中。
2、如果重复代码不属于类型本身操作(即应该是以静态方法存在),则需要判断一下这种静态代码的功能使用范围:
A、如果是非常全局性的,例如有关java流的辅助操作,则应该果断的抽取出来,封装到一个Utility工具类中,例如可以叫
做IOUtil。把这个Utility类放置到非常底层模块中,这样上层很多功能模块中都可以使用,否则可能会导致上层多个模块中都有类似IOUtil的
类,又是重复代码。
1
public
class
IOUtil {
2
/**
3
* 工具类,不需要产生实例。 但是也不需要应用单态!!!
4
*/
5
private
IOUtil() {}
6
7
public
static
InputStream buildInputSteam(File file) {
//
}
8
9
//
其他公共静态操作
10
}
B、如果这种静态操作只对本类型体系有意义,则有两种常用的处理方法:第一种是把这种静态方法迁移到基类
DefaultAdapter中,但是不要在DefaultAdapter中放置过多的类似静态方法;第二种是把这种静态方法封装到一个helper助手
类中,例如MyTypeHelper,其中放置了MyType类型体系中需要使用的一些静态方法。如果第一种DefaultAdapter中堆放了较多的
静态方法,则可以用helper助手类的方式。
1
public
class
MyTypeHelper {
2
/**
3
* 助手类,不需要产生实例。 但是也不需要应用单态!!!
4
*/
5
private
MyTypeHelper() {}
6
7
public
static
boolean
validateParamer(Object paramer) {
//
}
8
9
//
其他公共静态操作
10
}
这个helper一般需要和接口、默认适配类一起暴露,便于扩展子类型使用。示意图如下:
【类型体系之外的重复代码处理】
类型体系之外的重复代码处理相对就很简单了,根据重复代码功能适用范围,封装到对应的Util类或者Helper类中。这里就不细讲了~_~
【有关公用代码的几个概念】
个人意见,仅供参考。
助手类(Helper class)
:
我觉得首先这个类产生的目的是为特定模块或者特定功能服务的(助手吗~_~),不是全局的。而且完全可以隐藏在特定模块内部,很多时候不需要暴露。
Helper类的命名要有针对性,不能搞成一个麻辣烫,里面的静态操作既为这种功能服务,又为那种功能服务,尽量做个忠臣,不要同时当多个主子的助手。
工具类(Utility class)
:一般是全局的,往往有一定普世价值,也就是说往往是全局通用的。
例如你在做一个模块,这个模块功能是处理表单,则关于处理表单的一些公用静态操作就应该放置到该模块的一个助手类中,名称类似于
FormProcesserHelper。再有一个导出报表的功能,则对应的助手类可以称之为ExportReportHelper,建议这两个
helper不要混在一起。 有人可能会说,这样会不会导致大量的助手类呢?这边有个粒度把握的问题(经验会发生作用~_~),但是只要是助手类命名规
范,则一个助手类的名字就基本上可以告诉用户你提供什么样的服务了。
假如你现在处理的是有关IO操作的重复代码,则需要迁移到全局的工具类中,因为这样的操作往往适应于全局的。
Facade class(门面类)
:这个乍看起来和助手类有点像,往往是绑定于特定模块。但是,要搞清楚,门面类是用来封装子系统的,代理对模块常用核心功能的访问的,针对用户需要的常用场景提供一些辅助操作,帮助用户更好的使用此模块的主要功能。面向客户端或者其他子系统或模块的,不是用来处理对应模块中重复代码的
!!!有关详细信息,请参加Facade设计模式的文档。
【注意】Helper class、Utility class、Facade class一般都不需要生实例,暴露的都是静态操作,更不需要误写成单态,别滥用单态!!!
后记::
关于重复代码的处理,个人以为既需要技巧(别人总结出来的技巧),更需要经验(经验往往给你感觉,跟着感觉走一般就不会太离谱~_~)。 希望对开发新手有作用~_~
分享到:
相关推荐
仅供参考,copy冲查重塔峰。 算法设计与分析-4动态规划金罐游戏源代码.cpp (1) 动态规划算法设计思想。 (2) 金罐游戏问题的动态规划解法。 通过本次实验,我尝试了使用蛮力法(简单重复递归)和动态规划解决...
<项目介绍> Python网络爬虫与推荐算法的新闻推荐平台 介绍 网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
要特性 - 使用最新技术栈,社区资源丰富,基于Java 21(Core Module Support 17-21)、Spring Boot 3.2。 (Support Virtual Threads/fibre...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
我们有许多源代码公开的操作系统,可供随时下载和阅读,看上去好像让实现一个供自己把玩的微型操作系统变得容易很多,但事实往往不尽人意,因为这些代码动辄上万甚至几十几百万行,而且细节之间经常互相关联,要...
我们有许多源代码公开的操作系统,可供随时下载和阅读,看上去好像让实现一个供自己把玩的微型操作系统变得容易很多,但事实往往不尽人意,因为这些代码动辄上万甚至几十几百万行,而且细节之间经常互相关联,要...
仅供参考交流,QQ:1821587421 其它可交流方案: GPS车辆监控系统:终端原理图PCB源码整套(稳定成熟可接多个外设);平台整套源码。 LED屏:公交,出租等 原理图PCB;PC端软件等;PDA控制LED屏程序源码。 DVR:...
压力测试 服务器是学生服务器,就是腾讯那个10元的服务器,在本地利用jmeter压测工具设置5000个线程、10000个请求时,首页的QPS为1024,而...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
Maven基于SSM+Shiro小区垃圾分类管理系统设计毕业源码案例设计 开发软件:Eclipse或Idea 数据库:mysql 开发技术: 前端...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何关系。谢谢合作 本书共分4部分,从...
jQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。jQuery能够使用户的html页保持代码和html内容分离,也就是说,不用再在html里面插入一堆js来调用命令...
本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何关系。谢谢合作 本书共分4部分,从...
本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何关系。谢谢合作 本书共分4部分,从...
本博客提供的所有教程的资源原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何关系。谢谢合作 本书共分4部分,从...
通过科技文献检索可避免科研重复,加快科研工作的进程. 5.通过科技文献检索能加强科技交流,促进技术合作。 第三节 科技文献的特点及类型 1.什么是科技文献? 含有知识内容的信息载体。 2.构成文献的三要素:知识...
当然,这些内容都很重要,但并不是大多数仅想学习SQL的读者所感兴趣的。 因此,在找不到合适的书籍推荐给学生的情况下,我把在课堂上给学生讲授的SQL知识汇编成了本书。本书将讲授读者需要了解的SQL知识,我们从...
注意:静态编译后的易语言EXE和DLL之间不能再共享“某些”句柄或资源,这一点和原动态连接时的程序行为不能保持一致,使用时请务必设法避免此类用法(MYSQL支持库我们作了特别处理)。 注意:静态编译后常量数据...
为了避免上述问题除了设法分割两电路block之外,设计电路板之前充分检讨设计构想,才是根本应有的手法,基本上设计高频电路用电路板必需掌握下列三大原则:  高质感。  不可取巧。 ...
优化部分服务启动逻辑,避免没有必要的多次重复启动 PPPoE拨号界面下,“定时重新连接”功能改为对两种拨号策略都有效 1.1 - Build 20120222 优化服务进程结束函数 尝试解决VINT版部分机型无线驱动未加载的bug 1.1...
' 0~999 系统级子程序,仅供系统使用,用户只可修改参数或进行调用,不可使用这些程序号自行编写子 程序 ' 其中: ' 0~199 由Ncstudio主程序使用的子程序 ' 200~999 由解析引擎内部使用的子程序 ' 该类子程序每个...
正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不...你可以坚持使用完整的三个字符来表示转义序列,这们就可以避免混淆了.例如, 使用 \044,而不是\44.下面是正则表达式的选择、分组和引用字符: ...