Lavorare con metodi più efficienti ma meno funzionali di memorizzazione dei dati

8

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:

  1. Crea un'interfaccia Image con tutti i comandi possibili e ColorImage / GrayscaleImage implementazioni, e fai in modo che GrayscaleImage fallisca quando incontra qualcosa che non può fare?
  2. Crea una singola classe Image con più modalità di funzionamento?
  3. Crea ColorImage estendi da GrayscaleImage , perché le immagini a colori aggiungono più funzionalità?
  4. Crea GrayscaleImage estendi da ColorImage , perché le immagini in scala di grigi sono un sottoinsieme di immagini a colori?
  5. Crea ColorImage wrap a GrayscaleImage e aggiungi informazioni sul colore ad esso?
  6. 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?

    
posta Jacob van't Hoog 17.07.2016 - 23:24
fonte

2 risposte

6

Smetti di preoccuparti dell'efficienza e inizia a preoccuparti di creare una buona astrazione applicabile al dominio e completa le esigenze del cliente / utente / chiamante.

Per fare questo, prima identifichiamo quali sono le funzionalità di client / utente / chiamante. In generale, per una buona astrazione, tutte queste funzionalità devono essere trovate insieme, altrimenti il cliente / utente / chiamante dovrà capire più dell'implementazione di quanto dovrebbero quando cercano di fare la differenza.

Quindi identifica innanzitutto l'insieme di funzionalità che gli utenti devono utilizzare su questo contenuto. Ad esempio, considera la creazione di contenuti, la ricerca, la visualizzazione, la trasformazione (formati, compressione / decompressione, audio / video, ecc.), La collaborazione.

Successivamente, progetta (una o più) interfacce che presentano insieme l'astrazione e forniscono al cliente / utente / chiamante queste funzionalità.

Infine, implementa queste interfacce, utilizzando l'ereditarietà necessaria per riutilizzare o personalizzare implementazione / codice.

Trovo che efficienza e buona astrazione possano spesso essere vissute insieme. Mentre chiedi consigli su come progettare le tue lezioni, sostengo che questa domanda riguarda più la progettazione dell'astrazione giusta piuttosto che l'implementazione efficiente. Molte delle tue alternative toccano uno o più dei miei punti. Spero che tu possa vedere che non tutte le tue alternative si escludono a vicenda.

Se progettate una buona astrazione, sarete in grado di sostituire le implementazioni di diversi meccanismi sottostanti usando la stessa astrazione (ad esempio l'interfaccia (o le interfacce)). Pertanto, puoi sperimentare con efficienza.

    
risposta data 18.07.2016 - 03:32
fonte
2

Una bitmap in scala di grigi può essere colorata bene. Alcuni altri formati di file immagine dovranno essere ricodificati se improvvisamente cessano di essere in scala di grigi. Se l'utente tenta di trasformare la tua immagine in scala di grigi in tono seppia devi decidere se lasciarli o dire loro di no.

Allo stesso modo, dovrai decidere come reagire quando i metodi richiesti non sono validi con il tuo oggetto in un particolare stato. Puoi cambiare stato, lanciare un'eccezione o non fare nulla. Nessuna di queste opzioni richiede di cambiare la tua interfaccia. Quello che cambi è il comportamento che si ottiene quando chiamato.

Onestamente non vedo come si tratti delle prestazioni. Questo stesso problema si presenta con molte strutture di dati. Ad esempio, cosa significa capitalizzare un intero? Mentre lo odio quando le cose falliscono tranquillamente, penso che 1 in maiuscolo sia solo un 1.

    
risposta data 18.07.2016 - 00:16
fonte

Leggi altre domande sui tag