网站首页 > 技术文章 正文
一个好的程序员一定是用最少的代码实现最多的功能,代码复用是程序员所追求和期望的,这也是Java语言所提倡的;根据以往开发经验整理了一些能够提高代码复用性方法和规则,与大家分享学习。
网络配图
1、面向接口编程:
"面向接口编程"是面向对象设计的第一个基本原则;它的含义是:使用接口和同类型的组件通讯,即,对于所有完成相同功能的组件,应该抽象出一个接口,它们都实现该接口;具体到JAVA中,可以是接口(interface),或者是抽象类(abstract class),所有完成相同功能的组件都实现该接口,或者从该抽象类继承。我们的客户代码只应该和该接口通讯,这样,当我们需要用其它组件完成任务时,只需要替换该接口的实现,而我们代码的其它部分不需要改变!当现有的组件不能满足要求时,我们可以创建新的组件,实现该接口或者直接对现有的组件进行扩展,由子类去完成扩展的功能。
2、对象组合优先考虑,少用类继承:
"优先使用对象组合,而不是类继承"是面向对象设计的第二个原则,这并不是说继承不重要,而是因为每个学习OOP的人都知道面向对象的基本特性之一就是继承,以至于继承已经被滥用了,而对象组合技术往往被忽视了;继承和组合各有优缺点;类继承是在编译时刻静态定义的,且可直接使用,类继承可以较方便地改变父类的实现。但是类继承也有一些不足之处。首先,因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。
对象组合是通过获得对其他对象的引用而在运行时刻动态定义的;由于组合要求对象具有良好定义的接口,而且,对象只能通过接口访问,所以我们并不破坏封装性;只要类型一致,运行时刻还可以用一个对象来替代另一个对象;更进一步,因为对象的实现是基于接口写的,所以实现上存在较少的依赖关系。
网络配图
优先使用对象组合有助于你保持每个类被封装,并且只集中完成单个任务。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物(这正是滥用继承的后果);另一方面,基于对象组合的设计会有更多的对象(但只有较少的类),且系统的行为将依赖于对象间的关系而不是被定义在某个类中。
3、规范代码书写:
(1)、将可变的部分和不可变的部分分离
"将可变的部分和不可变的部分分离"是面向对象设计的第三个原则;如果使用继承的复用技术,我们可以在抽象基类中定义好不可变的部分,而由其子类去具体实现可变的部分,不可变的部分不需要重复定义,而且便于维护;如果使用对象组合的复用技术,我们可以定义好不可变的部分,而可变的部分可以由不同的组件实现,根据需要在运行时动态配置;这样我们就有更多的时间关注可变的部分。
(2)、减少方法的长度
一般我们的方法应该只有尽量少的几行,太长的方法会难以理解,而且如果方法太长,则应该重新设计。方法写的标准我们可以总结为以下原则:
☆ 三十秒原则:如果另一个程序员无法在三十秒之内了解你的函数做了什么(What),如何做(How)以及为什么要这样做(Why),那就说明你的代码是难以维护的,必须得到提高;
☆ 一屏原则:如果一个函数的代码长度超过一个屏幕,那么或许这个函数太长了,应该拆分成更小的子函数;
☆ 一行代码尽量简短,并且保证一行代码只做一件事:那种看似技巧性的冗长代码只会增加代码维护的难度。
(3)、少用case / if语句
要尽量避免在代码中出现判断语句;
(4)、减少参数个数
有大量参数需要传递的方法,阅读性很差,我们可以将所有参数封装到一个对象中来完成对象的传递,这也有利于错误跟踪。
网络配图
(5)、类层次的最高层应该是抽象类
通常情况下,提供一个抽象基类有利做特性化扩展;由于在抽象基类中大部分的功能和行为已经定义好,使我们更容易理解接口设计者的意图是什么。
(6)、尽量减少对变量的直接访问
对数据的封装原则应该规范化,不要把一个类的属性暴露给其它类,而是应该通过访问方法去保护他们,这有利于避免产生波纹效应;如果某个属性的名字改变,你只需要修改它的访问方法,而不是修改所有相关的代码。
每一个程序员养成良好的编程习惯,使别人能够读懂你的代码,进而使用代码,这样有助于提高自身编码水平,也可以提高工作效率,可以说利人利已。好了,从今天起规范自己编程!!!
猜你喜欢
- 2024-10-07 让 Java 程序运行更快的 15 个技巧,肯定有你不知道的
- 2024-10-07 900行"又臭又长"的类重构,IDEA用几分钟就搞定
- 2024-10-07 坑!python用空列表作为默认参数,让我怀疑遇到了灵异代码
- 2024-10-07 Java8函数式编程深入浅出(函数式编程和面向对象的区别)
- 2024-10-07 详解synchronized和锁升级,以及偏向锁和轻量级锁的升级
- 2024-10-07 线上一次fullgc搞得鸡飞狗跳后,我总结了这篇文章
- 2024-10-07 接口性能优化技巧,有点硬(接口调优)
- 2024-10-07 聊聊那些奇葩的代码规范 —— 代码放一行
- 2024-10-07 Java进程CPU占用高导致的网页请求超时的故障排查
- 2024-10-07 懵了!面试官问我:String 长度有限制吗?是多少?
- 1514℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 573℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 513℃MySQL service启动脚本浅析(r12笔记第59天)
- 486℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 486℃启用MySQL查询缓存(mysql8.0查询缓存)
- 469℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 449℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 447℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (83)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)