Nota: Esta pergunta refere-se ao código escrito em Java ou C #.
Estou gerenciando alguns projetos grandes em que descobrimos problemas (não necessariamente bugs) com alguns métodos de terceiros / SDK e criamos nossas próprias extensões que devem ser usadas. Queremos que os desenvolvedores lembrem que o uso desses métodos não é recomendado para este projeto.
Se estivéssemos usando nossas próprias bibliotecas, poderíamos facilmente remover esse método ou marcá-lo como obsoleto / obsoleto, mas não podemos fazê-lo para bibliotecas que não escrevemos.
Como exemplo, usamos uma biblioteca que nos fornece duas sobrecargas:
acme.calculate(int quantity_, double priceInUsDollars_);
acme.calculate(int quantity_, string currencyCode_, double priceInCurrency_);
Queremos que os desenvolvedores sempre usem o primeiro e obtenham o preço em dólares dos nossos próprios sistemas de taxa de câmbio padrão. E seria bom que o IDE (Eclipse / Visual Studio) avise os desenvolvedores quando eles usarem o primeiro. Um aviso do compilador também será suficiente.
No momento, como está, temos que confiar nos revisores de código para detectar esses erros e, como você pode ver, essa não é uma abordagem confiável.
Uma maneira possível de me preparar é escrever minha própria verificação de estilo de cheque ( http://checkstyle.sourceforge.net/writingchecks.html ). Mas eu queria saber se havia algo simples que eu poderia usar. Alguém sabe maneiras de obter um aviso de IDE / compilador do tipo que descrevi?
Soluções que não sejam de IDE / compilador são bem-vindas.
fonte
Respostas:
Usando uma ferramenta como NDepend / JavaDepend , você pode escrever consultas CQL personalizadas para gerar avisos para esses casos muito específicos.
Você disse na pergunta que queria que o IDE / Compiler avisasse os desenvolvedores. Eu acho que porque o NDepend / JDepend se integra estreitamente ao IDE, isso pode resolver seu problema.
fonte
A "abordagem da lista branca": escreva uma biblioteca de wrapper na biblioteca com essencialmente as mesmas assinaturas de interface que a própria lib, mas deixe de fora as funções proibidas. O wrapper deve delegar cada chamada de método na chamada de biblioteca correspondente. Então deixe seus desenvolvedores usarem / vincularem somente a esse wrapper em vez da lib original. O wrapper também pode ser um bom local para as extensões da sua biblioteca.
É claro que isso pode se tornar impraticável se a lib tiver uma API muito grande com várias centenas de funções. Então você deseja implementar uma "abordagem de lista negra" como a solução "estilo de verificação" sugerida.
fonte
Uma das vantagens do Reflection do Java é que você pode alterar as propriedades do método em tempo de execução. Um dos usos é tornar público um método privado, para poder usá-lo de qualquer maneira. Poderia muito bem funcionar ao contrário, com você tornando métodos indesejados privados, em tempo de execução. Embora não seja visto na compilação, será visto assim que o projeto for testado.
Este artigo mostra como modificar propriedades de métodos em tempo de execução. Aqui está a parte interessante:
fonte
Como você já tinha que criar métodos de substituição em alguns casos. Eu criaria uma classe de wrapper para toda a biblioteca e usaria apenas sua classe de wrapper.
Se a biblioteca for atualizada, você precisará atualizar seu código de qualquer maneira. A classe do wrapper é fácil de atualizar.
Isso evita que os desenvolvedores usem o método errado, embora ... ouso dizer que um desenvolvedor deve ser capaz de lembrar quais métodos ele não deve usar.
fonte