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)