Membro e funzioni indipendenti rispetto all'uniformità dell'interfaccia

5

L'articolo 23 di Effective C ++ (terza edizione) di Scott Meyers è intitolato: "Preferisci le funzioni non associate ai non membri alle funzioni dei membri". La ragione per cui Scott suggerisce è l'aumento dell'incapsulamento. Quindi, solo le funzioni che necessitano di accedere ai membri privati sono rese funzioni membro, le altre funzioni sono rese indipendenti.

Ora, l'utente non si preoccupa delle mie considerazioni. Tutto ciò che desidera è un'interfaccia uniforme e semplice da apprendere il più possibile. Avere alcune funzioni come membri e alcuni come free-standing sembra rompere questa uniformità. Inoltre, la scelta di quale funzione è membro e che è indipendente può sembrare casuale per l'utente, che non è a conoscenza dei dettagli dell'implementazione (cioè i membri privati) della mia classe.

Una risposta riporta anche una proposta linguistica relativa a questo problema.

La mia domanda è: è una buona idea fornire sempre una funzione wrapper indipendente per ogni funzione membro al fine di presentare all'utente un'interfaccia uniforme composta solo da funzioni indipendenti?

    
posta AlwaysLearning 17.02.2016 - 15:41
fonte

1 risposta

4

Per rispondere direttamente alla domanda che hai posto, direi che la risposta breve è no: non è necessariamente utile scrivere un wrapper per ogni funzione membro, solo per fornire un'interfaccia uniforme.

Detto questo, può valere la pena farlo se hai qualcosa che corrisponde strettamente a un concetto, definito interamente in termini di funzioni libere e fornendo wrapper a funzioni libere, la tua classe può modellare quel concetto. In questo caso, avere questi wrapper ti permette di usare oggetti di quella classe con qualche set di template che altrimenti non funzionerebbero con loro. La domanda a quel punto è se quei modelli possano essere utili con oggetti di questa particolare classe. Anche se la classe capita di supportare la sintassi necessaria per modellare il concetto, le operazioni fornite da quei modelli potrebbero non essere utili con esso - nel qual caso, è ovviamente piuttosto inutile.

Almeno a mio avviso, fornire wrapper in modo che x.f(y) possa essere chiamato come f(x,y) , solo così il programmatore non deve prestare attenzione se f è una funzione libera o una funzione membro è generalmente fuori luogo. Sì, in un mondo completamente ideale in cui il tempo non era affatto limitato, potrebbe valerne la pena. Allo stesso modo, in un pochi casi una classe potrebbe essere usata in modo così ampio e pesante che vale la pena prendere in considerazione il tempo extra per scrivere il wrapper nella speranza che stia dando i suoi frutti nel lungo periodo facendo diventare tutti gli altri vive più facile.

Sfortunatamente, non penso che nessuno di questi si applichi molto spesso. La maggior parte di noi ha un ingombro troppo ampio di problemi che devono essere risolti seriamente, almeno finché non avremo una prova solida e obiettiva che l'investimento pagherà, e abbastanza presto. Farlo solo per soddisfare un principio senza una solida garanzia di reali benefici sarebbe difficile da giustificare (nel migliore dei casi).

    
risposta data 17.02.2016 - 17:37
fonte

Leggi altre domande sui tag