对
于每个编码人员来说,避免重复代码可能是大家都想做的。对于有一定经验(对基本的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一般都不需要生实例,暴露的都是静态操作,更不需要误写成单态,别滥用单态!!!
后记::
关于重复代码的处理,个人以为既需要技巧(别人总结出来的技巧),更需要经验(经验往往给你感觉,跟着感觉走一般就不会太离谱~_~)。 希望对开发新手有作用~_~
分享到:
相关推荐
3. **算法效率**:检查你的栈操作是否高效,避免不必要的遍历或重复计算。 4. **可读性**:函数和变量的命名应清晰反映其功能,注释应简洁明了,解释关键逻辑。 5. **模块化**:考虑将代码拆分为更小的功能模块,...
"设计模式代码-仅供参考"这个主题,意味着我们将探讨如何通过代码实现这些设计模式。 在给定的标签“源码”和“工具”中,我们可以推测这个压缩包可能包含了用于理解和学习设计模式的实际代码示例。源码是理解设计...
### C#实现高斯误差函数 #### 背景与定义 ...例如,可以考虑使用更高级的数值积分方法,或者引入缓存机制来避免重复计算相同或相似的积分值。此外,还可以加入异常处理机制,以增强程序的健壮性和用户体验。
【标题】"java约苗秒杀,老版本仅供参考使用2.zip" 暗示这是一个使用Java编程语言开发的疫苗预约系统的老版本代码。这个系统可能是为了应对疫苗紧缺时的在线秒杀活动,帮助用户快速预约接种疫苗。由于是“老版本”,...
9. `functions.cmake`:包含了项目中重复使用的CMake函数,提高了代码的可维护性。 在学习和使用Matplot++时,理解这些CMake文件的作用至关重要,因为它们是构建和配置项目的关键。开发者需要根据自己的环境修改或...
良好的代码组织和设计能够提高代码的可重用性,减少重复工作。 ##### 4.1 模块化设计 - **模块划分**:根据功能将程序划分为不同的模块,每个模块完成一项具体任务。 ##### 4.2 错误处理机制 - **异常处理**:...
"新手C语言的常见错误(仅供菜鸟成长参考)"这个资源集合了众多前辈的经验教训,旨在帮助初入编程领域的菜鸟们避免或快速解决在学习C语言过程中遇到的问题。以下将详细解析这个资源可能包含的一些关键知识点: 1. *...
描述中提到"练手的程序,仅供参考",暗示这可能是一个学习或实践项目,开发者通过这个工具来锻炼自己的编程技能。尽管它可能不是一款成熟的产品,但依然能为其他学习者提供参考和借鉴,帮助他们理解如何实现源代码...
- 开发文档需包含详细设计说明书,尤其是新增功能的描述,以供后续维护参考。 - 软件需具备留痕功能,记录用户操作、系统异常和接口调用日志,这有助于故障排查和审计追踪。 - 《程序维护手册》应详述系统说明、...
该描述强调了尽管提供此类代码供学习和参考,但使用者应确保其行为符合法律和道德规范。这意味着编写或运行此类代码的目的应该是出于教育意义,比如提高个人安全意识或者学习如何防范类似的技术陷阱,而不是用于恶意...
- 编写可复用的组件,如用户控件、自定义类等,减少重复代码。 - 利用继承和多态特性,提高代码的灵活性和可扩展性。 8. **版本控制** - 对源代码进行版本控制,如使用Git,便于团队协作和历史追踪。 - 定期...
- 针对已有项目的持续开发,提供一份详尽的代码规范指南供开发者参考,重点在于强调核心规范而非所有细节。 #### 基础规范建议 ##### CSS 规范 1. **选择器**: - **避免内联样式**:内联样式难以追踪且不利于...
仅供参考,copy冲查重塔峰。 算法设计与分析-4动态规划金罐游戏源代码.cpp (1) 动态规划算法设计思想。 (2) 金罐游戏问题的动态规划解法。 通过本次实验,我尝试了使用蛮力法(简单重复递归)和动态规划解决...
要特性 - 使用最新技术栈,社区资源丰富,基于Java 21(Core Module Support 17-21)、Spring Boot 3.2。 (Support Virtual Threads/fibre...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
在描述中提到,这是一个仅供学习的项目,因此我们将重点放在源码的学习和分析上,而不是项目的实际用途。其中包含的文件"bin_map_tiles.zip"可能是一个关于地图渲染或图块管理的模块,这在地理信息系统(GIS)或者...
<项目介绍> Python网络爬虫与推荐算法的新闻推荐平台 介绍 网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
命名应直观、可拼读,避免使用仅靠大小写区分的相似标识符,避免全局变量和局部变量同名,变量名应使用名词或形容词+名词,函数名则应使用动词或动词+名词(动宾词组)。 在表达式和基本语句方面,复杂的表达式应...
- 加速编译:避免每次编译都重复编译相同的头文件。 - 优化内存占用:减少编译时的内存消耗。 - **使用方式**:通过在源文件中包含预编译头文件(如 #include "stdafx.h")来利用其优势。 #### 六、PDB 文件 - **...