Diciamo che le librerie A, B e C sono tutte librerie matematiche personalizzate. Possono o non possono usare gli stessi tipi di dati. Le librerie hanno metodi che accettano input di tipo di dati come ProcessAsync(DataTypeA)
o ClusterByFeature(IDataTypeB, Func<IDataTypeB, double>)
.
Queste librerie saranno sviluppate per modularità. Per esempio. I futuri studenti laureati possono venire e utilizzare la biblioteca per i loro bisogni.
Ho pensato che queste librerie dovessero:
- o forniscono implementazioni concrete degli input che accettano e manipolano, come
DataTypeA
,DataTypeB
,DataTypeC
- oppure, chiedi agli utenti di fornire un oggetto di tipo
IDataTypeA
,IDataTypeB
,IDataTypeC
Quale design dovrei scegliere dipende da molti fattori.
Ne ho trovati alcuni:
- Se è solo un contenitore, dovrebbe essere un'interfaccia
- Se
DataTypeA
,DataTypeB
,DataTypeC
sono tutti molto simili, usa le interfacce - lascia che il framework invocante fornisca l'implementazione ereditando tutte le interfacce - Se
DataTypeA
richiede operazioni complicate, usa le classi - Se
DataTypeA
richiede operazioni semplici , utilizza le interfacce e una classeDataTypeAManipulator
Vedo che altre librerie open source utilizzano prevalentemente classi invece di interfacce, quindi penso che le classi dovrebbero essere la strada da percorrere. Ma non c'è spazio per le interfacce dati?
-
Un esempio migliore del problema che ho dovuto affrontare: C'è un oggetto 3D che deve essere manipolato. La libreria A gestisce i vertici, la Libreria B gestisce i vertici e la deformazione delle articolazioni ossee, la Libreria C gestisce i vertici e la mappatura delle trame. 3 diversi oggetti dati: sono in realtà viste differenti di un singolo oggetto dati, ma le librerie non lo dovrebbero / non dovrebbero saperlo! Quindi dovrei usare le interfacce dati per mostrare diverse prospettive di un oggetto 3D, oppure copiare i valori in classi di dati.