`
hdy007
  • 浏览: 30982 次
最近访客 更多访客>>
文章分类
社区版块
存档分类

代码复用的规则(下)

阅读更多

  消除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章 函数和代码复用.pdf

    ### 第5章 函数和代码复用 #### 知识点概述 本章节主要围绕着函数的概念、定义、使用以及代码复用的方式展开讨论。针对Delphi环境下的Python语言程序设计,深入剖析了如何利用函数实现更高效、灵活的编程实践。 #...

    面向Linux的内核级代码复用攻击检测技术.pdf

    该方法首先基于代码复用攻击的原理和正常程序的控制流构建CFI(Control Flow Integrity)约束规则。控制流完整性是一种用于防止代码被恶意篡改的技术,它确保程序执行按照预期的控制流进行。接着,文章提出了一种...

    qt,c++告警规则 demo仅供参考,代码复用

    qt,c++告警规则 demo仅供参考,代码复用

    代码分析策略规则说明

    自.NET Framework 2.0起,可以使用`System.EventHandler<TEventArgs>`泛型委托,以避免为每个特定事件创建新的委托类型,提高了代码的复用性和灵活性。 5. **CA1004:泛型方法应提供类型参数推理** 泛型方法应该...

    第5周函数和代码复用.docx

    在Python编程中,函数和代码复用是核心概念,它们有助于编写简洁、高效且易于维护的代码。以下是根据提供的文件内容解析出的相关知识点: 1. **递归函数**: - 递归函数是一种在其定义中调用自己的函数。 - **基...

    Yii2扩展开发与代码复用:以资源包为例

    Yii2扩展开发与代码复用是当前流行的PHP开发框架Yii2的一个重要实践领域,特别是在资源包的开发和复用方面,本文将深入探讨如何利用资源包来管理和维护前端资源,以及如何通过扩展的形式实现代码的复用。 在Yii2...

    PHP 实现代码复用的一个方法 traits新特性_.docx

    总之,PHP 的 Traits 特性为开发者提供了一种灵活的代码复用方式,它可以在不引入复杂继承关系的情况下,将功能模块化并组合到不同的类中。这使得代码结构更加清晰,同时也降低了类之间的耦合度,提高了代码的可重用...

    rulz可复用的JUnit规则

    【标题】"rulz可复用的JUnit规则" 是一个专门为Java开发人员设计的测试框架扩展,它提供了丰富的JUnit规则库,使得单元测试更加灵活和可维护。JUnit是Java领域广泛使用的自动化测试框架,而rulz则进一步提升了其功能...

    测验5: 函数和代码复用 (第5周)

    本测验主要围绕函数和代码复用的主题展开,涵盖了一些基本的函数使用规则和递归的概念。 1. **函数的作用**: - **复用代码**:函数的主要优点之一就是可以避免重复代码,提升开发效率。 - **降低编程复杂度**:...

    stm32 GPIO复用表

    在实际应用中,通常通过STM32CubeMX这类工具或直接在代码中设置寄存器来配置这些复用功能,以达到设计要求。正确使用这些高级特性,可以在硬件资源有限的情况下,扩展微控制器的应用范围,提高系统的灵活性和性能。

    精品网不规则焦点图广告代码.rar

    9. **模块化编程**:可能采用了模块化设计,如ES6的import/export,便于代码管理和复用。 10. **错误处理**:适当的错误检测和处理,确保代码的健壮性。 学习并理解这个代码,对于提升前端开发者在动态效果和用户...

    中粮我买网代码规范

    这部分强调代码复用的原则和方法,提高开发效率并减少重复代码。 - **DRY原则**:代码复用应尽量避免重复。 - **SHY原则**:指的是在代码复用中要慎用继承。 - **可变与不可变分离**:分离程序中的可变和不可变部分...

    书写和存储可复用的Fortran90Style代码准则.docx

    ### 书写和存储可复用的Fortran90Style代码准则 #### 1. 引言 本准则旨在为欧洲气象组织提供一个统一的Fortran 90编程框架,以促进不同组织间代码的交流与复用。通过建立一套标准化的文档规范与代码编写准则,不仅...

    轻量,快速,稳定,可编排的组件式规则引擎/流程引擎 拥有全新设计的DSL规则表达式 组件复用,同步/异步编排,动态编排

    总的来说,liteFlow作为一个全面的规则引擎和流程引擎,集成了众多高级特性,如DSL规则表达式、组件复用、同步/异步编排、动态编排等,旨在帮助开发者构建灵活、高效且易于维护的业务流程。在程序开发领域,尤其是...

    中国电信面向5G前传的无源彩光粗波分复用设备技术要求.pdf

    在缩略语和术语方面,标准中详细界定了面向5G前传的无源彩光粗波分复用设备的组成部分和光模块的应用代码,包括网络位置、设备管理、光模块分类以及应用代码的详细描述。 技术要求部分,包括了极限要求、推荐工作...

    基于构件的软件复用技术研究与应用实践实用文档doc.doc

    代码复用是最基础的层次,通过直接使用或修改已有的源代码或目标代码。设计复用涉及复用设计模式和模板,减少了对实现环境的依赖。分析复用则更进一步,复用的是对问题域的理解和解决方案,抽象程度更高。 复用技术...

    计算机源代码编写规范(VB编码规范).rar

    以上只是VB编码规范的一部分要点,实践中还会涉及更多细节,如代码复用、异常处理策略、代码审查等。遵循这些规范,可以使VB代码更易于理解,更健壮,同时也为团队合作提供了统一的标准。通过不断学习和实践,开发者...

Global site tag (gtag.js) - Google Analytics