ホットスポットを実装する

[リーダブルコード]コメント:ライターズブロックを乗り越える

これがJavaであれば、私ならテンプレートメソッドパターンで局所化しプログラム完了の遅延を図る。

テンプレートメソッドパターンではフックメソッドの実装を下位クラスに委ねる。

このパターンは処理の一部がホットスポットである場合によく用いられる。ホットスポットとは仕様変更が入りやすい、或は仕様が曖昧な箇所のことである。

例えば、CSVファイルを取り込みDBにロードしたいがCSVファイルのデータを配列に変換するにはどうすれば良いかが分からない、という状況で使う。

CSV形式ではデータがカンマを含む場合、ダブルクオテーションでくくるというルールがある。しかしこれはカンマがあるデータだけというルールではないため複雑なプログラムとなる。APIもなしにこれを実装するのは大変である。

そこで「データ値にはカンマもダブルクオテーションも入らない」という前提でとりあえず実装する。

まずホットスポットである「CSVファイルを配列に変換する処理」をフックメソッドとして局所化する。コメントには「CSVファイルの各データを配列として返す」と記する。ただしこのメソッドは中身のない空メソッドもしくは抽象メソッドである。

次に子クラスにてフックメソッドを実装する。このコメントには「CSVファイルの各データを配列として返す(ただし各データ値にはカンマは含まれないものとする)」と記し、その通りの実装を行う。こうすることでデータ値にカンマ入るという仕様にも対応し易くなる。

例を示す。

abstract class Helper {

  /** CSVファイルの各データを配列として返す/*

  abstract String getCsvData(File file);

}

class HelperImpl extends Helper{

  /** CSVファイルの各データを配列として返す(ただし各データ値にはカンマは含まれないものとする)/*

  String getCscData(File file){ ... }

}

<component name="Helper" class="HelperImpl"/>

 これはCSVにはカンマが入らない」前提のプログラムであるが「やはりCSVにはカンマが入ることになりそうだ」と云われても簡単に対応することができる。具体的には以下のクラスを定義しdiconファイルを修正する。

class HelperImpl2 extends Helper{

  /** CSVファイルの各データを配列として返す/*

  String getCscData(File file){ ... }

}

<component name="Helper" class="HelperImpl2"/>