Sto scrivendo una libreria per l'uso nel calcolo scientifico e ho avuto un po 'di imbarazzo. I tipi al lavoro qui sono una classe M
che consiste in circa data
e un riferimento a una classe contenitore C
. Ci sono molte diverse implementazioni di C
e ho dedicato molto lavoro per assicurarmi che gli oggetti M
potessero usare C
oggetti senza conoscere la loro rappresentazione interna.
Un giorno il codice potrebbe essere utilizzato per l'elaborazione scientifica ad alte prestazioni, quindi la velocità è davvero una preoccupazione. Se M
dovesse interrompere l'incapsulamento degli oggetti C
, il codice potrebbe essere eseguito più velocemente. Ho provato questo e infatti potrei ottenere un 50% di accelerazione. Ma ciò implicherebbe un sacco di codice ripetuto e violazione del principio di open-closed.
In alternativa, posso prendere il comportamento che M
deve eseguire e delegarlo a C
. Per impostazione predefinita, C
utilizzerà lo stesso algoritmo di implementazione-agnostico che avevo in precedenza, ma la logica si è appena spostata in centro verso una nuova classe. Il vantaggio di questo approccio è che, se CO
è un'implementazione di C
che può fare sostanzialmente meglio dell'implementazione predefinita, può sovrascrivere quel metodo con la sua versione.
Al momento, esiste solo un metodo che M
dovrà delegare a C
. Posso immaginare al massimo 2 altri comportamenti che dovranno essere trattati in questo modo. Potrebbe esserci un po 'di codice ripetuto, ma potrebbe essere gestito anche con un generatore di codice.
È un approccio comune? Se sì, come si chiama? Se no, è perché è una pessima idea per qualche motivo che non ho notato? Non è proprio il modello strategico; la maggior parte degli oggetti container non si preoccupa nemmeno di implementare la propria strategia, usano l'impostazione predefinita.