1.方法要可能的短。最好控制在几行以内。
例如:
public static String renderPageWithSetupsAndTeardowns(
PageData pageData, boolean isSuite) throws Exception {
if (isTestPage(pageData))
includeSetupAndTeardownPages(pageData, isSuite);
return pageData.getHtml();
}
在if,else,while的语句块中应该已有一个行代码(方法调用)
一个方法类的缩进应该已有一级
2.一个方法只做一件事
3.一个方法内部的代码应该在一个抽象级别。
否则代码阅读者无法区别去要步骤和周边细节。这样,很容易忽略代码的主要步骤。
4.使用具有描述性的方法名词。
不要害怕使用长的方法名,长的具有描述性的方法名比描述性的注释更有用。例如includeSetupAndTeardownPages, includeSetupPages, includeSuiteSetupPage, and includeSetupPage.
5.方法异常处理
5.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;
}
使用异常处理,可以同时处理多个错误,结构更简单
try {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
catch (SomeOtherException e) {
logger.log(e.getMessage());
}
catch (Exception e) {
logger.log(e.getMessage());
}
5.2提取try/catch代码块为单独的方法
try/catch使代码的结构变得复杂,使错误错误处理和正常操作混在了一切。最好把try和catch的block单独放在一个方法中,例如:
public void delete(Page page) {
try {
deletePageAndAllReferences(page);
}
catch (Exception e) {
logError(e);
}
}
private void deletePageAndAllReferences(Page page) throws Exception {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
private void logError(Exception e) {
logger.log(e.getMessage());
}
如果关键字try出现在方法中,应该出现在很靠前的位置,catch/finally后面不应该有其他的代码
6.在一个类中,方法的排列能保证阅读代码从上到下的进行,一个方法后面跟着下一个抽象层次的方法
例子:
package fitnesse.html;
import fitnesse.responders.run.SuiteResponder;
import fitnesse.wiki.*;
public class SetupTeardownIncluder {
private PageData pageData;
private boolean isSuite;
private WikiPage testPage;
private StringBuffer newPageContent;
private PageCrawler pageCrawler;
public static String render(PageData pageData) throws Exception {
return render(pageData, false);
}
public static String render(PageData pageData, boolean isSuite)
throws Exception {
return new SetupTeardownIncluder(pageData).render(isSuite);
}
private SetupTeardownIncluder(PageData pageData) {
this.pageData = pageData;
testPage = pageData.getWikiPage();
pageCrawler = testPage.getPageCrawler();
newPageContent = new StringBuffer();
}
private String render(boolean isSuite) throws Exception {
this.isSuite = isSuite;
if (isTestPage())
includeSetupAndTeardownPages();
return pageData.getHtml();
}
private boolean isTestPage() throws Exception {
return pageData.hasAttribute("Test");
}
private void includeSetupAndTeardownPages() throws Exception {
includeSetupPages();
includePageContent();
includeTeardownPages();
updatePageContent();
}
private void includeSetupPages() throws Exception {
if (isSuite)
includeSuiteSetupPage();
includeSetupPage();
}
private void includeSuiteSetupPage() throws Exception {
include(SuiteResponder.SUITE_SETUP_NAME, "-setup");
}
private void includeSetupPage() throws Exception {
include("SetUp", "-setup");
}
private void includePageContent() throws Exception {
newPageContent.append(pageData.getContent());
}
private void includeTeardownPages() throws Exception {
includeTeardownPage();
if (isSuite)
includeSuiteTeardownPage();
}
private void includeTeardownPage() throws Exception {
include("TearDown", "-teardown");
}
private void includeSuiteTeardownPage() throws Exception {
include(SuiteResponder.SUITE_TEARDOWN_NAME, "-teardown");
}
private void updatePageContent() throws Exception {
pageData.setContent(newPageContent.toString());
}
private void include(String pageName, String arg) throws Exception {
WikiPage inheritedPage = findInheritedPage(pageName);
if (inheritedPage != null) {
String pagePathName = getPathNameForPage(inheritedPage);
buildIncludeDirective(pagePathName, arg);
}
}
private WikiPage findInheritedPage(String pageName) throws Exception {
return PageCrawlerImpl.getInheritedPage(pageName, testPage);
}
private String getPathNameForPage(WikiPage page) throws Exception {
WikiPagePath pagePath = pageCrawler.getFullPath(page);
return PathParser.render(pagePath);
}
private void buildIncludeDirective(String pagePathName, String arg) {
newPageContent.append("\n!include ").append(arg).append(" .").append(
pagePathName).append("\n");
}
}
分享到:
相关推荐
### 清晰编程的核心概念与实践 —— 《Writing Clean Code中文版》解析 #### 标题解析 - **标题**:“Writing Clean Code中文版”表明这是一本关于如何编写清晰、高质量代码的书籍,其内容是针对中文读者群体。 ##...
《Writing Clean Code》这本书由Steve Maguire撰写,姜静波、佟金荣翻译,麦中凡校对,由电子工业出版社出版。本书是关于如何编写高质量、无错误的C语言程序的专业指南。作者基于自己在微软的工作经验和教训,分享了...
《编写整洁代码》是软件开发领域中一个至关重要的主题,旨在提高代码的可读性、可维护性和可扩展性。本文将深入探讨该主题,并基于...在《Writing Clean Code》中,你将找到更多关于如何实现这一目标的具体指导和示例。
Google 工程师 Ryan McDermott 根据 《Clean Code》总结了一份适用于 JavaScript 的软件工程指导准则《Clean Code JavaScript》。希望能帮你写出易读、易复用、易重构的 JavaScript 代码
根据提供的文件信息,这本名为《编程精粹──Microsoft...总结来说,本书是关于如何编写干净且无错的C程序的实践指南,涵盖了编写优质代码所需的技术、方法和态度,同时提供了大量微软公司内部的编程经验和技术细节。
《Clean Code: A Handbook of Agile Software Craftsmanship》是由Robert C. Martin所著的一本关于编写高质量、可维护代码的手册。该书深入探讨了如何通过遵循特定的原则和实践来提升软件开发的专业水平,特别强调了...
- **Clean Code 英文原版书**:本书的标题明确了其主要内容是关于如何编写清晰、易于理解和维护的代码(即“Clean Code”)。这是一本面向软件开发者的书籍,强调了高质量代码的重要性。 #### 描述解析 - **如何更...
《编程精粹-Writing Clean Code》不仅包含了实用的编程技巧和方法,更重要的是传达了一种追求卓越的软件开发精神。通过深入探讨如何创建高质量的C语言程序,本书为软件工程师们提供了一套全面的工具和思路,帮助他们...
Martin所著的《Clean Code》一书中的原则,将其适应于JavaScript语言环境。这不仅仅是一份样式指南,更是一种关于如何编写可读性强、可重用性高且易于重构的JavaScript软件的方法论。 #### 二、变量命名 在编写...
经验总结,团队开发的约束规范,也是编程的艺术,提高code 的可读性,后期维护性...
《Debugging the Development Process》 - 无论是写代码的还是不写代码的人都应该读读。 《Write Clean Code》- 作者在微软开发了n年(n > 2)程序后的经验总结,比较适合软件开发设计人员。
- **编写文档的重要性**:意识到这一点后,Steve Maguire开始考虑将这些宝贵的经验总结成文,以便于新加入的程序员能够快速学习和掌握。 #### 五、书籍内容概述 - **编写无错代码的原则**:书中详细介绍了如何避免...
《Clean Code》是著名软件工程师Robert C. Martin(也被称为Uncle Bob)的一部经典著作,书中详尽探讨了如何编写可读性好、可维护性强的代码,从而实现“清洁代码”。在这个名为"Everything-about-Clean-Code"的存储...
总结,CleanCode-Serialization项目提供了Java序列化的实践示例,帮助开发者了解如何有效地使用和控制序列化过程。无论是为了数据持久化还是网络通信,理解并熟练掌握Java序列化都是提升代码质量和效率的关键。