Ecco uno scheletro di una classe che ho costruito che scorre e deduplica i dati - è in C # ma i principi della domanda non sono specifici per la lingua.
public static void DedupeFile(FileContents fc)
{
BuildNameKeys(fc);
SetExactDuplicates(fc);
FuzzyMatching(fc);
}
// algorithm to calculate fuzzy similarity between surname strings
public static bool SurnameMatch(string surname1, string surname2)
// algorithm to calculate fuzzy similarity between forename strings
public static bool ForenameMatch(string forename1, string forename2)
// algorithm to calculate fuzzy similarity between title strings
public static bool TitleMatch(string title1, string title2)
// used by above fn to recognise that "Mr" isn't the same as "Ms" etc
public static bool MrAndMrs(string title1, string title2)
// gives each row a unique key based on name
public static void BuildNameKeys(FileContents fc)
// loops round data to find exact duplicates
public static void SetExactDuplicates(FileContents fc)
// threads looping round file to find fuzzy duplicates
public static void FuzzyMatching(FileContents fc, int maxParallels = 32)
Ora, nell'uso effettivo solo la prima funzione deve effettivamente essere pubblica. Tutto il resto è usato solo all'interno di questa classe e da nessun'altra parte.
Strettamente questo significa che dovrebbero ovviamente essere privati. Tuttavia, li ho lasciati pubblici per facilità di test unitari. Alcune persone senza dubbio mi diranno che dovrei metterle alla prova tramite l'interfaccia pubblica, ma questo è in parte il motivo per cui ho scelto questa classe: è un eccellente esempio di dove quell'approccio diventa imbarazzante. Le funzioni di corrispondenza fuzzy sono ottimi candidati per i test unitari, eppure un test su quella singola funzione "pubblica" sarebbe quasi inutile.
Questo corso non potrà mai essere usato al di fuori di una piccola squadra in questo ufficio, e non credo che la comprensione strutturale impartita rendendo privati gli altri metodi valga la pena di fare i miei test con il codice per accedere al privato metodi direttamente.
Questo approccio "tutto pubblico" è ragionevole per le classi nel software interno? O c'è un approccio migliore?
Sono consapevole che c'è già una domanda su Come si fa prova i metodi privati? , ma questa domanda riguarda la possibilità di scenari in cui valga la pena bypassare quelle tecniche in favore di lasciare semplicemente i metodi pubblici.
MODIFICA: per gli interessati, ho aggiunto il codice completo su CodeReviewSE come ristrutturazione questa classe sembrava un'occasione di apprendimento troppo buona per mancare.