Qual opção de design é melhor usar na codificação de um quadro?
-
20-08-2019 - |
Pergunta
Eu estou codificação de um quadro (em Java, mas pergunta é genérico) em que irá fornecer um conjunto de interfaces para os clientes a implementar. As funções no quadro vão depender de como as classes de implementação será constructued, isto é, thay dependem essas implementações para fornecer outras instâncias de interfaces.
Por exemplo, eu poderia ter:
Interface IContribution {
public IMyStuff getMyStuff();
public IHelper getHelper();
}
Interface IMyStuff {
public void doSomeMethod(IHelper helper);
}
Como posso ter certeza de que essas instâncias de IMyStuff e IHelper estão disponíveis?
Um método seria para criar os métodos 'getter' na interface e no meu quadro meticulosamente verificar nulo objetos retornados.
Outra opção seria criar classes abstratas que implementam uma fábrica que as chamadas (usando um padrão de estratégia) os métodos de interface a ser implementado. Mas isso desafia o fato de que eu tenho a interface em primeiro lugar. Os clientes devem, em seguida, usar a classe abstrata. Mas eles poderia contornar isso usando a interface em vez da classe abstrata. Portanto, não deve fornecer a interface mas apenas a classe abstrata ...
Então, quais são as suas ideias sobre isso, o que é uma abordagem pragmática para isso?
Solução
Como posso ter certeza de que essas instâncias de IMyStuff e IHelper estão disponíveis?
Se os clientes são responsáveis ??por implementar as interfaces e classes si, eu diria que é a sua responsabilidade para garantir que essas instâncias estão disponíveis -. Eu não diria respeito a mim mesmo com colocá-lo em meu próprio código
Outras dicas
A fim de construir um bom quadro, você precisa ser simultaneamente construção de uma aplicação em torno dele. Dessa forma, você vai conhecer e compreender a dor seus clientes irão suportar antes que seja imposta sobre eles.
Em outras palavras, começar com: Como meus clientes iria trabalhar com esta aplicação? Como é que eles precisam para trabalhar com ele?
Você vai imediatamente perceber que a maneira mais simples, a partir de sua perspectiva, vai ser melhor.
Você não pode garantir que com Interfaces sozinho, nenhum comportamento lá.
Eu concordo com a filosofia de programação defensiva no Framework, ajuda os desenvolvedores evitar cometer erros.
Você pode fornecer um objeto de fábrica:
public class MyPoliceman {
public IContribution makeContributor( IMyStuff stuffer, IHelper helper)
throws BadAssociatesException {
// check validity of stuffer and helper here, throw exceptions if null
}
}
Em seguida, pelo menos, podemos verificar se há valores nulos etc.
Com alguns pensaram que normalmente é possível dar a desenvolvedores de ajuda. Em alguns casos, o melhor que você pode fazer é para interceptar erros e relatá-los craefully. Por exemplo, aqui, um perfeitamente bem IHelper poderia ser passado para a sua fábrica, mas as ações posteriores sobre a classe poderia torná-lo incapaz. (Ex. Imagem que era um arquivo, e um efeito colateral depois fechou o arquivo.) Então tudo que você pode fazer é prender a condição de erro resultante, gravar um lugar erro e (provavelmente) lançar uma exceção. Então, pelo menos, o desenvolvedor tem uma pista sobre o que consertar.