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

《代码之美》第7章 漂亮的测试 的bad smell

阅读更多
这章基于二分查找讨论了一个漂亮的测试应该怎么做。
先看看原文怎么做。这里的讨论省略了随机,性能,数组中元素重复,以及输入为null的情况。

	public void testBinarySearch() {

		int[] testArray = ...;
		int target = ...;

		int returnValue = Util.binarySearch(testArray, target);

		// 当returnValue为-1的时候,数组中没有target.
		assertTheory1(testArray, target, returnValue);

		// 当returnValue大于等于0的时候,数组中returnValue的值等于target.
		assertTheory2(testArray, target, returnValue);

		// 当数组中没有target时,应该返回-1.
		assertTheory3(testArray, target, returnValue);

		// 如果testArray在位置n上包含target,那么binarySearch(testArray,target)必须返回n.
		assertTheory4(testArray, target, returnValue);
	}

	private void assertTheory1(int[] testArray, int target, int returnValue) {
		if (returnValue == -1) {
			assertFalse(arrayContainsTarget(testArray, target));
		}
	}

	private void assertTheory2(int[] testArray, int target, int returnValue) {
		if (returnValue >= 0) {
			assertEquals(target, testArray[returnValue]);
		}
	}

	private void assertTheory3(int[] testArray, int target, int returnValue) {
		if (!arrayContainsTarget(testArray, target)) {
			assertEquals(-1, returnValue);
		}
	}

	private void assertTheory4(int[] testArray, int target, int returnValue) {
		assertEquals(getTargetPosition(testArray, target), returnValue);
	}

	private int getTargetPosition(int[] testArray, int target) {
		for (int i = 0; i < testArray.length; i++) {
			if (testArray[i] == target)
				return i;
		}
		return -1;
	}


作者先是建立了Theory1,2作为验证的手段,然后发现Theory1,2有漏洞,于是补充上Theory3,4形成一个测试组。

但是仔细研究这段代码发现还是有问题的。
一个很微小的瑕疵就是Theory4的定义和实现不一致,Theory4的code验证包含了Theory4的理论推理。

本来这个也没有什么了不起,但是让我们从头开始回顾为什么要测试二分查找。
答:简单的查找不容易错但是慢,所以我们需要速度快的二分查找。
但是二分查找涉及了一些求中值啊,改变上下限的操作,容易出错,所以我们需要测试二分查找。

Aha,getTargetPosition本身就是一个符合二分查找规范的简单查找(除了性能),而且因为其简单,我们肉眼检查可以确信该实现是正确的。思路来了,用一个正确的慢的实现去验证一个快的实现。

原来的Theory1,2,3,4变成了一个,任何情况下,二分查找应该和一个符合二分查找功能规范(除了性能)的简单查找的结果相同。

Refine后的代码如下。

	public void testBinarySearch() {

		int[] testArray = new int[10];
		int target = 0;

		int returnValue = Util.binarySearch(testArray, target);

		assertEquals(getTargetPosition(testArray, target), returnValue);	

	}


	private int getTargetPosition(int[] testArray, int target) {
		for (int i = 0; i < testArray.length; i++) {
			if (testArray[i] == target)
				return i;
		}
		return -1;
	}


嗯,code变少了,更简洁漂亮了,I like it。
0
0
分享到:
评论
1 楼 simbel 2009-10-16  
看完有个地方不太明白,原文中说的
“一个很微小的瑕疵就是Theory4的定义和实现不一致,Theory4的code验证包含了Theory4的理论推理。”,不是很明白? 可否进一步解释下?谢谢

相关推荐

    Code Bad Smell Detector-开源

    `Code Bad Smell Detector` 是一个基于Java的开源项目,其目标是自动检测代码中的不良味道,从而帮助开发者改善代码质量。 该项目遵循Martin Fowler在其1999年的著作《重构:改善既有代码的设计》中提出的五种主要...

    第9章 系统编程与图形开发.zip_C语言程序设计经典236例_smell7l9

    首先,第7章“神奇的算法”是C语言编程中至关重要的部分。算法是解决问题的步骤或方法,它在计算机科学中扮演着核心角色。这一章可能涵盖了排序算法(如冒泡排序、插入排序、选择排序、快速排序等)、查找算法(线性...

    A Textual-based Technique for Smell Detection

    TACO(Textual Analysis for Code Smell Detection)是一种新颖的技术,它采用文本分析手段来检测不同性质和不同粒度级别的代码异味。研究人员在10个开源项目上运行了TACO,并将其性能与仅基于代码组件结构信息的...

    三维多孔介质数值模拟代码.zip_fluent udf_smell62s_三维udf_三维介质_多孔三维

    "三维多孔介质数值模拟代码.zip_fluent udf_smell62s_三维udf_三维介质_多孔三维"这个压缩包文件包含了一套专门用于模拟三维多孔介质环境中的流体流动的代码。下面我们将深入探讨相关知识点。 首先,让我们了解核心...

    coca-master.zip

    它不仅能够检测代码中的不良实践(bad smell),进行代码行数统计,还能够分析代码的调用与依赖关系,同时提供Git分析功能,以及支持自动化重构,极大地提升了开发者的工作效率。 首先,让我们深入了解一下Coca如何...

    QT代码统计器QT代码统计器

    通过定期进行代码统计和分析,可以发现潜在的代码异味(code smell),并及时进行重构,以保持代码的可读性和可维护性。 总之,QT代码统计器是QT开发环境中一个实用的辅助工具,它通过提供详细的代码统计信息,帮助...

    《重构改善既有代码的设计第2版》第1章 重构,第一个示例重构过程

    本章聚焦于重构的第一个实例,通过实际的代码示例,详细展示了重构的整个流程,并利用Git进行版本控制,确保每一步改动都有迹可循。 首先,重构的核心是识别代码中的坏味道(code smell),即那些暗示设计问题的不...

    重构_重构_改善既有代码_

    这一过程包括识别代码中的坏味道(code smell)——那些表明代码可能存在潜在问题的迹象,并应用一系列小型、安全的重构步骤来消除这些问题。 书中的重构模式(Refactoring Patterns)提供了具体的指导,例如: 1....

    软件测试中单元测试VS私有方法

    软件测试中单元测试VS私有方法软件测试前几天,NareshJain在ManagedChaos上发了篇博客,总结了一些测试中的badsmell。例如:●一个方法中有太多testcase——被测试的方法做了太多事情。●太多的setup/teardown——...

    Automatic-Code-Smell-Detector:IntelliJ插件专注于自动检测和纠正Java代码中的代码气味

    自动代码气味检测器自动代码气味检测器是IntelliJ IDEA插件,致力于自动检测和纠正Java代码中的代码气味。下载及安装可以按照以下步骤直接在IntelliJ IDEA中下载该插件: 按Ctrl + Alt + S或选择文件| 设置(适用于...

    code-smell-refactoring:几种语言中各种代码异味的小例子

    在软件开发中,"代码味道"(Code Smell)是指那些表明代码可能存在潜在问题的特征或模式。这些不一定是错误,但它们可能会降低代码的可读性、可维护性和效率,因此需要进行重构。"code-smell-refactoring"项目是一个...

    重构-改善既有代码的设计(含中文PDF,英文chm)

    这个过程涉及识别代码中的坏味道(code smell),然后应用一系列微小的、精确的修改,逐步改善代码的整体架构。Fowler在书中详细列举了多种重构模式,这些模式都是经过实践验证的代码优化策略。 书中的中文PDF和...

    CodePro 生成测试类工具

    CodePro Analytix不仅限于生成测试类,它还提供了多种代码分析工具,能够对代码进行静态分析,找出潜在的bug、代码异味(code smell)和性能问题。这些功能有助于提高代码质量,减少维护成本。例如,插件可以检查未...

    麻省理工18年春软件构造课程阅读04“代码评审” 1

    与此同时,评审过程也是对编程原则的一个重要检验,例如,是否有代码存在"难闻的"代码(bad smell),这通常指的是那些使代码难以理解或可能引发错误的代码结构,比如冗余的代码或者复杂的逻辑判断。 在进行代码...

    检测JavaScript类的内聚耦合Code Smell.pdf

    JavaScript 类的内聚耦合Code Smell检测是软件质量保证的重要方面,因为它涉及到代码的可读性、可维护性和整体设计质量。本文介绍了一种名为JS4C的检测方法,专门针对JavaScript类中的FE(Feature Envy)、DC(Data ...

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

    这个压缩包文件包含了书中的第一章部分的源码示例,可能是为了帮助读者更好地理解重构实践。 在重构过程中,我们首先需要理解几个核心概念: 1. **识别坏味道**:当代码出现“坏味道”(code smell)时,如冗余...

    重构 改善既有代码的设计 高清版

    马丁·福勒指出,重构不应只在代码出现问题时才进行,而应在日常开发中持续进行,以防止代码异味(Code Smell)积累。他还讨论了如何说服团队成员接受重构,以及如何在项目管理中考虑到重构的时间和成本。 总之,...

    bear smell search algorithm熊气味搜索算法附matlab代码.zip

    1.版本:matlab2014/2019a/2021a ...3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    统计源代码量源码(java编程)

    10. **代码质量管理**:统计源代码量也是代码质量管理的一部分,可以用来评估代码复杂度,找出潜在的代码异味(code smell),并进行重构,以提高代码质量和可维护性。 以上就是关于“统计源代码量源码”程序的一些...

    Findbug使用指南.docx

    Findbug 是一个开源的 Eclipse 代码检查工具,能够简单高效全面地帮助我们发现程序代码中存在的 bug、bad smell 以及潜在隐患。它提供了简单的修改意见供我们重构时进行参考,通过使用它,可以一定程度上降低我们 ...

Global site tag (gtag.js) - Google Analytics