Il nostro dominio di conoscenza coinvolge le persone che camminano a piedi nudi su una piastra di registrazione della pressione. Eseguiamo il riconoscimento di immagini che si traducono in oggetti della classe "Foot", se un piede umano viene riconosciuto nei dati del sensore.
Esistono diversi calcoli che devono essere eseguiti sui dati del piede.
Ora, quale API sarebbe meglio:
class Foot : public RecognizedObject {
MaxPressureFrame getMaxPressureFrame();
FootAxis getFootAxis();
AnatomicalZones getAnatomicalZones();
// + similar getters for other calculations
// ...
}
O:
class Foot : public RecognizedObject {
virtual CalculationBase getCalculation(QString aName);
// ...
}
Ora, ci sono molti pro e contro che posso inventare, ma non riesco davvero a decidere quali sono i più importanti. Nota, questa è un'applicazione per l'utente finale, non una libreria software che vendiamo.
Qualche consiglio?
Alcuni pro per il primo approccio potrebbero essere:
- BACIO - tutto è molto concreto. L'API, ma anche l'implementazione.
- valori di ritorno fortemente tipizzati.
- ereditare da questa classe è infallibile. Nulla può essere ignorato, solo aggiunto.
- L'API è molto chiusa, non succede nulla, nulla può essere ignorato, quindi meno può andare storto.
Alcuni trucchi:
- Il numero di getter aumenterà, poiché ogni nuovo calcolo che inventiamo viene aggiunto all'elenco
- È più probabile che l'API cambi e, se vengono introdotte modifiche, abbiamo bisogno di una nuova versione dell'API, Foot2.
- in caso di riutilizzo della classe in altri progetti, potrebbe non essere necessario ogni calcolo
Alcuni pro per il secondo approccio:
- più flessibile
- l'api ha meno probabilità di cambiare (supponendo che l'astrazione sia corretta, altrimenti il cambiamento costerà di più)
Alcuni trucchi:
- vagamente digitato. Ha bisogno di lanciare ad ogni chiamata.
- il parametro string - Ho dei cattivi sentimenti a riguardo (ramificazione sui valori delle stringhe ...)
- Non esiste un caso / requisito d'uso attuale che imponga una maggiore flessibilità, ma potrebbe esserci in futuro.
- l'API impone restrizioni: ogni calcolo deve derivare da una classe base. Ottenere un calcolo sarà forzato con questo metodo 1 e passare parametri aggiuntivi sarà impossibile, a meno che non creiamo un modo ancora più dinamico e super-flessibile di passare parametri che aumenta ulteriormente la complessità.
getCalculation()
.
enum
e accenderne i valori. Tuttavia, penso che la seconda opzione sia malvagia, perché si discosta dal KISS.