消除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);
分享到:
相关推荐
### 第5章 函数和代码复用 #### 知识点概述 本章节主要围绕着函数的概念、定义、使用以及代码复用的方式展开讨论。针对Delphi环境下的Python语言程序设计,深入剖析了如何利用函数实现更高效、灵活的编程实践。 #...
该方法首先基于代码复用攻击的原理和正常程序的控制流构建CFI(Control Flow Integrity)约束规则。控制流完整性是一种用于防止代码被恶意篡改的技术,它确保程序执行按照预期的控制流进行。接着,文章提出了一种...
qt,c++告警规则 demo仅供参考,代码复用
自.NET Framework 2.0起,可以使用`System.EventHandler<TEventArgs>`泛型委托,以避免为每个特定事件创建新的委托类型,提高了代码的复用性和灵活性。 5. **CA1004:泛型方法应提供类型参数推理** 泛型方法应该...
在Python编程中,函数和代码复用是核心概念,它们有助于编写简洁、高效且易于维护的代码。以下是根据提供的文件内容解析出的相关知识点: 1. **递归函数**: - 递归函数是一种在其定义中调用自己的函数。 - **基...
Yii2扩展开发与代码复用是当前流行的PHP开发框架Yii2的一个重要实践领域,特别是在资源包的开发和复用方面,本文将深入探讨如何利用资源包来管理和维护前端资源,以及如何通过扩展的形式实现代码的复用。 在Yii2...
总之,PHP 的 Traits 特性为开发者提供了一种灵活的代码复用方式,它可以在不引入复杂继承关系的情况下,将功能模块化并组合到不同的类中。这使得代码结构更加清晰,同时也降低了类之间的耦合度,提高了代码的可重用...
【标题】"rulz可复用的JUnit规则" 是一个专门为Java开发人员设计的测试框架扩展,它提供了丰富的JUnit规则库,使得单元测试更加灵活和可维护。JUnit是Java领域广泛使用的自动化测试框架,而rulz则进一步提升了其功能...
本测验主要围绕函数和代码复用的主题展开,涵盖了一些基本的函数使用规则和递归的概念。 1. **函数的作用**: - **复用代码**:函数的主要优点之一就是可以避免重复代码,提升开发效率。 - **降低编程复杂度**:...
在实际应用中,通常通过STM32CubeMX这类工具或直接在代码中设置寄存器来配置这些复用功能,以达到设计要求。正确使用这些高级特性,可以在硬件资源有限的情况下,扩展微控制器的应用范围,提高系统的灵活性和性能。
9. **模块化编程**:可能采用了模块化设计,如ES6的import/export,便于代码管理和复用。 10. **错误处理**:适当的错误检测和处理,确保代码的健壮性。 学习并理解这个代码,对于提升前端开发者在动态效果和用户...
比如,高内聚、低耦合的模块化设计可能使代码行数增加,但能提高代码的可维护性和复用性。 3. 不同编程语言的编码风格和语法规则会影响代码行数。例如,Python的简洁语法可能导致其代码行数相对较少,而同样功能的...
这部分强调代码复用的原则和方法,提高开发效率并减少重复代码。 - **DRY原则**:代码复用应尽量避免重复。 - **SHY原则**:指的是在代码复用中要慎用继承。 - **可变与不可变分离**:分离程序中的可变和不可变部分...
### 书写和存储可复用的Fortran90Style代码准则 #### 1. 引言 本准则旨在为欧洲气象组织提供一个统一的Fortran 90编程框架,以促进不同组织间代码的交流与复用。通过建立一套标准化的文档规范与代码编写准则,不仅...
总的来说,liteFlow作为一个全面的规则引擎和流程引擎,集成了众多高级特性,如DSL规则表达式、组件复用、同步/异步编排、动态编排等,旨在帮助开发者构建灵活、高效且易于维护的业务流程。在程序开发领域,尤其是...
在缩略语和术语方面,标准中详细界定了面向5G前传的无源彩光粗波分复用设备的组成部分和光模块的应用代码,包括网络位置、设备管理、光模块分类以及应用代码的详细描述。 技术要求部分,包括了极限要求、推荐工作...
代码复用是最基础的层次,通过直接使用或修改已有的源代码或目标代码。设计复用涉及复用设计模式和模板,减少了对实现环境的依赖。分析复用则更进一步,复用的是对问题域的理解和解决方案,抽象程度更高。 复用技术...
以上只是VB编码规范的一部分要点,实践中还会涉及更多细节,如代码复用、异常处理策略、代码审查等。遵循这些规范,可以使VB代码更易于理解,更健壮,同时也为团队合作提供了统一的标准。通过不断学习和实践,开发者...