Clean Code:改善(p.57)

 "Clean Code"*1の p.57 に掲載されているコード例を、自分なりに修正してみます。
 "Clean Code"に掲載されている例はこうです。

public void testCompareTo() throws Exception
{
 WikiPagePath a = PathParser.parse("PageA");
 WikiPagePath ab = PathParser.parse("PageAPageB");
 WikiPagePath b = PathParser.parse("PageB");
 WikiPagePath aa = PathParser.parse("PageAPageA");
 WikiPagePath bb = PathParser.parse("PageBPageB");
 WikiPagePath ba = PathParser.parse("PageBPageA");

 assertTrue(a.compareTo(a) == 0);     // a == a
 assertTrue(a.compareTo(b) != 0);     // a != b
 assertTrue(ab.compareTo(ab) == 0);   // ab == ab
 assertTrue(a.compareTo(b) == -1);    // a < b
 assertTrue(aa.compareTo(ab) == -1);  // aa < ab
 assertTrue(ba.compareTo(bb) == -1);  // ba < bb
 assertTrue(b.compareTo(a) == 1);     // b > a
 assertTrue(ab.compareTo(aa) == 1);   // ab == aa
 assertTrue(bb.compareTo(ba) == 1);   // bb == ba
}
|<<

 この例でのコメントは、意図をはっきりさせるのに有用だと書いてあるのですが、次のようにすれば、もっと好ましいのではないでしょうか。意図がはっきりする上に、コメントを使う必要もなくなると思います。

>||
public void testCompareTo() throws Exception
{
 WikiPagePath a = PathParser.parse("PageA");
 WikiPagePath ab = PathParser.parse("PageAPageB");
 WikiPagePath b = PathParser.parse("PageB");
 WikiPagePath aa = PathParser.parse("PageAPageA");
 WikiPagePath bb = PathParser.parse("PageBPageB");
 WikiPagePath ba = PathParser.parse("PageBPageA");

 assertCompareTo(a, "==", a);
 assertCompareTo(a, "!=", b);
 assertCompareTo(ab, "==", ab);
 assertCompareTo(a, "<", b);
 assertCompareTo(aa, "<", ab);
 assertCompareTo(ba, "<", bb);
 assertCompareTo(b, ">", a);
 assertCompareTo(ab, "==", aa);
 assertCompareTo(bb, "==", ba);
}
void assertCompareTo(WikiPage a, String operator, Wikipage b) {
 if ("==".equals(operator)) {assertTrue(a.compareTo(b) == 0);}
 else if ("!=".equals(operator)) {assertTrue(a.compareTo(b) != 0);}
 else if ("<".equals(operator)) {assertTrue(a.compareTo(b) == -1);}
 else if (">".equals(operator)) {assertTrue(a.compareTo(b) == 1);}
 else fail("Bad operator: " + operator);
}

 この例にかぎらず、専用の(個別のテストクラスに固有の)assertメソッドを定義すること(領域固有アサート)は、テストクラスの設計パターンとして有用なんじゃないかと思います。

*1:

Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)

Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)

Clean Code アジャイルソフトウェア達人の技

Clean Code アジャイルソフトウェア達人の技