返回顶部
首页 > 资讯 > 精选 >提高Java代码可重用性的三个措施(转)
  • 525
分享到

提高Java代码可重用性的三个措施(转)

2023-06-03 05:06:38 525人浏览 八月长安
摘要

提高Java代码可重用性的三个措施(转)[@more@]本文介绍了三种修改现有代码提高其可重用性的方法,它们分别是:改写类的实例方法,把参数类型改成接口,选择最简单的参数接口类型。措施一:改写类的实例方法通过类继承实现代码重用不是精确的代码

提高Java代码可重用性的三个措施(转)[@more@]本文介绍了三种修改现有代码提高其可重用性的方法,它们分别是:改写类的实例方法,把参数类型改成接口,选择最简单的参数接口类型。

措施一:改写类的实例方法

通过类继承实现代码重用不是精确的代码重用技术,因此它并不是最理想的代码重用机制。换句话说,如果不继承整个类的所有方法和数据成员,我们无法重用该类里面的单个方法。继承总是带来一些多余的方法和数据成员,它们总是使得重用类里面某个方法的代码复杂化。另外,派生类对父类的依赖关系也使得代码进一步复杂化:对父类的改动可能影响子类;修改父类或者子类中的任意一个类时,我们很难记得哪一个方法被子类覆盖、哪一个方法没有被子类覆盖;最后,子类中的覆盖方法是否要调用父类中的对应方法有时并不显而易见。

任何方法,只要它执行的是某个单一概念的任务,就其本身而言,它就应该是首选的可重用代码。为了重用这种代码,我们必须回归到面向过程的编程模式,把类的实例方法移出成为全局性的过程。为了提高这种过程的可重用性,过程代码应该象静态工具方法一样编写:它只能使用自己的输入参数,只能调用其他全局性的过程,不能使用任何非局部的变量。这种对外部依赖关系的限制简化了过程的应用,使得过程能够方便地用于任何地方。当然,由于这种组织方式总是使得代码具有更清晰的结构,即使是不考虑重用性的代码也同样能够从中获益。

在Java中,方法不能脱离类而单独存在。为此,我们可以把相关的过程组织成为独立的类,并把这些过程定义为公用静态方法。

例如,对于下面这个类:
class PolyGon {
.
.
public int getPerimeter() {...}
public boolean isConvex() {...}
public boolean containsPoint(Point p) {...}
.
.
}

我们可以把它改写成:
class Polygon {
.
.
public int getPerimeter() {return pPolygon.computePerimeter(this);}
public boolean isConvex() {return pPolygon.isConvex(this);}
public boolean containsPoint(Point p) {return pPolygon.containsPoint(this,
p
);}
.

}

其中,pPolygon是:
class pPolygon {
static public int computePerimeter(Polygon polygon) {...}
static public boolean isConvex(Polygon polygon) {...}
static public boolean
containsPoint(Polygon polygon, Point p) {...}
}

从类的名字pPolygon可以看出,该类所封装的过程主要与Polygon类型的对象有关。名字前面的p表示该类的唯一目的是组织公用静态过程。在Java中,类的名字以小写字母开头是一种非标准的做法,但象pPloygon这样的类事实上并不提供普通Java类的功能。也就是说,它并不代表着一类对象,它只是Java语言组织代码的一种机制。

在上面这个例子中,改动代码的最终效果是使得应用Polygon功能的客户代码不必再从Polygon继承。Polygon类的功能现在已经由pPolygon类以过程为单位提供。客户代码只使用自己需要的代码,无需关心Polygon类中自己不需要的功能。但它并不意味着在这种新式过程化编程中类的作用有所削弱。恰恰相反,在组织和封装对象数据成员的过程中,类起到了不可或缺的作用,而且正如本文接下来所介绍的,类通过多重接口实现多态性的能力本身也带来了卓越的代码重用支持。然而,由于用实例方法封装代码功能并不是首选的代码重用手段,所以通过类继承达到代码重用和多态性支持也不是最理想的。

措施二:把参数类型改成接口

正如Allen Holub在《Build User Interfaces for Object-Oriented Systems》中所指出的,在面向对象编程中,代码重用真正的要点在于通过接口参数类型利用多态性,而不是通过类继承:

“……我们通过对接口而不是对类编程达到代码重用的目的。如果某个方法的所有参数都是对一些已知接口的引用,那么这个方法就能够操作这样一些对象:当我们编写方法的代码时,这些对象的类甚至还不存在。从技术上说,可重用的是方法,而不是传递给方法的对象。”

在“措施一”得到的结果上应用Holub的看法,当某块代码能够编写为独立的全局过程时,只要把它所有类形式的参数改为接口形式,我们就可以进一步提高它的可重用能力。经过这个改动之后,过程的参数可以是实现了该接口的所有类的对象,而不仅仅是原来的类所创建的对象。由此,过程将能够对可能存在的大量的对象类型进行操作。

例如,假设有这样一个全局静态方法:
static public boolean contains(Rectangle rect, int x, int y) {...}

这个方法用于检查指定的点是否包含在矩形里面。在这个例子中,rect参数的类型可以从Rectangle类改变为接口类型,如下所示:

static public boolean contains(Rectangular rect, int x, int y) {...}

而Rectangular接口的定义是:

public interface Rectangular {Rectangle getBounds();}

现在,所有可以描述为矩形的类(即,实现了Rectangular接口的类)所创建的对象都可以作为提供给pRectangular.contains()的rect参数。通过放宽参数类型的限制,我们使方法具有更好的可重用性。

不过,对于上面这个例子,Rectangular接口的getBounds方法返回Rectangle,你可能会怀疑这么做是否真正值得。换言之,如果我们知道传入过程的对象会在被调用时返回一个Rectangle,为什么不直接传入Rectangle取代接口类型呢?之所以不这么做,最重要的原因与集合有关。让我们假设有这样一个方法:

static public boolean areAnyOverlapping(Collection rects) {...}

该方法用于检查给定集合中的任意矩形对象是否重叠。在这个方法的内部,当我们用循环依次访问集合中的各个对象时,如果我们不能把对象cast成为Rectangular之类的接口类型,又如何能够访问对象的矩形区域呢?唯一的选择是把对象cast成为它特有的类形式(我们知道它有一个方法可以返回矩形),它意味着方法必须事先知道它所操作的对象类型,从而使得方法的重用只限于那几种对象类型。而这正是前面这个措施力图先行避免的问题!

措施三:选择最简单的参数接口类型

在实施第二个措施时,应该选用哪一种接口类型来取代给定的类形式?答案是哪一个接口完全满足过程对参数的需求,同时又具有最少的多余代码和数据。描述参数对象要求的接口越简单,其他类实现该接口的机会就越大——由此,其对象能够作为参数使用的类也越多。从下面这个例子可以很容易地看出这一点:

static public boolean areOverlapping(Window window1, Window window2) {...}

这个方法用于检查两个窗口(假定是矩形窗口)是否重叠。如果这个方法只要求从参数获得两个窗口的矩形坐标,此时相应地简化这两个参数是一种更好的选择:

static public boolean areOverlapping(Rectangular rect1, Rectangular rect2)
{
...}

上面的代码假定Window类型实现了Rectangular接口。经过改动之后,对于任何矩形对象我们都可以重用该方法的功能。

有些时候可能会出现描述参数需求的接口拥有太多方法的情况。此时,我们应该在全局名称空间中定义一个新的公共接口供其他面临同一问题的代码重用。

当我们需要象使用C语言中的函数指针一样使用参数时,创建唯一的接口描述参数需求是最好的选择。例如,假设有下面这个过程:
static public void sort(List list, SortComparison comp) {...}

该方法运用参数中提供的比较对象comp,通过比较给定列表list中的对象排序list列表。sort对comp对象的唯一要求是要调用一个方法进行比较。因此,SortComparison应该是只带有一个方法的接口:
public interface SortComparison {
boolean comesBefore(Object a, Object b);
}

SortComparison接口的唯一目的在于为sort提供一个它所需功能的钩子,因此SortComparison接口不能在其他地方重用。

总而言之,本文三个措施适合于改造现有的、按照面向对象惯例编写的代码。这三个措施与面向对象编程技术结合就得到了一种可在以后编写代码时使用的新式代码编写技术,它能够简化方法的复杂性和依赖关系,同时提高方法的可重用能力和内部凝聚力。

当然,这里的三个措施不能用于那些天生就不适合重用的代码。不适合重用的代码通常出现在应用的表现层。例如,创建程序用户界面的代码,以及联结到输入事件的控制代码,都属于那种在程序和程序之间千差万别的代码,这种代码几乎不可能重用

--结束END--

本文标题: 提高Java代码可重用性的三个措施(转)

本文链接: https://lsjlt.com/news/232825.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 提高Java代码可重用性的三个措施(转)
    提高Java代码可重用性的三个措施(转)[@more@]本文介绍了三种修改现有代码提高其可重用性的方法,它们分别是:改写类的实例方法,把参数类型改成接口,选择最简单的参数接口类型。措施一:改写类的实例方法通过类继承实现代码重用不是精确的代码...
    99+
    2023-06-03
  • 提高Java代码可重用性的措施有哪些
    这篇文章主要介绍了提高Java代码可重用性的措施有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇提高Java代码可重用性的措施有哪些文章都会有所收获,下面我们一起来看看吧。措施一:改写类的实例方法 通过类继...
    99+
    2023-06-03
  • 如何提高Java代码可重用性
    这篇文章主要介绍了如何提高Java代码可重用性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  措施一:改写类的实例方法   通过类继承实现代码重用不是精确的代码重用技术,因...
    99+
    2023-06-03
  • 提高java代码的重用性
    提高java代码可重用性有哪些方法措施,以下就讲解了三种关于提高java代码可重用性的措施,一起来了解一下吧~一、改写类的实例方法通过类继承实现代码重用不是精确的代码重用技术,因此它并不是最理想的代码重用机制。继承总是带来一些多余的方法和数...
    99+
    2019-01-12
    java教程 java 优化
  • PHP 代码重构:提高代码质量和可维护性
    PHP 代码重构:提升代码质量和可维护性 引言 随着时间的推移,PHP 代码库会变得臃肿、难以维护和理解。代码重构是一个系统化过程,可以改善代码的结构、清晰度和可维护性,从而避免这些问...
    99+
    2024-05-12
    php 代码重构
  • Java使用connectTo方法提高代码可续性详解
    目录关于可读性的一些想法整理connectTo方法源代码有两种不同的用户:程序员和计算机。一方面,计算机既能处理干净、结构良好的代码,也能处理混乱的代码。另一方面,程序员对代码的可读...
    99+
    2024-04-02
  • 提高Python代码可读性的5个技巧分享
    目录1. Comments2. Explicit Typing3. Docstrings (Documentation Strings)4. Readable Variable Na...
    99+
    2024-04-02
  • 提高Python代码可读性的五个基本技巧
    译者 | 赵青窕审校 | 孙淑娟你是否经常回头看看6个月前写的代码,想知道这段代码底是怎么回事或者从别人手上接手项目,并且不知道从哪里开始这样的情况对开发者来说是比较常见的。Python中有许多方法可以帮助我们理解代码的内部工作方式,因此当...
    99+
    2023-05-14
    代码 Python 技巧
  • 提高 Python 代码可读性的五个基本技巧
    Python 中有许多方法可以帮助我们理解代码的内部工作原理,良好的编程习惯,可以使我们的工作事半功倍!例如,我们最终可能会得到看起来很像下图中的代码。虽然不是最糟糕的,但是,我们需要扩展一些事情,例如:load_las_file 函数中的...
    99+
    2023-05-14
    Python 函数 技巧
  • 利用Golang Facade提高代码重用性的方法
    使用Golang的Facade模式可以提高代码的重用性。Facade模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统...
    99+
    2023-10-20
    Golang
  • PHP、JavaScript 和 Apache:如何使用对象来提高代码的可重用性?
    在 Web 开发中,我们经常需要编写可重用的代码。这可以避免重复编写相同的代码,同时也可以提高代码的可读性和可维护性。在本文中,我们将介绍如何使用对象来提高代码的可重用性,并且将使用 PHP、JavaScript 和 Apache 作为演...
    99+
    2023-08-19
    javascript 对象 apache
  • HTML框架与代码可重用性:提高开发效率和维护性
    HTML 框架通过提供可重用的代码模块,极大地提高了代码可重用性。这使得开发人员能够将精力集中在特定应用程序的业务逻辑和用户界面上,而不是重复编写常见的 HTML 代码。 提高开发效率 模块化代码:框架将代码组织成可重用的模块,例如导航...
    99+
    2024-04-02
  • 使用PHP trait DTO提高代码可读性与可维护性
    在开发过程中,我们经常会遇到需要处理数据传输对象(DTO)的情况。DTO是一个用于封装数据的简单类,通常用于在不同的层之间传递数据。传统上,开发人员会在每个DTO类中重复编写setter和getter方法以及其他常用方法。这样做不仅增加了代...
    99+
    2023-10-21
    PHP dto trait 可维护性 可读性
  • PHP对象响应编程算法:如何提高代码的可扩展性和可重用性?
    在软件开发中,可扩展性和可重用性是非常重要的。当代码需要进行修改或添加新功能时,我们希望这些变化能够尽可能地少影响到其他部分的代码。同时,我们也希望尽可能地利用已有的代码来减少重复的工作。 在PHP中,对象响应编程(Object-Resp...
    99+
    2023-07-20
    对象 响应 编程算法
  • 如何使用 Python 容器提高代码的可读性?
    Python 是一种优秀的编程语言,它拥有丰富的数据类型和容器类型,例如列表、字典、元组和集合等。使用这些容器类型可以大大提高代码的可读性和可维护性,使得代码更易于理解和修改。本文将介绍如何使用 Python 容器提高代码的可读性,并且通过...
    99+
    2023-07-02
    容器 http shell
  • Java中的数组容器:如何提高代码的可扩展性和可维护性?
    在Java编程中,数组是最常用的数据结构之一,它能够存储一组相同类型的数据,并提供了方便的访问和操作方法。然而,在实际开发中,使用数组时可能会遇到一些问题,如数组长度不可变、数组元素类型不可变、数组无法动态增加或删除元素等等。这些限制可能...
    99+
    2023-09-19
    并发 数组 容器
  • 如何利用PHP7的Type Hinting特性提高代码的可靠性?
    如何利用PHP7的Type Hinting特性提高代码的可靠性?导语:PHP7引入了Type Hinting(类型提示)特性,允许开发者在函数和方法的参数、返回值上指定具体的数据类型。这个特性不仅提供了更好的代码可读性,还大大提高了代码的可...
    99+
    2023-10-22
    PHP 可靠性 Type Hinting
  • 揭开 JavaScript 代理模式的迷雾,提升代码可重用性
    ...
    99+
    2024-04-02
  • Java 接口和数组响应:如何提高代码的可读性?
    Java 作为一种广泛应用的编程语言,其面向对象的特性使得其拥有着强大的可扩展性和可维护性。在 Java 中,接口和数组响应是两个非常重要的概念,它们可以帮助我们提高代码的可读性。本文将介绍接口和数组响应的概念以及如何在 Java 中应用...
    99+
    2023-06-14
    接口 数组 响应
  • PHP 函数对提高代码可读性和可维护性的影响
    使用 php 函数可以提升代码可读性和可维护性。函数优势包括:可重用性:避免重复代码。模块化:将代码细分为易于管理的块。可维护性:轻松修改特定功能。代码可读性:命名函数块,提高代码描述性...
    99+
    2024-04-13
    php 代码可读性
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作