Da quando ho iniziato a imparare la programmazione orientata agli oggetti, sono stato confuso su come gestire diversi modi di memorizzare dati con diversi livelli di funzionalità ed efficienza. Sono un po 'nuovo a questo quindi probabilmente mi manca qualcosa o mi sto avvicinando a questo sbagliato.
Dire che sto scrivendo un ipotetico programma di editing delle immagini (non lo sono, ma questo è stato l'esempio migliore che ho potuto inventare) e sono preoccupato per le prestazioni - si tratta di file molto grandi. Il programma può gestire le immagini in scala di grigi e a colori ed entrambi sono comunemente usati. Le immagini in scala di grigi sono più efficienti con cui lavorare perché richiedono meno memoria e possono essere manipolate più rapidamente, ma non supportano tutte le operazioni eseguite dalle immagini a colori (come la regolazione della tonalità). Vorrei utilizzare le immagini in scala di grigi quando possibile.
Se sto progettando una classe che rappresenta un'immagine insieme ad alcune utilità utili, dovrei:
- Crea un'interfaccia
Image
con tutti i comandi possibili eColorImage
/GrayscaleImage
implementazioni, e fai in modo cheGrayscaleImage
fallisca quando incontra qualcosa che non può fare? - Crea una singola classe
Image
con più modalità di funzionamento? - Crea
ColorImage
estendi daGrayscaleImage
, perché le immagini a colori aggiungono più funzionalità? - Crea
GrayscaleImage
estendi daColorImage
, perché le immagini in scala di grigi sono un sottoinsieme di immagini a colori? - Crea
ColorImage
wrap aGrayscaleImage
e aggiungi informazioni sul colore ad esso? - Fai qualcos'altro?
Nessuna di queste opzioni mi sembra abbastanza giusta. Il primo e il secondo richiederebbero un sacco di codice duplicato per le funzioni di utilità immagine; il terzo e il quarto non sembrano concettualmente concettuali (un'immagine a colori non è sicuramente un'immagine in scala di grigi, ma le immagini in scala di grigi non estendono la funzionalità delle immagini a colori); e il quinto sarebbe un modo fastidioso per archiviare informazioni sull'immagine perché non sarei in grado di ottenere i valori esatti RGB. E cosa farei se venissi fuori con altri modi di lavorare con le immagini in modo più efficiente, come i colori indicizzati?
In generale, quando ho un modo più efficiente di archiviare e lavorare con i dati, ma questo non supporta tutte le funzionalità, cosa dovrei fare?