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

《Clean Code》总结 异常

    博客分类:
  • Java
 
阅读更多
1.使用异常而不是错误码
如果使用错误码,调用者,必须在方法调用后立即检查结果,如果多次调用都放回错误码,就会造成复杂的多层嵌套结构。
if (deletePage(page) == E_OK) {
    if (registry.deleteReference(page.name) == E_OK) {
        if (configKeys.deleteKey(page.name.makeKey()) == E_OK){
            logger.log("page deleted");
        } else {
            logger.log("configKey not deleted");
        }
    } else {
        logger.log("deleteReference from registry failed");
    }
} else {
    logger.log("delete failed");
    return E_ERROR;
}

2.使用uncheck异常
java世界就checked exception的优劣争论了很久。没有checked异常的也能构建robust的程序。为了robust而使用checked异常的代价太高了。checked异常最大的问题在于它是的程序违反了 开放/封闭原则 调用者不得不捕捉异常或者声明抛出异常。如果底层的异常修改了,高层代码也要修改。如果异常在较高层次处理,就会造成一串的修改。

3.为了调用者的方便,封装异常调用代码
很多标准库或者第三方库的方法调用会抛出多个checked异常,对一长串异常处理的代码显得太冗长,而直接捕捉Exception又会丢失很多细节。一个解决方法就是,使用单独的类或方法封装抛出异常的方法调用,做一些处理后抛出unchecked异常,方便上层调用。
ACMEPort port = new ACMEPort(12);
try {
	port.open();
} catch (DeviceResponseException e) {
	reportPortError(e);
	logger.log("Device response exception", e);
} catch (ATM1212UnlockedException e) {
	reportPortError(e);
	logger.log("Unlock exception", e);
} catch (GMXError e) {
	reportPortError(e);
	logger.log("Device response exception");
} finally {
…
}
做如下封装
public class LocalPort {
	private ACMEPort innerPort;

	public LocalPort(int portNumber) {
		innerPort = new ACMEPort(portNumber);
	}

	public void open() {
		try {
			innerPort.open();
		} catch (DeviceResponseException e) {
			throw new PortDeviceFailure(e);
		} catch (ATM1212UnlockedException e) {
			throw new PortDeviceFailure(e);
		} catch (GMXError e) {
			throw new PortDeviceFailure(e);
		}
	}
}

高层代码只需要处理DeviceResponseException。这样做也使得第三方代码的传播度更小,也更方便mock方法调用。

4.不使用异常处理正常逻辑,比如下面的代码
try {
	MealExpenses expenses = expenseReportDAO.getMeals(employee.getID());
	m_total += expenses.getTotal();
} catch(MealExpensesNotFound e) {
	m_total += getMealPerDiem();
}

异常弄乱了正常的逻辑。解决方法是让ExpenseReportDAO始终返回MealExpenses,如果MealExpenses not found,可是返回一个特殊的MealExpenses
public class PerDiemMealExpenses implements MealExpenses {
	public int getTotal() {
		// return the per diem default
	}
}

这叫着SPECIAL CASE PATTERN [Fowler],You create a class or configure an object so that it handles a special case for you.

5.不要返回Null。
方法调用如果允许放回null,会大大增加调用者的复杂度。可以考虑抛出异常,或者使用Null Object或者特殊的对象。例如
List<Employee> employees = getEmployees();
if (employees != null) {
	for (Employee e : employees) {
		totalPay += e.getPay();
	}
}
------
public List<Employee> getEmployees() {
	if (.. there are no employees ..)
		return Collections.emptyList();
}

如果没有Employee,就返回一个空的List,这样调用者可以不用做特殊的处理。

6.不要传递null到方法。
如果参数可为null,方法不得不做必要的检查,代码会很冗余,而且没有很好解决方案。
分享到:
评论

相关推荐

    Writing Clean Code.rar

    《编写整洁代码》是软件开发领域中一个至关重要的主题,旨在提高代码的可读性、可维护性和可扩展性。本文将深入探讨该主题,并基于...在《Writing Clean Code》中,你将找到更多关于如何实现这一目标的具体指导和示例。

    Writing Clean Code(PDF版本)

    《Writing Clean Code》这本书由Steve Maguire撰写,姜静波、佟金荣翻译,麦中凡校对,由电子工业出版社出版。本书是关于如何编写高质量、无错误的C语言程序的专业指南。作者基于自己在微软的工作经验和教训,分享了...

    CleanCode

    《CleanCode:微软无bug编程技术》一书深入探讨了编写清晰、无错误代码的艺术,强调了编程过程中遵循良好实践的重要性。以下是对该书主要内容的知识点总结与拓展: ### 命名约定 命名约定是编写清晰代码的基础之一...

    编程精粹 Writing Clean Code

    - **编写文档的重要性**:意识到这一点后,Steve Maguire开始考虑将这些宝贵的经验总结成文,以便于新加入的程序员能够快速学习和掌握。 #### 五、书籍内容概述 - **编写无错代码的原则**:书中详细介绍了如何避免...

    Everything-about-Clean-Code:该存储库包含与阅读和理解Robert C. Martins的“ Clean Code”有关的所有内容。

    《Clean Code》是著名软件工程师Robert C. Martin(也被称为Uncle Bob)的一部经典著作,书中详尽探讨了如何编写可读性好、可维护性强的代码,从而实现“清洁代码”。在这个名为"Everything-about-Clean-Code"的存储...

    CC_TPP:Clean Code 视频系列的转型优先前提

    总结来说,"CC_TPP:Clean Code 视频系列的转型优先前提"是一套针对Java程序员的教育资源,它的目标是引导开发者遵循Clean Code的最佳实践,以提高代码质量和团队协作效率。通过学习这个系列,开发者可以更好地理解...

    clean-code-booknote:记录clean-code的读书笔记

    这个压缩包文件"clean-code-booknote"显然是一个读者对这本书的读书笔记,可能包含了书中关键概念、原则和实践的总结。虽然没有具体的标签提供额外信息,我们可以根据书的主题来深入讨论一些软件开发中的核心知识点...

    Writing Solid Code

    #### 四、总结 《Writing Solid Code》不仅是一本技术指南,更是一部关于编程哲学的作品。它不仅仅教会我们如何编写稳固的代码,更重要的是,它引导我们思考如何成为一名更好的程序员。通过深入理解和实践书中的理念...

    clean_code

    "Clean Code",即清洁代码,不仅意味着代码的可读性和可维护性,更体现了程序员的专业素养和团队协作效率。针对JavaScript这门广泛使用的前端和后端编程语言,遵循一定的编码规范和最佳实践,能够帮助我们编写出更加...

    python 自定义异常和异常捕捉的方法

    总结来说,Python的异常处理提供了强大的工具来管理和处理程序运行时可能出现的问题。自定义异常可以帮助我们更好地定义和分类错误,而`try-except`结构则允许我们优雅地处理这些异常,保持程序的健壮性和稳定性。...

    JavaCleanCode:这是Java编码技术的存储库。

    5. **设计模式**:设计模式是解决常见编程问题的经验总结,如单例模式、工厂模式、观察者模式等。JavaCleanCode可能包含这些模式的实例,帮助开发者学习如何在实际项目中应用它们。 6. **单元测试**:为了确保代码...

    SVN在客户端执行UPDATE报locked的处理办法

    #### 总结 SVN在客户端执行`svn update`命令时报“locked”错误,通常是由于上一次操作异常中断等原因导致的。通过使用TortoiseSVN的“Cleanup”功能或手动删除`.svn`目录下的`.lock`文件可以有效地解决这个问题。...

    Symbian OS内存管理介绍.txt

    #### 二、异常处理与清理栈(Cleanup Stack) 在 Symbian OS 中,异常处理和清理栈是非常重要的两个概念,它们确保了系统的稳定性和可靠性。 ##### 异常处理(Exception Handling) Symbian OS 并不使用 C++ 的...

    java面试总结

    - **《Clean Code》**: 关于编写清晰简洁代码的原则和技术。 - **《Design Patterns: Elements of Reusable Object-Oriented Software》**: 介绍设计模式的经典著作。 #### 三十二、Java Exception体系结构 - **...

    C语言插件机制(下) 转

    在开发工具方面,`gcc`编译器提供了一套强大的链接选项来处理动态库,如`-shared`用于创建动态库,`-fPIC`(Position Independent Code)确保代码能在任何内存位置正确执行。对于Windows,`cl.exe`(Visual Studio...

Global site tag (gtag.js) - Google Analytics