Progettazione di funzioni o classi nell'API di libreria per il riutilizzo efficiente degli oggetti

0

Attualmente sto costruendo una libreria in C ++ 11, dove ho passato molto tempo cercando di progettare una buona interfaccia. Dopo alcune piccole riprogettazioni lungo la strada, ho finito con un design di cui sono soddisfatto. L'interfaccia pubblica principale consiste solo di due funzioni in un namespace (ignorando le funzioni extra di utilità ecc.).

Più tardi ho scoperto che avevo bisogno di creare degli oggetti basati su un parametro bitflag dato in una delle funzioni. Ci si può aspettare che entrambe le funzioni vengano chiamate molto spesso (ad esempio per elaborare ciascun frame di un video) in cui è improbabile che le bandiere cambino. Quindi, per evitare la creazione di oggetti ripetuti, ho creato una funzione di utilità per riutilizzare quegli oggetti in base al parametro bitflag (una funzione di cache di oggetti semplicistica con un contenitore statico di oggetti shared_ptr al suo interno, se vi state chiedendo). Una classe cache di qualche tipo sarebbe probabilmente migliore, ma sto divagando.

Ora affronto la seguente decisione progettuale: dovrei mantenere le mie funzioni o dovrei ridisegnare la mia libreria attorno a una classe principale, invece?

Mi piace molto la semplicità delle mie due funzioni e creare un'intera classe sembra un ingombro eccessivo e le funzioni hanno più senso per l'interfaccia che sento. La classe principale dovrebbe anche coordinare le chiamate di elaborazione (ad esempio per elaborare i frame dell'immagine), con i getter successivi per recuperare le informazioni.

D'altra parte, una classe renderà il riutilizzo degli oggetti più intuitivo, eliminerà una serie di dichiarazioni di amici di funzioni e rappresenterà meglio le dipendenze tra più chiamate, mentre le funzioni avrebbero una dipendenza comune dal riutilizzo degli oggetti che si sente meno intuitivo in quanto sono funzioni separate, ma può forse funzionare se progettato correttamente dietro le quinte.

    
posta NordCoder 18.10.2015 - 22:14
fonte

1 risposta

0

Nessuno dei due.

Invece, considera di ri-creare nuovamente il codice:

  1. Metti tutto lo stato costoso ma riusabile in una classe.
  2. Prendi questo come argomento per riferimento e ripulisci l'interfaccia per sbarazzarti di qualsiasi cosa tu abbia duplicato.
    (Sia che tu decida di inoltrare un membro alla funzione gratuita, decidi tu.)
  3. Aggiungi una funzione di convenienza che incapsula entrambi i passaggi con la stessa interfaccia e il nome della vecchia funzione doveva preservare la compatibilità API e ABI, magari con un [[deprecated]] -mark se si considera di rimuoverlo in futuro.
risposta data 19.10.2015 - 00:29
fonte

Leggi altre domande sui tag