`
IT-future
  • 浏览: 29815 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

代码复用的规则(下)

阅读更多

  消除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);
 



分享到:
评论

相关推荐

    SOC平台 verilog 代码风格规范V0.4.doc

    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 代码文件模块名及端口信号...

    毕业设计:ASP校友录设计(源代码)

    本设计中使用代码复用机制,即在开发中尽量使用本系统中已经使用过的代码,以及使用以前项目积累的代码,如分页功能、检查E-mail的函数。 3 使用数据库连接池和其他优化手段 连接数据库采用ODBC方式,并且在每页...

    dotnetcoding ORM 代码生成器

    系统也比较充分的考虑了变更与维护的需要,在数据库设计发生变化的情况下,只要在已有工程的基础上重新生成一遍,系统就会自动合并最终开发编写的代码到生成的代码中,使系统的变更变的很容易. UI界面层按到组件原则来...

    编写高质量代码-Web前端开发修炼之道.azw3

    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 团队合作——如何...

    liteFlow规则引擎框架.rar

    代码的抽象,复用率也越来越低,各个模块之间的耦合度很高。一小段逻辑的变动,会影响到其他模块,需要进行完整回归测试来验证。如要灵活改变业务流程的顺序,则要进行代码大改动进行抽象,重新写方法。实时热变更...

    STL学习过程中的代码笔记

    通过使用模板,可以将代码的通用部分抽象出来,提高代码的复用性和可维护性。同时,STL中的各种容器和算法也都是通过模板实现的,这使得STL在处理不同类型的数据时表现出色。总的来说,学习STL是我编程之路中的一次...

    可复用构件的框架表示与检索* (2008年)

    提出了基于人工智能框架知识表示的构件描述方法,以解决构件描述、分类、检索等构件复用关键性问题;并利用框架表示的推理特性,建立了基于规则推理和功能粒度的构件搜索匹配算法,提高构件搜索效率和准确性。

    COM技术内幕——微软组件对象模型--随书源代码

    以代码形式给出的大量实例。  《COM技术内幕》适合于中、高级C++程序员;COM、ActiveX和OLE程序员;对组件设计感兴趣的研究人员;以及那些当COM移植到UNIX、MVS和其他环境时想要使用到COM的程序员。 编辑推荐  ...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    Android代码-Android平台中对页面、原生路由功能的中间件.

    请求对象池复用; 代码简洁优美; Demo展示 Demo apk下载、Demo Gif 一、功能介绍 模块间调用 网页和原生之间调用 实现模块间入参和结果的调用 实现模块方法的调用 支持获取Fragment 代码简洁健壮易扩展 支持权限...

    TvHorizontalFlowLayout:电视launcher的不规则布局会更新变动,不想在xml中写死,试试代码构建吧,只需几行代码,配置大小与方位

    1、每个page页的布局是不规则的且都不一样,导致无法复用。 2、有线上更新布局的需求或下拉加载(通过接口拿到图片,并且图片的大小可能会变动) 导致page的布局不能在xml中写死,但是通过代码一个个addView又很麻烦。...

    vue-multiple-tabs:vue-cli3 动态路由, 复用路由, 自动注入路由, 增删路由, 实战多tab页

    代码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引擎、工作流引擎、报表...

    Python编程规范要求

    6. 模块和包的组织:将相关的功能封装在模块和包中,使代码结构清晰,并且可以方便地复用。 7. 代码风格:遵循PEP 8规范,包括使用空格而不是制表符进行缩进、每行代码不超过79个字符等。 遵循Python编程规范可以使...

    重构到设计模式的经典案例,超完美详细(java源码)

    * 这段代码根本不可能在输出xml的代码中复用report()的任何行为,唯一 * 可以做的就是重写一个xmlReport(),大量重复report()中的行为,当然, * 现在这个修改还不费劲,拷贝一份report()直接修改就是了。 * ...

    vue框架介绍的一些简介

    组件化:Vue.js通过组件化的方式,将实现页面某一部分功能的结构、样式和逻辑封装成为一个整体,使其高内聚、低耦合,从而提高代码复用率,并使代码更易于维护。 声明式编码:Vue.js采用声明式编码,让编码人员无需...

    精通MFC (光盘) 源代码

    15.1.5 COMK 的功能复用 15.2 IUnknown接口在MFC中的实现 15.2.1 内部类 15.2.2 接口映射类 15.2.3 聚合的实现 15.3 类厂及其MFC实现 15.3.1 ColeObjectFactory类 15.3.2 全局类厂链 15.3.3 类厂的注册/反...

    毕业设计-ssm构建彩虹猫购物商城.zip

    毕业设计-项目完整代码+sql. 简介地址:https://mp.csdn.net/postedit/102697257 购物商城 主要模块(前后端): 用户模块:横向越权、纵向越权、MD5明文加密、guava缓存高复用服务响应对象的设计思想和封装  ...

    吕鑫:最博大精深的C语言视频教程 第23天 【第3堂课】函数指针与回调函数的应用

    1、演示按照多种规则进行排序的代码优化,提高代码复用性的方法; 2、讲解函数指针的概念与使用方法; 3、演示回调函数在项目开发中的应用;

Global site tag (gtag.js) - Google Analytics