Growing Object
Oriented
Software Guided
By Tests.
Introdução
       Uma leve introdução de como testes
podem criar aplicações confiáveis e ainda sim com
design fácil de ser alterado e expandido e o porque
da necessidade de ser escrever o teste antes.
TDD - Presentation

   Testes feitos antes do código em si.

   Confiabilidade e flexibilidade.

Usado especialmente em agile software,
práticas XP e Scrum projects.
TDD - Learning

 Desenvolvimento de software como
 aprendizado.



“Antecipar as alterações não antecipáveis
(To antecipate unantecipated changes)”
TDD - Benefits
   Ideia clara do próximo passo.

Escrever componentes pouco
acoplados.

Detectar erros quando “frescos” na
mente.
TDD - Benefits


   Fazer apenas o necessário.

   Deploy contínuo.

   Lógica separada do design do código
“Never write new functionality
   without a failing test”.
TDD - Refactoring


   Pensar apenas no local da alteração e agir
    somente nesse local.

   Confusão entre conceitos com refactoring
    com redesign.
Qualidade interna e
      externa
Níves de testes
    Acceptance: O sistema está em completo
    funcionamento?

   Integration: O código funciona contra um
    código que não se pode alterar?

   Unit: Nossos objetos fazem a coisa certa?
    Eles estão funcionando?
Ciclo de feedback interno e
           externo

             Write a              Make
  Write a    failing               the
              unit                test
  failing     test                pass
acceptance
   test



                       Refactor
Extenal quality
Amount of feedback




                                          Internal quality
               unit   integration   end-to-end
TDD com objetos


   Diferenciar os papéis, as responsabilidades e
    os colaboradores.

   Algumas técnicas como CRC cards podem
    ser usadas para reprensentar os papéis.
Coupling and cohesion
   Acomplamento

      Alto
          acoplamento: Quando altera-se um
      objetos e há necessidade de alterar outros.

      Baixoacoplamento: Quando altera-se
      objetos e consequentemente, com pouca ou
      sem necessidades de alterar outros.
Coupling and cohesion
   Coesão

       Em OO é quando uma classe tem um
        propósito bem claro e definido.
TDD – web of objects

   Em geral, um objeto deve ter apenas uma
    ligação com o seu “vizinho”.

   Siga as “mensagens”: em Java por
    exemplo, para identificar-se os papéis do
    sistema usa-se o conceito de interfaces.

   Pode-se usar CRC cards para tentar definir
    as funcionalidades de um sistema.
CRC card
                Game Engine
Displays game state   Renderer
Updates game state    Animator


Resolves collisions   Collision Detector
TDD with objects


   Tell, don’t ask.
       Métodos que ao invés de “perguntarem”
        para a classe, simplesmente “dizem” o que
        a classe deve fazer.
Ao invés de usar isso

((EditaSaveCustomizer) master.getModelisable()
   .getDockablePanel()
      .getCustomizer())
       .getSaveItem().setEnabled(Boolean.FALSE));


                    Use isso

master.allowSavingOfCustomisations();
TDD with objects


   But sometimes ask.
       Algumas vezes é necessário perguntar a
        classe o que fazer.
Ao invés de usar isso

public void reserveSeats(ReservationRequest request) {
   for(Carriage carriage : carriages) {
        if (carriage.getSeats().getPercenReserved() <
             this.percentReservedBarrier) {
        ....
   }
}
Use isso

public void reserveSeats(ReservationRequest request) {
   for(Carriage carriage : carriages) {
        if (carriage.hasSeatsAvailableWithin(
             this.percentReservedBarrier)) {
        ....
   }
}
Unit-test and collaborators
TDD - TOOLS


 Junit4
 Jmock2
 Hamcrest Matchers
Conclusão
O livro Growing Object-Oriented Software, Guided
by tests inicialmente mostra uma pequena
introdução sobre como crescer de forma
“incremental” usando testes e as principais
ferramentas do mercado.
Referências
   Livro Growing Object-Oriented Software, Guide By Tests by
    Steve Freeman and Nat Pryce. October 2009.
   All of ilustrations inside this presentation had taken from the
    book above mentioned.

   CRC model from
    http://www.agilemodeling.com/artifacts/crcModel.htm.
   Law of Demeter from
    http://en.wikipedia.org/wiki/Law_of_Demeter.

Growing oos guided_by_tests entire

  • 1.
  • 2.
    Introdução Uma leve introdução de como testes podem criar aplicações confiáveis e ainda sim com design fácil de ser alterado e expandido e o porque da necessidade de ser escrever o teste antes.
  • 3.
    TDD - Presentation  Testes feitos antes do código em si.  Confiabilidade e flexibilidade. Usado especialmente em agile software, práticas XP e Scrum projects.
  • 4.
    TDD - Learning Desenvolvimento de software como aprendizado. “Antecipar as alterações não antecipáveis (To antecipate unantecipated changes)”
  • 5.
    TDD - Benefits  Ideia clara do próximo passo. Escrever componentes pouco acoplados. Detectar erros quando “frescos” na mente.
  • 6.
    TDD - Benefits  Fazer apenas o necessário.  Deploy contínuo.  Lógica separada do design do código
  • 7.
    “Never write newfunctionality without a failing test”.
  • 8.
    TDD - Refactoring  Pensar apenas no local da alteração e agir somente nesse local.  Confusão entre conceitos com refactoring com redesign.
  • 9.
  • 10.
    Níves de testes  Acceptance: O sistema está em completo funcionamento?  Integration: O código funciona contra um código que não se pode alterar?  Unit: Nossos objetos fazem a coisa certa? Eles estão funcionando?
  • 11.
    Ciclo de feedbackinterno e externo Write a Make Write a failing the unit test failing test pass acceptance test Refactor
  • 12.
    Extenal quality Amount offeedback Internal quality unit integration end-to-end
  • 13.
    TDD com objetos  Diferenciar os papéis, as responsabilidades e os colaboradores.  Algumas técnicas como CRC cards podem ser usadas para reprensentar os papéis.
  • 14.
    Coupling and cohesion  Acomplamento  Alto acoplamento: Quando altera-se um objetos e há necessidade de alterar outros.  Baixoacoplamento: Quando altera-se objetos e consequentemente, com pouca ou sem necessidades de alterar outros.
  • 15.
    Coupling and cohesion  Coesão  Em OO é quando uma classe tem um propósito bem claro e definido.
  • 16.
    TDD – webof objects  Em geral, um objeto deve ter apenas uma ligação com o seu “vizinho”.  Siga as “mensagens”: em Java por exemplo, para identificar-se os papéis do sistema usa-se o conceito de interfaces.  Pode-se usar CRC cards para tentar definir as funcionalidades de um sistema.
  • 17.
    CRC card Game Engine Displays game state Renderer Updates game state Animator Resolves collisions Collision Detector
  • 18.
    TDD with objects  Tell, don’t ask.  Métodos que ao invés de “perguntarem” para a classe, simplesmente “dizem” o que a classe deve fazer.
  • 19.
    Ao invés deusar isso ((EditaSaveCustomizer) master.getModelisable() .getDockablePanel() .getCustomizer()) .getSaveItem().setEnabled(Boolean.FALSE)); Use isso master.allowSavingOfCustomisations();
  • 20.
    TDD with objects  But sometimes ask.  Algumas vezes é necessário perguntar a classe o que fazer.
  • 21.
    Ao invés deusar isso public void reserveSeats(ReservationRequest request) { for(Carriage carriage : carriages) { if (carriage.getSeats().getPercenReserved() < this.percentReservedBarrier) { .... } }
  • 22.
    Use isso public voidreserveSeats(ReservationRequest request) { for(Carriage carriage : carriages) { if (carriage.hasSeatsAvailableWithin( this.percentReservedBarrier)) { .... } }
  • 23.
  • 24.
    TDD - TOOLS Junit4  Jmock2  Hamcrest Matchers
  • 25.
    Conclusão O livro GrowingObject-Oriented Software, Guided by tests inicialmente mostra uma pequena introdução sobre como crescer de forma “incremental” usando testes e as principais ferramentas do mercado.
  • 26.
    Referências  Livro Growing Object-Oriented Software, Guide By Tests by Steve Freeman and Nat Pryce. October 2009.  All of ilustrations inside this presentation had taken from the book above mentioned.  CRC model from http://www.agilemodeling.com/artifacts/crcModel.htm.  Law of Demeter from http://en.wikipedia.org/wiki/Law_of_Demeter.