J'ai deux fichiers csv A et B. A est le référentiel maître. Je dois lire ces fichiers, mapper les enregistrements de B vers A et enregistrer les enregistrements mappés dans un autre fichier. La classe à détenir des enregistrements est, disons Record. La classe pour stocker les enregistrements correspondants est, disons, RecordMatch.Conception orientée objet
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;
}
Le scénario de cartographie va ainsi: Tout d'abord, contre chaque enregistrement de B, les dossiers de A sont filtrés à l'aide d'État, ville puis code postal. Les enregistrements de A ainsi filtrés sont ensuite comparés avec l'enregistrement de B. Cette comparaison est entre le champ de nom, et est une comparaison de meilleur appariement en utilisant un algorithme de chaîne floue. La meilleure correspondance est sélectionnée et enregistrée.
L'algorithme de correspondance de chaîne donnera un pourcentage de correspondance. Ainsi, le meilleur résultat de tous les matchs doit être sélectionné. Maintenant que j'ai essayé de mon mieux pour expliquer le scénario, j'aborderai le problème de conception. Ma conception initiale était de faire une classe Mapper, qui sera quelque chose comme ci-dessous:
class Mapper
{
List<Record> ReadFromFile(File);
List<Record> FilterData(FilterType);
void Save(List<Record>);
RecordMatch MatchRecord(Record A, Record B);
}
Mais en regardant la conception, il semble simplement être une enveloppe de classe sur certaines méthodes. Je ne vois aucun design OO dedans. J'ai également senti que Match() appartient plus à la classe Record qu'à la classe Mapper.
Mais d'un autre regard, j'ai vu la classe comme implémentant quelque chose ressemblant à un modèle de Repository.
Une autre façon de penser est de garder la classe Mapper, et il suffit de déplacer la méthode match() à la classe Record, quelque chose comme ceci:
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.
}
}
Maintenant, je suis totalement confus dans ce scénario simple. Quel serait idéalement un bon design OO dans ce scénario?
Après avoir affiché cette question, j'ai commencé brainstorming par moi-même que je ne ai pas eu de réponse pendant quelques heures: P je suis venu avec un design tout à fait semblable à la vôtre; vous avez ajouté les pièces manquantes à mes idées. :) –
Oh et moi n'étions pas prêts à bourrer un motif de design dans ça; c'était juste que j'ai vu à tort quelque chose de similaire au modèle de dépôt (lire, trouver/filtrer, enregistrer des opérations, vous voyez) dans la conception. Donc je viens de le mentionner. Mais je vois que c'était en effet quelque chose que je fabriquais; Je vais passer un peu d'argent sur « Gang Of Four » maintenant ;-) –