`
zhang_xzhi_xjtu
  • 浏览: 538336 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

实践中的重构31_结果类两种实现的比较

阅读更多
在查询接口结果类设计中,有这么一种思路,即把查询的真实结果和结果码组合起来,形成一个结果类,当调用方使用该接口时,先判断结果是否是成功结果,然后进行相应的处理。
一个示例如下:
/**
 * 列表查询结果。
 * <p>
 * 请在处理成功时[ isSuccess() == true; ]才使用查询结果对象。
 * </p>
 * 
 */
public class QueryListResult {

	private List<Book> resultObject;

	private ResultCode resultCode;

	public QueryListResult() {
	}

	public QueryListResult(ResultCode resultCode) {
		this.resultCode = resultCode;
		this.resultObject = null;
	}

	public QueryListResult(ResultCode resultCode, List<Book> bookList) {
		this.resultCode = resultCode;
		this.resultObject = bookList;
	}

	public boolean isSuccess() {
		return ResultCode.SUCCESS == resultCode;
	}

	public List<Book> getResultObject() {
		return resultObject;
	}

	public void setResultObject(List<Book> bookList) {
		this.resultObject = bookList;
	}

	public ResultCode getResultCode() {
		return resultCode;
	}

	public void setResultCode(ResultCode resultCode) {
		this.resultCode = resultCode;
	}
}

该实现的优点是简单。当需要构建一个失败结果的时候,调用单参数构造方法,当需要构建一个成功结果的时候,调用双参数构造方法。
该实现的缺点如下:
该类没有主动保持自己的不变量,完全依赖调用方对该类不变量的理解。从该类的设计思路,可以很快的推出,该类应该满足以下性质:
任何时刻,该类的结果码不为null。
当结果码为ResultCode.SUCCESS时,该结果为成功结果,调用方可以使用真实的结果对象resultObject。
当结果码不为ResultCode.SUCCESS时,该结果为失败结果,resultCode表明了失败的原因,结果对象resultObject无定义。
默认构造函数导致resultCode为null,单参数构造函数有可能误传null或者成功码,双参数构造函数有可能误传null或者失败码。
总而言之,该对象的不变量的保持,必须依赖调用方的正确使用。
在该类的实际使用中,遵循的标准是失败结果调用单参数构造函数,成功结果调用双参数构造函数,但是由于构造函数和类名同名,该语义没有清晰的表达出来。
因为所有的成功结果都是调用双参数构造函数,因此,在正确使用该类的情况下,传入的resultCode都是ResultCode.SUCCESS,这个实际上是一种重复和冗余的体现。
基于以上的分析,代码重构如下:
/**
 * 列表查询结果。
 * <p>
 * 请在处理成功时[ isSuccess() == true; ]才使用查询结果对象。
 * </p>
 * 
 */
public class QueryListResult {

	private List<Book> resultObject;

	private ResultCode resultCode = ResultCode.UNKNOWN_EXCEPTION;

	public QueryListResult() {
	}

	public static QueryListResult createFailedResult(ResultCode resultCode) {
		QueryListResult failedResult = new QueryListResult();
		if (resultCode != ResultCode.SUCCESS && resultCode != null) {
			failedResult.resultCode = resultCode;
		}
		return failedResult;
	}

	public static QueryListResult createSuccessfulResult(List<Book> bookList) {
		QueryListResult successfulResult = new QueryListResult();
		successfulResult.resultCode = ResultCode.SUCCESS;
		if (bookList == null) {
			successfulResult.resultObject = new ArrayList<Book>();
		} else {
			successfulResult.resultObject = bookList;
		}
		return successfulResult;
	}

	public boolean isSuccess() {
		return ResultCode.SUCCESS == resultCode;
	}

	public List<Book> getResultObject() {
		return resultObject;
	}

	public void setResultObject(List<Book> bookList) {
		this.resultObject = bookList;
	}

	public ResultCode getResultCode() {
		return resultCode;
	}

	public void setResultCode(ResultCode resultCode) {
		this.resultCode = resultCode;
	}
}

resultCode赋予一个默认值ResultCode.UNKNOWN_EXCEPTION,保证了即使使用默认构造函数,创建的对象也是一个合法的对象。
使用静态方法代替构造函数来构建对象,由于静态方法可以自定义方法名,可以明确的指明方法的使用场景。
在静态方法中,使用防御性编程,保持对象的不变量。该处也可以更为强硬的使用异常来指明参数错误。
回收对成功结果结果码的赋值,去除了调用方的对成功结果码的冗余重复使用。
Setter和Getter方法为系统框架使用,为了保持简单,没有加上防御性代码。
代码比重构前稍微复杂一点,但是考虑到该实现可以较好的保持对象的不变量,明确了方法的调用场景,以及去除了冗余代码,个人认为这样的实现优于原有实现。

分享到:
评论

相关推荐

    wavetansform1.zip_matlab图像重构_图像重构_图像重构 小波_小波分解和重构_重构误差

    本项目主要关注的是使用MATLAB进行小波变换实现图像的分解和重构过程,以及评估重构后图像与原始图像之间的差异。 首先,我们来了解一下小波变换的基本概念。小波变换(Wavelet Transform)是一种数学方法,它通过...

    mutual_information_相空间重构matlab_互信息熵_源码.zip

    这个压缩包中的源码很可能是实现了以上步骤的MATLAB函数或脚本,对于学习和实践互信息和相空间重构的学者来说,这是一个宝贵的资源。用户可以通过阅读和运行这些代码,理解相关算法的原理,并将其应用到自己的项目中...

    CS_OMP重构.zip_cs_omp.m_omp_压缩感知重构_重构算法

    3. "Untitled2.m":尽管文件名未给出明确含义,但通常这类未命名的文件可能是实验过程中的辅助脚本或临时工作文件,可能用于数据生成、结果可视化或其他算法调试。 四、实际应用与拓展 在实际应用中,压缩感知和...

    CS_MP.rar_CS MP matl_CS-MP_MP重构算法_matlab mp2d_压缩感知CS

    《CS-MP重构算法在Matlab环境中的实现与解析》 在信息技术领域,压缩感知(Compressive Sensing,简称CS)是一种突破传统采样理论的新型信号处理技术,它允许以远低于奈奎斯特定理所规定的速率进行信号采样,并能够...

    31天重构速成

    本篇文章将根据《31天重构速成》这一资料详细介绍31种关键的重构技巧,并探讨每一种技巧的应用场景、步骤及其潜在收益。 #### 二、重构技巧概览 1. **封装集合(Encapsulate Collection)** - **概述**:该技巧旨在...

    XIAOBOHANSHUTI_小波包分解_小波包分解与重构程序_小波包matlab_

    在"XIAOBOHANSHUTI.m"这个MATLAB函数中,我们能够看到小波包分解与重构的过程是如何被实现的。小波包分解的核心原理是将信号通过一系列正交的小波基展开,这些基函数能够在不同的频率区间和时间尺度上提供信号的精细...

    小波修改_傅里叶重构_对信号分解和重构_进行小波分析分解与快速傅里叶变换_

    在信号处理领域,小波分析和傅里叶变换是两种重要的工具,用于理解和解析复杂信号的结构。这两种方法都有其独特的优势,适用于不同的场景。本文将深入探讨标题和描述中提及的“小波修改”、“傅里叶重构”以及“对...

    UFB_PR_LP.rar_PR滤波器_图像重构_滤波 图像_滤波器组_重构

    在图像处理的背景下,滤波通常分为线性和非线性两种类型。线性滤波器如高通、低通和带通滤波器,主要依据图像的频率特性来对图像进行处理。非线性滤波则更多地关注图像的局部特性,例如边缘保持滤波器。PR滤波器在这...

    软件重构的思考与实践

    1. **两顶帽子**(Two Hats):这是一种思维方式,意味着开发者需要同时具备两种视角——一个是作为开发者,另一个则是作为重构者。开发者负责编写新功能,而重构者则关注代码质量的提升。 2. **单元测试**(Unit ...

    重构极限编程_XP的实践与反思(PDF).rar

    在实践中,XP强调结对编程,即两个开发者共享一个工作台,共同编写代码。这种方式可以提高代码质量,减少错误,同时促进知识共享和团队协作。此外,测试驱动开发(TDD)是XP的关键实践之一,要求开发者先写测试用例...

    重构_改善既有代码的设计

    重构的操作包括但不限于以下几点:提取方法(将一段代码提取成一个单独的方法),合并方法(将两个方法中相同或相似的部分合并),重命名变量或方法(使得命名更加直观和清晰),拆分循环(将一个复杂的循环拆分成几...

    31重构 模式与重构 MVC实例

    《31天重构速成》和《重构与模式》这两本书是IT领域的经典读物,主要探讨了软件开发中的重构和设计模式应用。重构是一种在不改变代码外在行为的前提下,改善代码结构的过程,旨在提高代码的可读性和可维护性。而设计...

    运用DAO和对象化进行重构_项目教程(2)_复习

    本教程“运用DAO和对象化进行重构”是北大青鸟的一位老师精心制作的,旨在帮助开发者掌握如何通过这两种技术改进代码质量。 1. DAO模式:DAO模式的核心在于创建一个接口或抽象类,定义了对数据访问的操作,然后提供...

    GPSR-BB_GPSRmatlab_GPSR_压缩感知重构_压缩感知采样_压缩感知.zip

    总的来说,这个压缩包为我们提供了一个深入了解和实践压缩感知技术的机会,特别是通过GPSR算法及其在MATLAB中的实现,我们可以学习如何利用稀疏性高效地采样和重构信号,这对于无线通信、医学成像、图像处理等多个...

    matlab_小波分解与重构_包括图形

    在MATLAB环境中,小波分解和重构是两个重要的信号处理技术,广泛应用于图像处理、噪声去除、信号特征提取以及模式识别等领域。小波分解能够将复杂的信号分解为不同频段的细节信息,而重构则是根据这些分解后的信息...

    基于python的运用KernelPCA重构误差的异常检测算法设计与实现

    在"KADOA.py"和"adoa_kadoa_contrast.py"这两个文件中,可能包含了实现KernelPCA异常检测算法的具体代码。通常,异常检测的流程包括以下步骤: 1. 数据预处理:清洗数据,处理缺失值,可能还需要对数据进行归一化或...

    采用haar小波实现一维信号的分解与重构(mallat算法):

    在一维信号处理领域,Haar小波和Mallat算法是两种重要的工具,它们在图像分析、音频处理、数据压缩等多个领域有着广泛的应用。本文将深入探讨这两个概念以及它们在实际操作中的应用。 Haar小波是一种最早被提出的...

    omp.zip_aroundh5n_compressIve sensing_mp_omp_稀疏重构

    总的来说,这个压缩包文件为我们提供了一个研究和实践压缩感知中稀疏重构的平台,通过比较和分析MP与OMP的性能,我们可以更好地理解这两种算法的优劣,并根据具体应用需求选择合适的方法。同时,这也为进一步优化和...

Global site tag (gtag.js) - Google Analytics