CodeKataやってみた記事、第十弾です。
ついに、ほぼ半分です。
今回は、Kata10: Hashes vs. Classes
をやっていきます。
今回はコーディング無し問題です。設計について考える問題となります。
そのため、解説長めです。ご了承ください。
また、訳にあまり自信がないです。
意味が分からない部分は、原文を見ていただきたいです。
概要
ビジネスアプリケーションのプログラミングをJava
やC#
のような言語を用いて行う場合、ビジネスオブジェクトをクラスで構築して使うことに慣れている。
これが常に正しい方法か、もしくは、形式的ではないアプローチが良い場合もあるのか?
問題のイメージ
巨大で複雑なデータベースからの、エクスポート機能作成を求められたとする。
30程度のテーブルから、データを読み込む必要がある。(合計100カラムぐらいのデータを、各レコードで取得する必要があると思われる)
出力データとして、
- データベースの値をそのまま出力するもの
- データベース値を元に計算して出力するもの
- 加えて、特定のフラグが立っている場合のみ、追加でデータベースから値を取得するもの
の三種類がある。
取得データは正確である必要があるが、クライアントは柔軟なソリューションを求めている。
ソリューション1
既存のビジネスオブジェクトと既存の永続性メカニズムを利用して、オブジェクトを集約してエクスポートデータを作る高レベルクラスを作成する。
この高レベルオブジェクトは、計算フィールドを仮想フィールドとして持ち、フラグに応じて追加ビジネスオブジェクトを読み込む。
つまり、ラッパーを作り、そのラッパーでリポジトリやドメインオブジェクトを駆使して、エクスポートデータを作る、というものです。
一行ごとに、ラッパーオブジェクトが作成されると思われます。
ソリューション2
アドホッククエリを使用してハッシュに一度にデータ行に読み込み、フィールド名にハッシュキーを入れる。
必要な計算を行い、ハッシュ内に結果を書き戻す場合に、個別の方法で作成できる。
フラグがセットされていたら、追加データをデータベースから取得でき、再びハッシュに追加できる。
ハッシュのコンテンツは、エクスポートレコードを書き込むのに使用され、ループで順次処理していく。
各行で、Dictionary
のような、カラム名をキーとしたハッシュを作り、値をそれぞれ格納します。
それを各行に応じて作ります。
C#
でいうなら、List<Dictionary<string, object>>
みたいな定義になると思われます。
Kataについて
これは考える実験。トップ3の利点とトップ3の欠点を、それぞれのアプローチで考える。
ビジネスアプリケーションで、データ保持をクラスで行っていたとしたら、ハッシュに切り替えた場合のインパクトはどのくらいあるか。その反対の場合も。
この問題は、静的、動的タイピングの議論に関連する?
これが、今回のKata
の概要です。
ソフトウェア設計者を目指している方や、練習したいと思っている方は、ぜひ自分の力で考えてみていただきたいです。
きっと、私の考えとはまた違うものが出てきて、それについて議論すると面白いのだろうと思っています。
以下、私なりの考えを書いていきます。
いつものように、続きは一応隠します。(直接見ると隠れません)
続きを読む