Eu estou passando por esta série . O autor menciona que, como o estado é mantido na programação orientada a objetos, é mais difícil escrever testes de unidade. Ele também diz que, como a programação funcional não mantém o estado (nem sempre), é mais fácil escrever testes de unidade. Não vi exemplos que demonstrem esse problema. Se isso for verdade, você poderia me fornecer um exemplo comparando o teste de unidade na programação orientada a objetos e funcional?
9
State
mônada (que emula o estado). Você tem parcialmente um ponto - o código escrito nesse estilo tem interações não locais - mas, para fins de teste de unidade, você ainda pode passar explicitamente no estado, não precisa zombar de nada. Por outro lado, com mônadas comoST
eIO
(que possuem um estado mutável verdadeiro e implícito), você simplesmente está fazendo uma programação estável e o teste de unidade não será mais fácil do que em qualquer outro idioma.Respostas:
Eu quero distinguir entre duas maneiras diferentes de abordar a programação orientada a objetos
Uma regra prática é que um objeto programado na primeira maneira terá mais métodos e mais
void
métodos do que na segunda maneira. Digamos que íamos escrever um simulador de vôo e projetar uma classe de avião. Teríamos algo como:Talvez seja um pouco mais extremo do que se possa encontrar, mas é claro. Se você deseja implementar esse tipo de interface, você deve manter dentro do objeto:
A gravação de um teste de unidade para um objeto gravado no modo é extremamente difícil porque:
Basicamente, você começa com uma interface que parece razoável e se encaixa bem no domínio, mas a gentileza da simulação o levou a criar um objeto que é realmente difícil de testar.
No entanto, você pode criar objetos que atendem ao mesmo objetivo. Você gostaria de frear
Plane
em pedaços menores. Tenha umPlaneParticle
que rastreie os bits físicos do avião, a posição, velocidade, aceleração, rotação, guinada, etc., etc., expondo e permitindo manipulá-los. Em seguida, umPlaneParts
objeto pode rastrear o status de. Você poderia enviartick()
para um lugar completamente diferente, digamos, ter umPlanePhysics
objeto parametrizado por, por exemplo, a força da gravidade, que sabe comoPlaneParticle
ePlaneParts
como cuspir um novoPlaneParticle
. Tudo isso pode ser totalmente imutável, embora não seja necessário, por exemplo.Agora você tem essas vantagens em termos de teste:
Aqui está o truque: a segunda abordagem orientada a objetos que descrevi está muito próxima da programação funcional. Talvez em programas funcionais puros, seus registros e suas funções sejam separados e não unidos em objetos, definitivamente um programa funcional garantiria todas essas coisas. O que eu acho que realmente facilita o teste de unidade é
A programação funcional incentiva essas coisas (mas é possível escrever programas ruins em qualquer paradigma), mas elas são alcançáveis em programas orientados a objetos. E enfatizaria ainda que a programação funcional e a programação orientada a objetos não são incompatíveis.
fonte