У меня есть два CSV-файла A и B. 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);
}
Но, глядя на дизайн, кажется, что это просто оболочка класса над некоторыми методами. Я не вижу в нем никакого ОО-дизайна. Я также чувствовал, что Match() больше принадлежит классу Record, чем классу Mapper.
Но с другой стороны, я увидел, что класс реализует что-то похожее на шаблон репозитория.
Я думаю, что еще один способ - сохранить класс 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.
}
}
Теперь я полностью запутался в этом простом сценарии. Каким в идеале должен быть хороший объектно-ориентированный дизайн в этом сценарии?