Interfaces
É difícil entender o propósito de uma ferramenta que resolve um problema que você nunca teve. Não entendi as interfaces por um tempo depois que comecei a programar. Vamos entender o que eles fizeram, mas não sabia por que você gostaria de usar um.
Aqui está o problema - você sabe o que deseja fazer, mas possui várias maneiras de fazê-lo ou pode alterar a forma como o faz mais tarde. Seria bom se você pudesse desempenhar o papel de gerente sem noção - latir algumas ordens e obter os resultados desejados sem se preocupar com o que é feito.
Digamos que você tenha um pequeno site e salve todas as informações de seus usuários em um arquivo csv. Não é a solução mais sofisticada, mas funciona bem o suficiente para armazenar os detalhes de usuário de sua mãe. Mais tarde, seu site decola e você tem 10.000 usuários. Talvez seja hora de usar um banco de dados adequado.
Se você fosse esperto no começo, já teria visto isso e não faria as chamadas para salvar diretamente no csv. Em vez disso, você pensaria no que precisava fazer, independentemente de como foi implementado. Vamos dizer store()
e retrieve()
. Você faz uma Persister
interface com os métodos abstratos para store()
e retrieve()
e criar uma CsvPersister
subclasse que realmente implementa esses métodos.
Posteriormente, você pode criar um DbPersister
que implemente o armazenamento e a recuperação reais de dados de maneira completamente diferente de como sua classe csv fez isso.
O melhor é que tudo o que você precisa fazer agora é mudar
Persister* prst = new CsvPersister();
para
Persister* prst = new DbPersister();
e então você está pronto. Suas chamadas prst.store()
e prst.retrieve()
todas continuarão funcionando, elas são tratadas de maneira diferente "nos bastidores".
Agora, você ainda precisava criar as implementações cvs e db, para que ainda não experimentasse o luxo de ser o chefe. Os benefícios reais são aparentes quando você usa interfaces criadas por outras pessoas. Se alguém já teve a gentileza de criar um CsvPersister()
e DbPersister()
já, basta escolher um e chamar os métodos necessários. Se você decidir usar o outro posteriormente, ou em outro projeto, já sabe como ele funciona.
Estou muito enferrujado no meu C ++, então usarei apenas alguns exemplos genéricos de programação. Os contêineres são um ótimo exemplo de como as interfaces facilitam sua vida.
Você pode ter Array
, LinkedList
, BinaryTree
, etc. todas as subclasses de Container
que tem métodos como insert()
, find()
, delete()
.
Agora, ao adicionar algo no meio de uma lista vinculada, você nem precisa saber o que é uma lista vinculada. Você acabou de ligar myLinkedList->insert(4)
e iterativamente magicamente percorre a lista e a coloca lá. Mesmo se você souber como uma lista vinculada funciona (o que você realmente deveria), não precisará procurar suas funções específicas, porque provavelmente já sabe o que elas estão usando usando uma diferente Container
anteriormente.
Classes abstratas
Classes abstratas são bastante semelhantes às interfaces (bem, tecnicamente, as interfaces são classes abstratas, mas aqui quero dizer classes básicas que têm alguns de seus métodos detalhados.
Digamos que você esteja criando um jogo e precisa detectar quando os inimigos estão a uma curta distância do jogador. Você pode criar uma classe base Enemy
que possui um método inRange()
. Embora existam muitas coisas diferentes sobre os inimigos, o método usado para verificar seu alcance é consistente. Portanto, sua Enemy
classe terá um método detalhado para verificar o alcance, mas métodos virtuais puros para outras coisas que não compartilham semelhanças entre os tipos inimigos.
O bom disso é que, se você bagunçar o código de detecção de alcance ou quiser ajustá-lo, precisará alterá-lo em um só lugar.
Obviamente, existem muitos outros motivos para interfaces e classes básicas abstratas, mas esses são alguns dos motivos pelos quais você pode usá-los.
Singletons
Eu os uso ocasionalmente, e nunca fui queimado por eles. Isso não quer dizer que eles não arruinem minha vida em algum momento, com base nas experiências de outras pessoas.
Aqui está uma boa discussão sobre o estado global de algumas pessoas mais experientes e cautelosas:
Por que o Estado Global é tão mau?