TIM Labs

2011年6月アーカイブ

「Java SE 7 ってなんじゃらほい?」ということで、社内の勉強会で発表しました。

込み入ったことは省いて普通のプログラマがまず触るところ(文法とIO)を説明しています。
まだJava SE 7の正式リリース前ですが、Java SE 8が待ち遠しいですね!

問題

バグフィックスなりリファクタリングなり何かをするため、 コード中の複数のブロックのインデントを変更するということは少なくありません。

例えば以下のようなコードがあるとしましょう:

private void UpdateData()
{
    var db = GetDatabaseConnection();

    data1.UpdateSomething();
    data2.UpdateSomething();
    data3.UpdateSomething();

    data1.Save(db);
    data2.Save(db);
    data3.Save(db);
}

このコードは一連のデータを更新してデータベースに保存しています。 しかしこの手の更新はデータの一貫性を保証するためにトランザクション内で実行されなければなりません。 という訳でこのコードは以下のように修正されるべきです:

private void UpdateData()
{
    var db = GetDatabaseConnection();

    db.BeginTransaction();
    try
    {
        data1.UpdateSomething();
        data2.UpdateSomething();
        data3.UpdateSomething();

        data1.Save(db);
        data2.Save(db);
        data3.Save(db);

        db.Transaction.Commit();
    }
    catch
    {
        db.Transaction.Rollback();
    }
    finally
    {
        db.EndTransaction();
    }
}

さて、コミットする前に git diff を実行して変更点をレビューすることにしましょう。 ところが残念なことに以下のような結果が得られます:

diff --git a/t.cs b/t.cs
index e4e18dd..53a3b56 100644
--- a/t.cs
+++ b/t.cs
@@ -2,11 +2,26 @@ private void UpdateData()
 {
     var db = GetDatabaseConnection();

-    data1.UpdateSomething();
-    data2.UpdateSomething();
-    data3.UpdateSomething();
+    db.BeginTransaction();
+    try
+    {
+        data1.UpdateSomething();
+        data2.UpdateSomething();
+        data3.UpdateSomething();

-    data1.Save(db);
-    data2.Save(db);
-    data3.Save(db);
+        data1.Save(db);
+        data2.Save(db);
+        data3.Save(db);
+
+        db.Transaction.Commit();
+    }
+    catch
+    {
+        db.Transaction.Rollback();
+        throw;
+    }
+    finally
+    {
+        db.EndTransaction();
+    }
 }

なんということでしょう。 git diff は正しく動作しているものの、 これでは本質的な変更点が何なのか全く分かりません! ここでは一連の更新処理をトランザクションで括り、 さらに元々あった更新処理のインデントを調整しました。 本質的な変更的は前者であって後者ではありません。 しかしこの出力からは本質的な変更点を識別することは困難です。

問題

美しいプログラムを書く(脱添字職人編) では添字が多用され読み難くなっているソースコードのリファクタリングを通して 美しいプログラムを書くためのポイントをいくつか紹介しました。 そこでは

  • 「何をするか」を基準にプログラムを書きましょう。 「どうやるか」が前面に出たプログラムは意図を把握し難くなります。
  • 添字や明示的なループの使用は避けましょう。「どうやるか」が前面に出てきてしまいます。 今時のプログラミング言語ならば便利な構文やライブラリ関数があるので、 添字やループを使わずとも「何をするか」を基準にプログラムが書き易くなっています。

ということを述べました。

確かにごもっともな主張ではありますが、経験値の少ない人からすれば 「そんなことを言われてもどんなライブラリ関数があってどういう場面で使えるのかリファレンスを読んでもよく分からないし......」 ということはよくあります。

という訳で、簡単な例題を通して、 ライブラリ関数を適切に使えばプログラムを簡潔かつ明瞭にできることを実際に体験していきましょう。 どのようなプログラミング言語やアプリケーションの作成でも 「ちょっとした数のデータを相手に何か処理を行う」(=リスト処理を行う) 機会は頻繁にありますので、今回はリスト処理ライブラリを使うことにします。

このアーカイブについて

このページには、2011年6月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2011年5月です。

次のアーカイブは2011年7月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。