Seus testes estão gritando.Você está      ouvindo?TDC 2011 - São Paulo
github.com/lucashungaro
Não é uma “aula”
Uma conversa
Aprendizado    :D
Maturidade da comunidade
Palestras sobre TDD/        BDD
Palestras sobre OOP/        SOLID
Ligação
Acadêmico?
“Java OOP”
MIT 1950/1960     LISP  Sketchpad   ALGOL    Simula   Smalltalk
RubyFunctional DynamicStill OOP
Estático x DinâmicoBurocrático x Prático
OO ainda mais fácil
OO = data + behavior
Prática!
Ouvir os “tiozões”
Kent BeckUncle Bob   etc
Ignorar prima donnas
“... someone who behaves in        demanding, often    temperamental, fashionrevealing an inflated view ofthemselves, their...
Stop the War!
Tosco em uma      linguagemTosco em 20 linguagens
As to methods there may be a millionand then some, but principles are few. The man who grasps principles cansuccessfully s...
Por quê?
Diminuir custos tempo + $$$
Seu temponoites, feriados, finais     de semana
Testes falam
Testes ruins   Código ruimMesmo com 100% de    cobertura
MVC
Fat Models
Free yourself!
Dois princípios    SOLID
Single ResponsibilityDependency Inversion
CoesãoAcoplamento
Baixa coesão:executa parte de uma responsabilidade ou    mais de uma
Alto acoplamento:código preso a um caso        de uso
Interface concisaNarrativa consistente   Componentes   independentes
Single Responsibility      through    Easy reading
Mais de uma razão para        mudar
Contextos ajudam
class User  # relationships # validations # finders  def pay(amount, supplier)    if SomeGateway.process_payment(amount, s...
describe User do  context "persistence logic" do    it "validates ..."  end context "data gathering" do   it "finds record...
Entidades podemassumir “personas”      distintas
1-para-1é desnecessário
class Customer  def initialize(user, supplier)    @user = user    @supplier = supplier  end  def pay(amount)    if SomeGat...
trade-offdescribe User do  context "persistence logic" do    it "validates ..."  end  context "data gathering" do    it "f...
describe Customer do  context "making payments" do    it "register an error in case the key is invalid"   it "writes some ...
nomenclaturaclass PaymentService  def initialize(user, supplier)    @user = user    @supplier = supplier  end  # ...end   ...
Service???Arquitetos certificados  Classes inúteis pra      todo lado
Modele processos de     negócio
Dependency Inversion      throughDependency Injection
DI x DI
def pay(amount, gateway = SomeGateway)  if gateway.process_payment(amount, @user.key)    do_some_logging(:success, amount)...
class SomeGatewayAdapter  def self.process_payment(amount, key)    SomeGateway.process_payment(amount, key)  endendclass S...
it "does something" do  NotMyType.stubs(:some_method).returns(some_value)  # ...endit "does some other thing" do  some_obj...
Mock roles, not objects
Dont mock types you     dont own  Write wrappers
# garantindo a interface com mocksit "respects the gateway protocol" do  gateway = mock("test gateway")  gateway.expects(:...
Superfície de contato
it "does something" do  my_dependency = stub("some dependency")  my_dependency.stubs("a_method")  my_dependency.stubs("ano...
def subject_method(args, dependency = SomeDependency)  dependency.a_method  dependency.another_method  dependency.the_meth...
Tell, don’t askdef subject_method(args, dependency = SomeDependency)  dependency.the_behavior(args)end
Checklist
“Always check code in   better than you   checked it out.”           -- Uncle Bob
Crie o hábito de passar dependências como      parâmetros
Escreva código  declarativo(assertividade)
Reduza ao máximo uso      de estado   compartilhado
Ao “terminar” umcomponente, pergunte:
DRY?
Apenas umaresponsabilidade?
Tudo muda à mesmataxa (velocidade/qtde)?
Depende de coisas que   mudam menos?
http://www.cleancoders.com    http://c2.com/cgi/wiki
Obrigado.
Seus testes estão gritando. Você está ouvindo?
Seus testes estão gritando. Você está ouvindo?
Seus testes estão gritando. Você está ouvindo?
Seus testes estão gritando. Você está ouvindo?
Seus testes estão gritando. Você está ouvindo?
Upcoming SlideShare
Loading in …5
×

Seus testes estão gritando. Você está ouvindo?

1,939 views

Published on

Dicas e técnicas para aplicação de alguns princípios do SOLID através de BDD.

Muito já se falou sobre testes e, aos poucos, fala-se mais sobre OOP e SOLID. Como juntar essas coisas para conseguir benefícios na prática?

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,939
On SlideShare
0
From Embeds
0
Number of Embeds
226
Actions
Shares
0
Downloads
26
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Seus testes estão gritando. Você está ouvindo?

    1. 1. Seus testes estão gritando.Você está ouvindo?TDC 2011 - São Paulo
    2. 2. github.com/lucashungaro
    3. 3. Não é uma “aula”
    4. 4. Uma conversa
    5. 5. Aprendizado :D
    6. 6. Maturidade da comunidade
    7. 7. Palestras sobre TDD/ BDD
    8. 8. Palestras sobre OOP/ SOLID
    9. 9. Ligação
    10. 10. Acadêmico?
    11. 11. “Java OOP”
    12. 12. MIT 1950/1960 LISP Sketchpad ALGOL Simula Smalltalk
    13. 13. RubyFunctional DynamicStill OOP
    14. 14. Estático x DinâmicoBurocrático x Prático
    15. 15. OO ainda mais fácil
    16. 16. OO = data + behavior
    17. 17. Prática!
    18. 18. Ouvir os “tiozões”
    19. 19. Kent BeckUncle Bob etc
    20. 20. Ignorar prima donnas
    21. 21. “... someone who behaves in demanding, often temperamental, fashionrevealing an inflated view ofthemselves, their talent, and their importance”
    22. 22. Stop the War!
    23. 23. Tosco em uma linguagemTosco em 20 linguagens
    24. 24. As to methods there may be a millionand then some, but principles are few. The man who grasps principles cansuccessfully select his own methods.The man who tries methods, ignoring principles, is sure to have trouble. — Ralph Waldo Emerson
    25. 25. Por quê?
    26. 26. Diminuir custos tempo + $$$
    27. 27. Seu temponoites, feriados, finais de semana
    28. 28. Testes falam
    29. 29. Testes ruins Código ruimMesmo com 100% de cobertura
    30. 30. MVC
    31. 31. Fat Models
    32. 32. Free yourself!
    33. 33. Dois princípios SOLID
    34. 34. Single ResponsibilityDependency Inversion
    35. 35. CoesãoAcoplamento
    36. 36. Baixa coesão:executa parte de uma responsabilidade ou mais de uma
    37. 37. Alto acoplamento:código preso a um caso de uso
    38. 38. Interface concisaNarrativa consistente Componentes independentes
    39. 39. Single Responsibility through Easy reading
    40. 40. Mais de uma razão para mudar
    41. 41. Contextos ajudam
    42. 42. class User # relationships # validations # finders def pay(amount, supplier) if SomeGateway.process_payment(amount, self.key) do_some_logging(:success, self, amount, supplier) register_payment_success else do_some_logging(:error, self, amount, supplier) register_payment_error end endend
    43. 43. describe User do context "persistence logic" do it "validates ..." end context "data gathering" do it "finds records under certain conditions ..." end context "making payments" do it "register an error in case the key is invalid" it "writes some info to the log in case of success" # ... endend
    44. 44. Entidades podemassumir “personas” distintas
    45. 45. 1-para-1é desnecessário
    46. 46. class Customer def initialize(user, supplier) @user = user @supplier = supplier end def pay(amount) if SomeGateway.process_payment(amount, @user.key) do_some_logging(:success, amount) register_payment_success else do_some_logging(:error, amount) register_payment_error end endend
    47. 47. trade-offdescribe User do context "persistence logic" do it "validates ..." end context "data gathering" do it "finds records under certain conditions ..." endend cuidado com o “purismo”
    48. 48. describe Customer do context "making payments" do it "register an error in case the key is invalid" it "writes some info to the log in case of success" # ... endend
    49. 49. nomenclaturaclass PaymentService def initialize(user, supplier) @user = user @supplier = supplier end # ...end qual o valor dos patterns?
    50. 50. Service???Arquitetos certificados Classes inúteis pra todo lado
    51. 51. Modele processos de negócio
    52. 52. Dependency Inversion throughDependency Injection
    53. 53. DI x DI
    54. 54. def pay(amount, gateway = SomeGateway) if gateway.process_payment(amount, @user.key) do_some_logging(:success, amount) register_payment_success else do_some_logging(:error, amount) register_payment_error endenddef do_some_logging(status, amount, logger = MyLogger.new) # ...end
    55. 55. class SomeGatewayAdapter def self.process_payment(amount, key) SomeGateway.process_payment(amount, key) endendclass SomeOtherGatewayAdapter def self.process_payment(amount, key) SomeOtherGateway.proc_payment_with_key(amount, key) endenddef pay(amount, gateway = SomeGatewayAdapter) # ...end
    56. 56. it "does something" do NotMyType.stubs(:some_method).returns(some_value) # ...endit "does some other thing" do some_obj = stub("my stub", :some_attr => stub("nested stub", :other_attr => value))end
    57. 57. Mock roles, not objects
    58. 58. Dont mock types you dont own Write wrappers
    59. 59. # garantindo a interface com mocksit "respects the gateway protocol" do gateway = mock("test gateway") gateway.expects(:process_payment).with(amount, key) customer.pay(amount, gateway)end
    60. 60. Superfície de contato
    61. 61. it "does something" do my_dependency = stub("some dependency") my_dependency.stubs("a_method") my_dependency.stubs("another_method") my_dependency.receives("the_method").with(the_args) # ...end
    62. 62. def subject_method(args, dependency = SomeDependency) dependency.a_method dependency.another_method dependency.the_method(args)end
    63. 63. Tell, don’t askdef subject_method(args, dependency = SomeDependency) dependency.the_behavior(args)end
    64. 64. Checklist
    65. 65. “Always check code in better than you checked it out.” -- Uncle Bob
    66. 66. Crie o hábito de passar dependências como parâmetros
    67. 67. Escreva código declarativo(assertividade)
    68. 68. Reduza ao máximo uso de estado compartilhado
    69. 69. Ao “terminar” umcomponente, pergunte:
    70. 70. DRY?
    71. 71. Apenas umaresponsabilidade?
    72. 72. Tudo muda à mesmataxa (velocidade/qtde)?
    73. 73. Depende de coisas que mudam menos?
    74. 74. http://www.cleancoders.com http://c2.com/cgi/wiki
    75. 75. Obrigado.

    ×