消除case / if语句
要尽量避免在代码中出现判断语句,来测试一个对象是否某个特定类的实例。通常,如果你需要这么做,那么,重新设计可能会有所帮助。我在工作中遇到这样的一个问题:我们在使用JAVA做XML解析时,对每个标签映射了一个JAVA类,采用SAX(简单的XML接口API:Simple API for XML)模型。结果,代码中反复出现了大量的判断语句,来测试当前的标签类型。为此,我们重新设计了DTD(文档类型定义:Document Type Definition),为每个标签增加了一个固定的属性:classname,而且重新设计了每个标签映射的JAVA类的接口,统一了每个对象的操作:
addElement(Element aElement); //增加子元素
addAttribute(String attName, String attValue); //增加属性;
则彻底消除了所有的测试当前的标签类型的判断语句。每个对象通过 Class.forName(aElement.attributes.getAttribute("classname")).newInstence(); 动态创建,
减少参数个数
有大量参数需要传递的方法,通常很难阅读。我们可以将所有参数封装到一个对象中来完成对象的传递,这也有利于错误跟踪。
许多程序员因为,太多层的对象包装对系统效率有影响。是的,但是,和它带来的好处相比,我们宁愿做包装。毕竟,"封装"也是OO的基本特性之一,而且,"每个对象完成尽量少(而且简单)的功能",也是OO的一个基本原则。
类层次的最高层应该是抽象类
在许多情况下,提供一个抽象基类有利做特性化扩展。由于在抽象基类中,大部分的功能和行为已经定义好,使我们更容易理解接口设计者的意图是什么。
由于JAVA不允许"多继承",从一个抽象基类继承,就无法再从其它基类继承了。所以,提供一个抽象接口(interface)是个好主意,一个类可以实现多个接口,从而模拟实现了"多继承",为类的设计提供了更大的灵活性。
尽量减少对变量的直接访问
对数据的封装原则应该规范化,不要把一个类的属性暴露给其它类,而是应该通过访问方法去保护他们,这有利于避免产生波纹效应。如果某个属性的名字改变,你只需要修改它的访问方法,而不是修改所有相关的代码。
子类应该特性化,完成特殊功能
如果一个子类只是使一个组件变成组件管理器,而不是实现接口功能,或者,重载某个功能,那么,就应该使用一个外部的容器类,而不是创建一个子类。
建议:类层次结构图,不要太深;
例如:下面的接口定义了组件的功能:发送消息;类Transceiver实现了该接口;而其子类Pool只是管理多个Transceiver对象,而没有提供自己的接口实现。建议使用组合方式,而不是继承!
public interface ITransceiver{
public abstract send(String msg);
}
public class Transceiver implements ITransceiver {
public send(String msg){
System.out.println(msg);
}
}
//使用继承方式的实现
public class Pool extends Transceiver{
private List pool = new Vector();
public void add(Transceiver aTransceiver){
pool.add(aTransceiver);
}
public Transceiver get(int index){
pool.get(index);
}
}
//使用组合方式的实现
public class Pool {
private List pool = new Vector();
public void add(Transceiver aTransceiver){
pool.add(aTransceiver);
}
public Transceiver get(int index){
pool.get(index);
}
}
拆分过大的类
如果一个类有太多的方法(超过50个),那么它可能要做的工作太多,我们应该试着将它的功能拆分到不同的类中,类似于规则四。
作用截然不同的对象应该拆分
在构建的过程中,你有时会遇到这样的问题:对同样的数据,有不同的视图。某些属性描述的是数据结构怎样生成,而某些属性描述的是数据结构本身。最好将这两个视图拆分到不同的类中,从类名上就可以区分出不同视图的作用。
类的域、方法也应该有同样的考虑!
尽量减少对参数的隐含传递
两个方法处理类内部同一个数据(域),并不意味着它们就是对该数据(域)做处理。许多时候,该数据(域)应该作为方法的参输入数,而不是直接存取,在工具类的设计中尤其应该注意。例如:
public class Test{
private List pool = new Vector();
public void testAdd(String str){
pool.add(str);
}
public Object testGet(int index){
pool.get(index);
}
}
两个方法都对List对象pool做了操作,但是,实际上,我们可能只是想对List接口的不同实现Vector、ArrayList等做存取测试。所以,代码应该这样写:
public class Test{
private List pool = new Vector();
public void testAdd(List pool, String str){
pool.add(str);
}
public Object testGet(List pool, int index){
pool.get(index);
分享到:
相关推荐
4.2 命名规则 5 4.2.1 基本命名标准 5 4.2.2 命名准则 6 4.3 VERILOG HDL源代码文件结构 10 4.3.1 VERILOG HDL 代码文件文件头 10 4.3.2 VERILOG HDL 代码文件宏定义 13 4.3.3 VERILOG HDL 代码文件模块名及端口信号...
本设计中使用代码复用机制,即在开发中尽量使用本系统中已经使用过的代码,以及使用以前项目积累的代码,如分页功能、检查E-mail的函数。 3 使用数据库连接池和其他优化手段 连接数据库采用ODBC方式,并且在每页...
系统也比较充分的考虑了变更与维护的需要,在数据库设计发生变化的情况下,只要在已有工程的基础上重新生成一遍,系统就会自动合并最终开发编写的代码到生成的代码中,使系统的变更变的很容易. UI界面层按到组件原则来...
4.7.11 z-index的相关问题以及Flash和IE 6下的select元素 4.7.12 插入png图片 4.7.13 多版本IE并存方案——CSS的调试利器IETester 第5章 高质量的JavaScript 5.1 养成良好的编程习惯 5.1.1 团队合作——如何...
代码的抽象,复用率也越来越低,各个模块之间的耦合度很高。一小段逻辑的变动,会影响到其他模块,需要进行完整回归测试来验证。如要灵活改变业务流程的顺序,则要进行代码大改动进行抽象,重新写方法。实时热变更...
通过使用模板,可以将代码的通用部分抽象出来,提高代码的复用性和可维护性。同时,STL中的各种容器和算法也都是通过模板实现的,这使得STL在处理不同类型的数据时表现出色。总的来说,学习STL是我编程之路中的一次...
提出了基于人工智能框架知识表示的构件描述方法,以解决构件描述、分类、检索等构件复用关键性问题;并利用框架表示的推理特性,建立了基于规则推理和功能粒度的构件搜索匹配算法,提高构件搜索效率和准确性。
以代码形式给出的大量实例。 《COM技术内幕》适合于中、高级C++程序员;COM、ActiveX和OLE程序员;对组件设计感兴趣的研究人员;以及那些当COM移植到UNIX、MVS和其他环境时想要使用到COM的程序员。 编辑推荐 ...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
请求对象池复用; 代码简洁优美; Demo展示 Demo apk下载、Demo Gif 一、功能介绍 模块间调用 网页和原生之间调用 实现模块间入参和结果的调用 实现模块方法的调用 支持获取Fragment 代码简洁健壮易扩展 支持权限...
1、每个page页的布局是不规则的且都不一样,导致无法复用。 2、有线上更新布局的需求或下拉加载(通过接口拿到图片,并且图片的大小可能会变动) 导致page的布局不能在xml中写死,但是通过代码一个个addView又很麻烦。...
代码Eslint 规则修改,消除warning 使用 Placeholder... 预览 本地使用 # download git clone https://github.com/BiYuqi/vue-multiple-tabs-use-one-component.git # install dependencies npm install # serve ...
Nop Platform 2.0是基于可逆计算理论实现的低代码开发平台,它致力于克服低代码平台无法摆脱穷举法的困境,从理论层面超越组件技术,有效的解决粗粒度软件复用的问题;包含GraphQL引擎、ORM引擎、工作流引擎、报表...
6. 模块和包的组织:将相关的功能封装在模块和包中,使代码结构清晰,并且可以方便地复用。 7. 代码风格:遵循PEP 8规范,包括使用空格而不是制表符进行缩进、每行代码不超过79个字符等。 遵循Python编程规范可以使...
* 这段代码根本不可能在输出xml的代码中复用report()的任何行为,唯一 * 可以做的就是重写一个xmlReport(),大量重复report()中的行为,当然, * 现在这个修改还不费劲,拷贝一份report()直接修改就是了。 * ...
组件化:Vue.js通过组件化的方式,将实现页面某一部分功能的结构、样式和逻辑封装成为一个整体,使其高内聚、低耦合,从而提高代码复用率,并使代码更易于维护。 声明式编码:Vue.js采用声明式编码,让编码人员无需...
毕业设计-项目完整代码+sql. 简介地址:https://mp.csdn.net/postedit/102697257 购物商城 主要模块(前后端): 用户模块:横向越权、纵向越权、MD5明文加密、guava缓存高复用服务响应对象的设计思想和封装 ...
1、演示按照多种规则进行排序的代码优化,提高代码复用性的方法; 2、讲解函数指针的概念与使用方法; 3、演示回调函数在项目开发中的应用;
1、运用了swing组件、递归算法、java语言 2、自做扫雷小游戏,代码简单,代码复用性低理解起来就简单,希望给大家做一个参考。 3、本人对扫雷规则不太熟悉,实现的功能是自己所认为的扫雷规则,如有错误,很是抱歉。