Interfaces
Es difícil entender el propósito de una herramienta que resuelve un problema que nunca ha tenido. No entendí las interfaces por un tiempo después de que comencé a programar. Entendí lo que hicieron, pero no sabía por qué querrías usar uno.
Aquí está el problema: sabes lo que quieres hacer, pero tienes varias formas de hacerlo, o puedes cambiar la forma en que lo haces más tarde. Sería bueno si pudieras desempeñar el papel del administrador despistado: ladrar algunas órdenes y obtener los resultados que deseas sin preocuparte por cómo se hace.
Digamos que tiene un pequeño sitio web y guarda toda la información de sus usuarios en un archivo csv. No es la solución más sofisticada, pero funciona lo suficientemente bien como para almacenar los detalles de usuario de su madre. Más tarde, su sitio despega y tiene 10.000 usuarios. Tal vez es hora de usar una base de datos adecuada.
Si fue inteligente al principio, lo habría visto venir y no habría realizado las llamadas para guardar directamente en csv. En cambio, pensaría en lo que necesitaba que hiciera, sin importar cómo se implementó. Digamos store()
y retrieve()
. Haces una Persister
interfaz con los métodos abstractos para store()
y retrieve()
y crear una CsvPersister
subclase que realmente implementa estos métodos.
Más tarde, puede crear una DbPersister
que implemente el almacenamiento y la recuperación de datos de manera completamente diferente de cómo lo hizo su clase csv.
Lo mejor es que todo lo que tienes que hacer ahora es cambiar
Persister* prst = new CsvPersister();
a
Persister* prst = new DbPersister();
y luego has terminado. Sus llamadas prst.store()
y prst.retrieve()
todo seguirá funcionando, simplemente se manejan de manera diferente "detrás de escena".
Ahora, aún tenía que crear las implementaciones de cvs y db, por lo que aún no ha experimentado el lujo de ser el jefe. Los beneficios reales son evidentes cuando usas interfaces que alguien más creó. Si otra persona fue tan amable de crear una CsvPersister()
y DbPersister()
ya, entonces sólo hay que escoger uno y llamar a los métodos necesarios. Si decide usar el otro más tarde, o en otro proyecto, ya sabe cómo funciona.
Estoy realmente oxidado en mi C ++, así que solo usaré algunos ejemplos de programación genéricos. Los contenedores son un gran ejemplo de cómo las interfaces le hacen la vida más fácil.
Usted puede tener Array
, LinkedList
, BinaryTree
, etc. todas las subclases de Container
que tiene métodos como insert()
, find()
, delete()
.
Ahora, al agregar algo al medio de una lista vinculada, ni siquiera tiene que saber qué es una lista vinculada. Simplemente llame myLinkedList->insert(4)
y mágicamente iterará a través de la lista y la mantendrá allí. Incluso si sabe cómo funciona una lista vinculada (que realmente debería), no tiene que buscar sus funciones específicas, porque probablemente ya sepa cuáles son al usar una diferente Container
antes.
Clases abstractas
Las clases abstractas son bastante similares a las interfaces (bueno, técnicamente las interfaces son clases abstractas, pero aquí me refiero a las clases base que tienen algunos de sus métodos desarrollados.
Digamos que estás creando un juego y necesitas detectar cuándo los enemigos están a una distancia sorprendente del jugador. Puede crear una clase base Enemy
que tenga un método inRange()
. Aunque hay muchas cosas sobre los enemigos que son diferentes, el método utilizado para verificar su alcance es consistente. Por lo tanto, su Enemy
clase tendrá un método desarrollado para verificar el alcance, pero métodos virtuales puros para otras cosas que no comparten similitudes entre los tipos de enemigos.
Lo bueno de esto es que si arruinas el código de detección de rango o quieres modificarlo, solo tienes que cambiarlo en un solo lugar.
Por supuesto, hay muchas otras razones para las interfaces y las clases base abstractas, pero esas son algunas de las razones por las que podría usarlas.
Singletons
Los uso ocasionalmente y nunca me han quemado. Eso no quiere decir que no arruinarán mi vida en algún momento, según las experiencias de otras personas.
Aquí hay una buena discusión sobre el estado global de algunas personas más experimentadas y cautelosas:
¿Por qué el estado global es tan malvado?