0

クリーンコーディングに関する本を読んでいて、サンプルコードがあります。

著者は、ほとんどすべての方法が彼の本の中で5行未満の長さである可能性があると述べています。


これは、理解しにくいように見えるリファクタリングされていないコードです。

  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();
  }

上記のコードは以下のようにリファクタリングされています。

 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();
  }

そしてついにこんな感じになりました

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

リファクタリングを行うと、3つのコードの方が優れていることがわかります。

3行または4行の長さですが、includeSetupAndTeardownPages(pageData、isSuite)という名前の最後のメソッドまたはその内部メソッドは5行より長くなる可能性があります...

それは私には矛盾しているように見えますか、それとも私は間違って考えていますか?

4

3 に答える 3

2

個人的には、メソッドを 5 行に分割するのは意味がないと思います。それは理にかなっているはずです:

  • 関数は、内部にいくつかの一般的なタスクがある場合に分割できます。たとえば、いくつかのモジュールの初期化。そこで、1 つのモジュールだけに関係する小さな関数に分割することは理にかなっています。
  • 複数回使用される別のコード。たとえば、null 値をチェックする必要がある日付の差分などを計算します。

すべてのメソッドをたった 5 行に分割するのは、私の意見では良くありません。したがって、実際に何が起こるかを確認するには、コードをジャンプする必要があります。また、それが最新のコンパイルのトピックではない場合、コードへのジャンプが多くなり、コードが遅くなる可能性があります...まあ、ほんの数ナノ秒かもしれませんが、これが重要なリアルタイムの問題もいくつかあります。

一般に、画面よりも長いコード (関数/メソッド) を記述しないことをお勧めします (私もそう思います) を何度か耳にしました。スクロールせずにコードを読むことができるように。

于 2012-08-29T09:06:59.103 に答える
1

クリーンなコードに 5 行を超えるメソッドを含めないという基準は、必ずしも適切ではありません。

私の意見では、

  • コードの多くの部分で一般的に使用される/より頻繁に使用される機能をカプセル化して、コードの行数を減らすようにしてください。これにより、コードのエラーが発生しにくくなり、デバッグが非常に簡単になります! 多くの時間を節約します。
  • コードを読みやすくする 1 つのロジック実行ブロックに属するコードを結合します。特に大きなプロジェクトで作業する場合は、優れた構造は金の価値があります。
  • コードを読みやすくする方法で関数に名前を付けます!!!
  • 関数、パラメーター、変数、およびコードを徹底的に文書化することで、doxygen などのツールを使用して、印刷可能な文書を簡単に生成できます。コードに取り組んでいる開発者が複数いる場合に役立ちます。

決まった数に固執するのではなく、分かりやすさと構造を求めてください。

于 2012-08-29T09:14:14.590 に答える
0

著者は、この目標を達成するために、1つの方法を2つ、3つ、4つ以上の方法に分割していると思います。クリーンなコードは、5行未満のメソッドを持つコードではないと思います。

于 2012-08-29T08:59:23.470 に答える