A と B の 2 つの csv ファイルがあります。A はマスター リポジトリです。これらのファイルを読み取り、B のレコードを A にマップし、マップされたレコードを別のファイルに保存する必要があります。レコードを保持するクラスは、たとえば Record です。一致したレコードを保持するクラスは、たとえば RecordMatch です。
class Record
{
string Id;
string Name;
string Address;
string City;
string State;
string Zipcode;
}
class RecordMatch
{
string Aid;
string AName;
string Bid;
string BName;
double NameMatchPercent;
}
マッピング シナリオは次のようになります。まず、B の各レコードに対して、A のレコードが州、都市、郵便番号を使用してフィルター処理されます。このようにフィルタリングされた A のレコードは、次に B のレコードと比較されます。この比較は、名前フィールド間のものであり、ファジー文字列アルゴリズムを使用した最適一致比較です。最適な一致が選択され、保存されます。
文字列マッチング アルゴリズムにより、一致率が示されます。したがって、すべての試合から最高の結果を選択する必要があります。
シナリオを説明するために最善を尽くしたので、設計の問題に移ります。私の最初の設計は、次のような Mapper クラスを作成することでした。
class Mapper
{
List<Record> ReadFromFile(File);
List<Record> FilterData(FilterType);
void Save(List<Record>);
RecordMatch MatchRecord(Record A, Record B);
}
しかし、デザインを見ると、単にいくつかのメソッドに対するクラス ラッパーのように見えます。OO のデザインは見当たりません。また、Match() は Mapper クラスよりも Record クラスに属していると感じました。
しかし、別の見方をすると、このクラスはリポジトリ パターンに似たものを実装しているように見えました。
私が考える別の方法は、Mapper クラスを保持し、Match() メソッドを Record クラスに移動することです。次のようになります。
class Mapper
{
List<Record> ReadFromFile(File);
List<Record> FilterData(FilterType);
void Save(List<Record>);
}
class Record
{
string id;
string name;
string address;
// other fields;
public RecordMatch Match (Record record)
{
// This record will compare the name field with that of the passed Record.
// It will return RecordMatch specifyin the percent of match.
}
}
今、私はこの単純なシナリオで完全に混乱しています。このシナリオで理想的な OO 設計とはどのようなものでしょうか?