interfacce
È difficile capire lo scopo di uno strumento che risolve un problema che non hai mai avuto. Non ho capito le interfacce per un po 'dopo aver iniziato a programmare. Capiremo cosa hanno fatto, ma non sapevo perché avresti voluto usarne uno.
Ecco il problema: sai cosa vuoi fare, ma hai diversi modi per farlo o puoi cambiare il modo in cui lo fai in seguito. Sarebbe bello se potessi interpretare il ruolo del manager privo di sensi: abbaiare alcuni ordini e ottenere i risultati desiderati senza preoccuparsi di come è fatto.
Supponi di avere un piccolo sito Web e di salvare tutte le informazioni dei tuoi utenti in un file CSV. Non è la soluzione più sofisticata, ma funziona abbastanza bene per memorizzare i dettagli dell'utente di tua madre. Successivamente, il tuo sito decolla e hai 10.000 utenti. Forse è il momento di utilizzare un database adeguato.
Se fossi stato intelligente all'inizio, l'avresti visto arrivare e non avrebbe fatto le chiamate per salvare direttamente su CSV. Invece penseresti a cosa ti serviva, indipendentemente da come fosse implementato. Diciamo store()
e retrieve()
. Si crea Persister
un'interfaccia con metodi astratti per store()
e retrieve()
e si crea una CsvPersister
sottoclasse che implementa effettivamente tali metodi.
Successivamente, puoi creare un oggetto DbPersister
che implementa l'archiviazione e il recupero effettivi dei dati in modo completamente diverso da come è stata eseguita la tua classe CSV.
La cosa grandiosa è che tutto ciò che devi fare ora è cambiare
Persister* prst = new CsvPersister();
per
Persister* prst = new DbPersister();
e poi hai finito. Le tue chiamate verso prst.store()
e prst.retrieve()
continueranno a funzionare, sono gestite in modo diverso "dietro le quinte".
Ora, dovevi ancora creare le implementazioni cvs e db, quindi non hai ancora provato il lusso di essere il capo. I vantaggi reali sono evidenti quando si utilizzano interfacce create da qualcun altro. Se qualcun altro è stato così gentile da creare un CsvPersister()
e DbPersister()
già, allora devi solo sceglierne uno e chiamare i metodi necessari. Se decidi di utilizzare l'altro in un secondo momento o in un altro progetto, sai già come funziona.
Sono davvero arrugginito sul mio C ++, quindi userò solo alcuni esempi di programmazione generici. I contenitori sono un ottimo esempio di come le interfacce ti semplificano la vita.
Si possono avere Array
, LinkedList
, BinaryTree
, ecc tutte le sottoclassi di Container
che ha metodi come insert()
, find()
, delete()
.
Ora quando aggiungi qualcosa al centro di un elenco collegato, non devi nemmeno sapere cosa sia un elenco collegato. Basta chiamare myLinkedList->insert(4)
e scorre magicamente l'elenco e lo inserisce. Anche se sai come funziona un elenco collegato (cosa che dovresti davvero), non devi cercare le sue funzioni specifiche, perché probabilmente sai già che cosa derivano dall'utilizzare un altro in Container
precedenza.
Classi astratte
Le classi astratte sono abbastanza simili alle interfacce (anche tecnicamente le interfacce sono classi astratte, ma qui intendo le classi di base che hanno alcuni dei loro metodi perfezionati.
Supponiamo che tu stia creando un gioco e che devi rilevare quando i nemici si trovano a breve distanza dal giocatore. È possibile creare una classe di base Enemy
che ha un metodo inRange()
. Sebbene ci siano molte cose sui nemici che sono diverse, il metodo utilizzato per verificare la loro portata è coerente. Pertanto la tua Enemy
classe avrà un metodo potenziato per controllare il raggio, ma metodi virtuali puri per altre cose che non condividono somiglianze tra i tipi nemici.
La cosa bella di questo è che se sbagli il codice di rilevamento della portata o vuoi modificarlo, devi solo cambiarlo in un posto.
Naturalmente ci sono molte altre ragioni per interfacce e classi base astratte, ma queste sono alcune delle ragioni per cui potresti usarle.
Singletons
Li uso occasionalmente e non sono mai stato bruciato da loro. Questo non vuol dire che a un certo punto non rovineranno la mia vita, sulla base delle esperienze di altre persone.
Ecco una buona discussione sullo stato globale da parte di alcune persone più esperte e diffidenti:
perché lo stato globale è così malvagio?