关于javascript:闻香识代码什么是衡量代码质量的终极标准

10次阅读

共计 4322 个字符,预计需要花费 11 分钟才能阅读完成。

🤫 小声揭示 🤫

关注 Zilliz 微信公众号并回复「clean code」

获取《代码整洁之道》超具体思维导图

咱们为什么要谋求整洁的代码?

《代码整洁之道》(Clean Code)提出,代码品质与其整洁度成正比。

只是让代码跑起来是不够的,因为需要一直增长,代码须要与时俱进:减少新的特色、批改已有的性能,优化性能……大工程量的我的项目须要由团队独特保护代码。

在团队合作中,冗余的逻辑和凌乱的代码会让节约大量的工夫和资源,毕竟谁都不想捏着鼻子保护一座「💩💩⛰️」。因而,优良的软件工程师谋求代码上的「洁癖」,以写出赏心悦目、可扩大、易保护的代码为己任。

《代码整洁之道》这本书正是一本 代码清洁指南。这本书的作者是软件行业泰斗 Robert Martin,他是设计模式和麻利开发的先驱,被后辈程序员尊称为「Uncle Bob」。2001 年,他和另外十六位顶级软件行业领军人物独特签订了《麻利开发宣言》,为高效、可合作的软件开发流程建设了外围价值观,而《代码整洁之道》帮忙麻利开发打下基础,提供了一套卓有成效的操作指南。

无论你是开发人员、软件工程师,还是项目经理、团队领导,如果你心愿放弃业余、一直精进,都应该读一读这本书。

你将从这本书中取得:

  • 学会如何辨别代码的好坏,疾速辨认「脏乱」代码
  • 学会优化代码,让代码正确、简洁、柔美、可继续
  • 让代码易于浏览和了解,帮你的队友节约工夫
  • 养成应用自动化测试和单元测试的习惯,防止恶性循环
  • 了解真正的业余精力

整洁的代码长啥样?

第一章中,作者援用了 C++ 语言发明者 Bjarne Stroustrup 的话:

代码逻辑该当含糊其辞,叫缺点难以暗藏;尽量减少依赖关系,使之便于保护;根据某种分层策略欠缺错误处理代码;性能调至最优,省得麻烦他人做没规矩的优化,搞出一堆凌乱来。整洁的代码只做好一件事。

除此之外,整洁的代码还应该:

  • 便于浏览,可由作者之外的开发者增补
  • 有单元测试和验收测试
  • 应用有意义的命名
  • 依赖关系尽量精简
  • 代码应通过其字面表白含意
  • 没有反复代码

如何「清理」你的代码?

作者以本人走过的弯路为例,给出大量「清理代码」的案例。通过一个个具体的案例,作者手把手率领读者将问题的代码库转化为一个强壮和高效的代码库。

让咱们花一两分钟看一个案例,上面的代码,你能看懂多少?

代码清单 3-1 HtmlUtil.java(坏例子)

public static String testableHtml(
  PageData pageData,
  boolean includeSuiteSetup
) throws Exception {WikiPage wikiPage = pageData.getWikiPage();
  StringBuffer buffer = new StringBuffer();
  if (pageData.hasAttribute("Test")) {if (includeSuiteSetup) {
      WikiPage suiteSetup =
      PageCrawlerImpl.getInheritedPage(SuiteResponder.SUITE_SETUP_NAME, wikiPage);
      if (suiteSetup != null) {
      WikiPagePath pagePath =
        suiteSetup.getPageCrawler().getFullPath(suiteSetup);
      String pagePathName = PathParser.render(pagePath);
      buffer.append("!include -setup .")
            .append(pagePathName)
            .append("\n");
      }
    }
    WikiPage setup =
      PageCrawlerImpl.getInheritedPage("SetUp", wikiPage);
    if (setup != null) {
      WikiPagePath setupPath =
        wikiPage.getPageCrawler().getFullPath(setup);
      String setupPathName = PathParser.render(setupPath);
      buffer.append("!include -setup .")
            .append(setupPathName)
            .append("\n");
    }
  }
  buffer.append(pageData.getContent());
  if (pageData.hasAttribute("Test")) {
    WikiPage teardown =
      PageCrawlerImpl.getInheritedPage("TearDown", wikiPage);
    if (teardown != null) {
      WikiPagePath tearDownPath =
        wikiPage.getPageCrawler().getFullPath(teardown);
      String tearDownPathName = PathParser.render(tearDownPath);
      buffer.append("\n")
            .append("!include -teardown .")
            .append(tearDownPathName)
            .append("\n");
    }
    if (includeSuiteSetup) {
      WikiPage suiteTeardown =
        PageCrawlerImpl.getInheritedPage(
                SuiteResponder.SUITE_TEARDOWN_NAME,
                wikiPage
        );
      if (suiteTeardown != null) {
        WikiPagePath pagePath =
          suiteTeardown.getPageCrawler().getFullPath (suiteTeardown);
        String pagePathName = PathParser.render(pagePath);
        buffer.append("!include -teardown .")
              .append(pagePathName)
              .append("\n");
      }
    }
  }
  pageData.setContent(buffer.toString());
  return pageData.getHtml();}

在下面的代码中,有太多不同层级的形象、奇怪的字符串、函数调用,混以双重嵌套、用标识来管制的 if 语句等,令人头疼。只有做几个简略的办法抽离和重命名操作,加上一点点重构,就能在接下来的几行代码中搞定:

代码清单 3-2 HtmlUtil.java(重构之后)

public static String renderPageWithSetupsAndTeardowns(PageData pageData, boolean isSuite) throws Exception {boolean isTestPage = pageData.hasAttribute("Test");
  if (isTestPage) {WikiPage testPage = pageData.getWikiPage();
    StringBuffer newPageContent = new StringBuffer();
    includeSetupPages(testPage, newPageContent, isSuite);
    newPageContent.append(pageData.getContent());
    includeTeardownPages(testPage, newPageContent, isSuite);
    pageData.setContent(newPageContent.toString());
  }

  return pageData.getHtml();}

这段代码比第一个例子清晰多了,你大略能明确,这个函数要把一些设置和拆解页放入一个测试页面,再渲染为 HTML。

但这样优化还不够整洁,作者说,「函数的第一规定是要短小。第二条规定是还要更短小。」

再次重构后,代码终于高深莫测:

代码清单 3-3 HtmlUtil.java(再次重构之后)

public static String renderPageWithSetupsAndTeardowns(PageData pageData, boolean isSuite) throws Exception {if (isTestPage(pageData))
    includeSetupAndTeardownPages(pageData, isSuite);
  return pageData.getHtml();}

须要阐明的是,《代码整洁之道》中的案例都是用 Java 语言写的,有一部分案例专门针对 Java。如果你应用其余语言,那么能够偷梁换柱,了解书中的核心思想即可。

小编在 GitHub 上找到了一个用 JavaScript 去诠释「Clean Code」理念的我的项目,该我的项目给出大量 good / bad 两面的范例,并辅以正文作为阐明,帮忙读者了解「Clean Code」的理念 👇👇👇

Clean Code Javascript 代码地址:https://github.com/ryanmcderm…

气息和启发

如何「闻香识代码」?作者总结了一些「坏气息」和「好气息」。「坏气息」指的是代码中某些疏漏、某些小谬误,开发人员能够通过这些细节上的征兆在代码中追捕到更大问题;「好气息」指的是一些应该恪守的规定。

以写正文为例,「坏气息」包含:

  • 冗余的正文
  • 被正文掉的代码(应该及时删除这些代码)
  • ……

对于命名而言,「好气息」的例子包含:

  • 采纳描述性的名称
  • 名称无歧义
  • 应用规范命名办法
  • 阐明副作用
  • ……

这份清单很难穷尽所有的规定,清单背地所体现的价值体系才是「代码整洁」的指标。

想要理解更多具体内容?关注 Zilliz 微信公众号并回复书名「clean code」,即可取得小编整顿的《代码整洁之道》高清思维导图。

福利工夫

你是如何晋升代码程度的?

你最想吐槽哪些不好的代码习惯?

对技术感兴趣的你,有哪些心头好书?

欢送在微信评论区留言你的想法,

咱们将选取一位小伙伴,

赠送纸质版《代码整洁之道》一本!

积攒代码量很重要,
读书、读好书也很重要。
「Zilliz 好书举荐」栏目,
旨在与你分享技术成长相干的书籍,
与你一起先把书读厚,再把书读薄。


Zilliz 以从新定义数据迷信为愿景,致力于打造一家寰球当先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的暗藏价值。

Zilliz 构建了 Milvus 向量数据库,以放慢下一代数据平台的倒退。Milvus 数据库是 LF AI & Data 基金会的毕业我的项目,可能治理大量非结构化数据集,在新药发现、举荐零碎、聊天机器人等方面具备宽泛的利用。

正文完
 0