-
Notifications
You must be signed in to change notification settings - Fork 0
/
clean-arch-morreu.srt
2893 lines (2291 loc) · 112 KB
/
clean-arch-morreu.srt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1
00:00:00,462 --> 00:00:12,602
[Alexandre Aquiles] Mas é... Então vamos lá pessoal. Meu nome é Alexandre Aquiles.
Eu não vou falar onde eu trabalho, acho que vocês devem saber, né?
2
00:00:12,702 --> 00:00:26,122
[Alexandre Aquiles] Porque aqui o negócio é entre a gente mesmo, né?
Tipo... Então é... papo nosso aqui mesmo. E aí... Eu lancei um livro recentemente, né?
3
00:00:26,222 --> 00:00:39,394
[Alexandre Aquiles] Desbravando SOLID. Deixa eu fazer o jabá já, né?
Desbravando SOLID. E aí eu fiz esse livro. E, no capítulo final, assim né...
4
00:00:39,494 --> 00:00:53,074
[Alexandre Aquiles] Eu chego numa Arquitetura Hexagonal. Pelo menos eu acho que eu chego. Então vamos ver se
eu cheguei mesmo hoje. Pode ser uma pauta. Mas aí... Aí eu postei lá
5
00:00:53,174 --> 00:01:10,386
[Alexandre Aquiles] no twitter referenciando um Hipsters que
o Linhares e a Roberta Arcoverde e o Otávio Lemos e o Vinícius Dias e o Rodrigo Ferreira
6
00:01:10,486 --> 00:01:26,726
[Alexandre Aquiles] e o Paulo da Caelum, da Alura, eles estavam discutindo sobre Clean Architecture e aí repercutiu.
Então vários comentários, várias threads diferentes e tal.
7
00:01:26,894 --> 00:01:41,354
[Alexandre Aquiles] Então é sobre isso que a gente vai falar. E aí eu coloquei um título meio marqueteiro, né?
"Clean Arch morreu?" Até estava falando com o Aniche e com o Linhares,
8
00:01:41,454 --> 00:01:51,134
[Alexandre Aquiles] que tipo, é para fazer uma referência àquele papo lá do
"Is TDD Dead", né? Que teve entre o cara do Rails e o Kent Beck.
9
00:01:51,234 --> 00:01:56,938
[Alexandre Aquiles] Então é uma brincadeira, na verdade, né, pessoal?
Então, se a gente quiser falar assim, "Clean Arch morreu?"
10
00:01:57,038 --> 00:02:06,218
[Alexandre Aquiles] vamos falar que não e aí a gente pode fechar aqui.
Mas a brincadeira é a gente discutir um pouco sobre isso e tal.
11
00:02:06,318 --> 00:02:20,518
[Alexandre Aquiles] E aí eu queria que os oradores... Aí, eu vou chamando...
Eu queria que vocês falassem o nome e... define em uma frase assim, sabe?
12
00:02:21,178 --> 00:02:29,874
[Alexandre Aquiles] O que é Clean Architecture?
Então eu vou começar aí com o Linhares. Vamos lá, Linhares. Manda brasa aí.
13
00:02:33,134 --> 00:02:48,234
[Mauricio Linhares] Já, já tá querendo a confusão.
Dessa vez eu vou roubar o que eu achei, o comentário que mais representa o que eu senti lendo
14
00:02:48,334 --> 00:03:02,858
[Mauricio Linhares] o livro. É o comentário que o Aniche fez no Twitter, que é conteúdo requentado.
Pegou o conteúdo que ele tinha dos outros livros, requentou, mudou de nome e
15
00:03:02,958 --> 00:03:14,058
[Mauricio Linhares] botou lá, né? Eu ainda fiquei sem entender o que efetivamente é a tal da Clean Architecture
que parece com tudo que a gente já viu antes, só que com coisas com nomes diferentes.
16
00:03:14,158 --> 00:03:15,344
[Mauricio Linhares] Então eu tô meio confuso ainda.
17
00:03:15,444 --> 00:03:27,958
[Alexandre Aquiles] Boa. Vou na ordem aqui que tá aparecendo pra mim. Então, ô Branas, se apresenta aí pra galera e, tipo, "o que é Clean Architecture" em uma frase.
18
00:03:27,958 --> 00:03:35,659
[Rodrigo Branas] Ah, beleza cara. Bom, eu sou só mais um apaixonado por programação que tem um canal no YouTube e,
19
00:03:35,659 --> 00:03:42,970
[Rodrigo Branas] pra mim, eu concordo bastante com o que o Mauricio [Linhares] comentou, é um conteúdo sim um pouco, é uma mescla de
20
00:03:42,970 --> 00:03:55,370
[Rodrigo Branas] óbvio, superficial e requentado. Mas, de certa forma, faz bastante sentido até a fronteira
com a camada de domínio que a gente vai discutir aqui hoje, então pra mim ele é um pouco
21
00:03:55,370 --> 00:04:06,382
[Rodrigo Branas] um clone do Ports & Adapters e uma pitada de DDD.
Mas por isso que eu acho ele superficial, mas depois eu entro um pouco mais nos detalhes.
22
00:04:06,382 --> 00:04:21,062
[Alexandre Aquiles] Certo, beleza. Aniche, você se apresenta e coloca uma definição sucinta assim.
Eu sei que essas coisas não são para acadêmicos, mas vai lá.
23
00:04:24,430 --> 00:04:32,690
[Mauricio Aniche] E aí, gente? Meu nome é Maurício. E definir Clean Architecture em uma frase é difícil, hein?
Mas acho que o que ele tentou naquele livro é mostrar
24
00:04:32,690 --> 00:04:40,490
[Mauricio Aniche] como tentar criar aplicações que vão sobreviver ao tempo, né?
Que sejam fáceis de mudar, fáceis de evoluir, fáceis de testar.
25
00:04:40,490 --> 00:04:46,030
[Mauricio Aniche] Se ele conseguiu isso no livro, é uma coisa que a gente vai discutir, né?
Mas acho que a ideia da Clean Architecture é essa.
26
00:04:46,030 --> 00:04:56,494
[Alexandre Aquiles] Certo. E o próximo que está aparecendo aqui, entrou aqui, é o Ponte.
Ô Ponte, você nem sabe o que está acontecendo agora, né?
27
00:04:58,134 --> 00:05:05,214
[Rafael Ponte] Eu cheguei e peguei o bonde andando aqui, ouvi o comecinho, mas...
Não vou me repetir muito, né? Meu nome é Rafael Ponte, aqui.
28
00:05:05,614 --> 00:05:11,694
[Rafael Ponte] Conhecido como Marajá dos Legados, então vim defender os legados.
Embora as pessoas não gostem, mas...
29
00:05:12,814 --> 00:05:20,946
[Rafael Ponte] Uma definição rápida de Clean Arch, dado o meu pouco conhecimento, né?
Até o que eu estudo é: um excesso de camadas e de indireção
30
00:05:21,038 --> 00:05:27,798
[Rafael Ponte] para blindar meia dúzia de classes. Pronto, é assim que eu enxergo na maioria dos projetos que eu tenho visto.
31
00:05:27,798 --> 00:05:34,798
[Alexandre Aquiles] Caramba. Essa foi contundente. Eu senti uma mágoa aí.
32
00:05:34,798 --> 00:05:52,190
[Alexandre Aquiles] Mas... Ô Otávio. Otávio Lemos, beleza? Então, diga aí, se apresente e fale aí a sua definição.
Ah, eu esqueci de falar assim, tipo, façam seu jabás aí também.
33
00:05:54,158 --> 00:06:04,098
[Otávio Lemos] Bom pessoal, meu nome é Otávio Lemos, eu sou professor universitário, sou professor da Universidade Federal de São Paulo há 13 anos.
34
00:06:04,158 --> 00:06:14,198
[Otávio Lemos] E há 3 anos eu comecei um canal no YouTube, mais ou menos na mesma linha do Branas, falando sobre desenvolvimento de software, engenharia de software.
35
00:06:14,198 --> 00:06:21,686
[Otávio Lemos] E nessa mesma época que eu conheci essas ideias aí do Bob Martin.
36
00:06:21,686 --> 00:06:29,150
[Otávio Lemos] Bom, pra mim é, de fato, me parece um... Ele mesmo fala isso, né? Que é um conjunto de ideias
37
00:06:29,150 --> 00:06:41,150
[Otávio Lemos] que foram se desenvolvendo sobre arquitetura de software no sentido de organização de código
e não de arquitetura de solução ou infra, né? Mais no sentido de design mesmo.
38
00:06:41,150 --> 00:06:55,366
[Otávio Lemos] Mas é um conjunto de ideias antigas, se a gente for ver, porque aparece lá no...
Ele fala do Ivar Jacobson lá, que é aquele desenvolvimento de software guiado por casos de uso.
39
00:06:55,966 --> 00:07:03,046
[Otávio Lemos] E depois tem outras abordagens como Ports & Adapters
ou Arquitetura Hexagonal do Alistair Cockburn.
40
00:07:03,526 --> 00:07:14,926
[Otávio Lemos] Então, assim, é um punhado de ideias. E me parece que o objetivo é esse.
Você ter uma arquitetura na qual você promove
41
00:07:15,526 --> 00:07:26,542
[Otávio Lemos] as suas regras de negócio e tenta desacoplá-las
de outros interesses do sistema. Claro que você pode abusar disso, qualquer tecnologia, qualquer abordagem você pode
42
00:07:26,542 --> 00:07:32,609
[Otávio Lemos] abusar e em vez de ser um benefício, ser uma coisa que vai te atrapalhar.
43
00:07:32,609 --> 00:07:43,142
[Alexandre Aquiles] Certo, eu vou chamar a Roberta. Ela participou do podcast, do famoso podcast aí.
44
00:07:43,142 --> 00:07:51,718
[Alexandre Aquiles] Então Roberta, vou convidar você aqui. Te coloquei aqui numa fria, numa enrascada hein.
45
00:07:51,718 --> 00:07:57,132
[Alexandre Aquiles] Mas eu tinha falado com a Roberta já, deixa eu ver aqui ó, convidar para falar. Ah, apareceu aqui.
46
00:07:57,132 --> 00:08:09,534
[Roberta Arcoverde] Pois é, Clean Arch pra mim, de acordo também com o que o Otávio falou,
me parece uma parada que nem é Clean nem é Arch, né?
47
00:08:09,534 --> 00:08:23,966
[Roberta Arcoverde] É design e não é Clean no sentido de não ser simples, né?
No sentido de adicionar um pouco de complexidade para tentar definir abstrações e isolar interesses
48
00:08:23,966 --> 00:08:37,366
[Roberta Arcoverde] que, na minha opinião, sempre que se tenta isolar, o trade-off é que você abre mão
de coisas mais sofisticadas que você poderia estar utilizando e que informam o design do
49
00:08:37,366 --> 00:08:49,458
[Roberta Arcoverde] sistema. E abrir mão dessas coisas deliberadamente em nome de uma suposta flexibilidade para
a estrutura mude no futuro, para mim, soa um pouco inocente.
50
00:08:49,458 --> 00:09:00,494
[Roberta Arcoverde] Então, talvez seja a melhor forma que eu encontraria de definir por tudo que eu li e que a gente tem discutido nesses dias.
51
00:09:01,294 --> 00:09:10,794
[Alexandre Aquiles] Beleza. Então só pra colocar uns termos que foram aparecendo aí.
Tipo, tem muito essa coisa de ser algo antigo, né?
52
00:09:10,794 --> 00:09:22,274
[Alexandre Aquiles] Eu lembro de fazer diagrama UML, aí tinha o diagrama de robustez,
que tinha lá o Entidade, Controller e Boundary, né? O ECB.
53
00:09:22,274 --> 00:09:31,942
[Alexandre Aquiles] E, tipo, tá lá, o Otávio até falou aí do tal do Ivar Jacobson e era isso, né?
Tipo, vem lá do UML, inclusive eu acho que antes de existir o UML na verdade.
54
00:09:31,942 --> 00:09:54,142
[Alexandre Aquiles] Aí tem essa coisa de... Eu acho que a Roberta falou, o Ponte falou que talvez...
Muitas abstrações, muitas indireções. E eu acho que é isso que a Roberta falou, visa flexibilidade.
55
00:09:54,142 --> 00:10:06,354
[Alexandre Aquiles] Tanto o Otávio como a Roberta falaram aí de design.
Então talvez o nome arquitetura seja estranho, então arquitetura limpa, talvez seja um design limpo.
56
00:10:06,354 --> 00:10:22,934
[Alexandre Aquiles] E aí eu tava vendo aqui, tipo, tava lembrando, né, até coloquei um tweet lá de 2017 que eu tava bem radical, digamos.
E aí eu lembro que eu e o Rodrigo [Ferreira], a gente tava querendo estudar sobre arquitetura.
57
00:10:22,934 --> 00:10:34,398
[Alexandre Aquiles] E aí tinham 3 livros que estavam sendo...
lançados. Um era o "Building Evolutionary Architectures", lá em 2017.
58
00:10:34,398 --> 00:10:42,238
[Alexandre Aquiles] Que era da ThoughtWorks, que o Aniche chegou a mencionar [nas threads],
assim, tem um negócio de fitness function e tal.
59
00:10:42,238 --> 00:10:54,798
[Alexandre Aquiles] Eu não li, para falar a verdade. Aí tinha um que era o "Design It", que é bem sobre arquitetura,
sobre trade-offs, estilos arquiteturais e tal, que era da Pragmatic Programmer.
60
00:10:54,798 --> 00:11:08,490
[Alexandre Aquiles] Só que ele não tinha arquitetura no nome. E tinha o "Clean Architecture" que era sobre design mas tinha arquitetura no nome.
E foi o que eu escolhi ler. E aí...
61
00:11:08,490 --> 00:11:12,400
[Mauricio Linhares] Você pulou os dois melhores e pegou o pior.
62
00:11:12,400 --> 00:11:14,950
[Alexandre Aquiles] Tipo isso.
63
00:11:14,950 --> 00:11:25,630
[Alexandre Aquiles] Mas aí eu fui tentar aplicar em um freela. Eu e um camarada de Android assim.
A gente estava querendo reaproveitar o modelo.
64
00:11:27,278 --> 00:11:42,078
[Alexandre Aquiles] Foi um desastre nesse caso específico. Porque eu acho que o modelo é diferente
de uma aplicação Android e da API, que é o que eu estava fazendo.
65
00:11:42,798 --> 00:11:52,998
[Alexandre Aquiles] E assim, eu não sofri muito porque o negócio não foi para frente.
Mas eu acho que eu teria sofrido. Aí, pessoal, o que eu queria
66
00:11:53,238 --> 00:12:04,734
[Alexandre Aquiles] é fazer uma brincadeira aqui... Ô Linhares, você leu o livro, né? Vamos falar um pouco sobre o livro em si.
Só que eu quero, foi o Allan Silva que, eu não sei se ele está aqui,
67
00:12:04,734 --> 00:12:13,934
[Alexandre Aquiles] mas o Allan Silva que ele deu a ideia assim de,
o Linhares falar que ele achou de bom no livro.
68
00:12:13,934 --> 00:12:17,394
[Alexandre Aquiles] Então, destaque aí, Linhares, o que você achou de bom no livro.
69
00:12:21,326 --> 00:12:23,621
[Mauricio Linhares] Bicho, aí é difícil.
70
00:12:23,621 --> 00:12:27,599
[Alexandre Aquiles] Dá uma forçada aí. Pensa um pouquinho.
71
00:12:27,599 --> 00:12:39,326
[Mauricio Linhares] Ai, ai. É porque, é porque... Esse livro me levou para muitos momentos traumáticos do passado.
72
00:12:39,326 --> 00:12:50,098
[Mauricio Linhares] Porque muito do que está sendo discutido, das coisas que estão sendo faladas,
são coisas que a gente queria matar ali no meio dos anos 2000, no Java.
73
00:12:50,318 --> 00:13:05,318
[Mauricio Linhares] Você pega o livro do Rod Johnson, que foi o livro que deu nascimento ao Spring,
tem muito essa discussão de como era complicado você criar separação porque a gente tinha toda essa coisa de
74
00:13:05,318 --> 00:13:18,318
[Mauricio Linhares] tudo tem um lugar, tem o Session Bean, tem o Entity Bean, tem um monte de Java Beans, EJB, essa porra toda.
E ele vem com essas ideias. Nesse livro, acho que esse é o livro do Rod Johnson.
75
00:13:19,086 --> 00:13:25,926
[Mauricio Linhares] Ele tem muitas das ideias que a gente vê aqui
de você criar essa separação, de você não deixar o framework ficar dentro da sua aplicação,
76
00:13:25,926 --> 00:13:32,186
[Mauricio Linhares] porque a gente sofria muito para escrever aplicações
e testar aplicações por causa do peso que o framework
77
00:13:32,186 --> 00:13:40,386
[Mauricio Linhares] e as coisas do Java tinham em cima da sua plataforma.
E daí surge o Spring, e daí surge o jeito que a gente está escrevendo
78
00:13:40,386 --> 00:13:56,478
[Mauricio Linhares] aplicações Enterprise em Java modernas. E eu acho que essa coisa de você separar...
é importante, né? Eu acho que isso, nisso ele acerta no livro que você realmente precisa separar
79
00:13:56,478 --> 00:14:10,558
[Mauricio Linhares] essas coisas. Isso é uma coisa que a gente vem fazendo, assim, desde o primeiro livro de
modelagem e design orientado a objetos que eu lembro de ter lido, que eu acho que é o de UML do
80
00:14:10,558 --> 00:14:24,770
[Mauricio Linhares] Grady Booch, né? Que era um dos livros que eram recomendados pra gente na época da faculdade.
E era isso... E isso era uma recomendação, né? Que você não quer que essas coisas elas entrem dentro do seu código, né?
81
00:14:24,770 --> 00:14:35,530
[Mauricio Linhares] Mas você não vai fazer isso de uma forma radical, né?
Como lá no teu tweet que eu coloco, ah, não quero nem botar as anotações no meu objeto.
82
00:14:35,530 --> 00:14:47,570
[Mauricio Linhares] Aí você tá indo longe demais no negócio, né?
Porque a grande preocupação que a gente tinha na época não era de você ter referência ao framework, né?
83
00:14:47,982 --> 00:15:00,882
[Mauricio Linhares] era como é que eu consigo testar e usar e fazer operações em cima dessas soluções
localmente na minha máquina, fazer teste unitário, fazer TDD,
84
00:15:00,882 --> 00:15:10,522
[Mauricio Linhares] você conseguir fazer o design da sua aplicação através dos testes,
e eu acho que essa eu vou dizer que é uma das poucas coisas que eu acho que são legais,
85
00:15:10,522 --> 00:15:19,346
[Mauricio Linhares] mas o foda é porque ele é mais radical do que o seu tweet.
E é difícil de você separar essas coisas no livro.
86
00:15:19,346 --> 00:15:30,606
[Mauricio Linhares] Eu tive muita dificuldade de pegar essas coisas e...
Ah, porra, isso aqui é importante. É muito importante a gente não deixar essas coisas vazarem para dentro de camadas
87
00:15:30,606 --> 00:15:39,066
[Mauricio Linhares] para onde elas não deveriam ter vazado. Você tem que tentar separar essas coisas.
Eu acho que isso é uma mensagem que é importante,
88
00:15:39,066 --> 00:15:45,146
[Mauricio Linhares] que é uma coisa que a gente repete em modelagem orientada ao objeto já,
provavelmente desde que existe modelagem...
89
00:15:46,062 --> 00:15:48,506
[Mauricio Linhares] orientada a objetos.
90
00:15:48,506 --> 00:15:55,982
[Mauricio Aniche] Mas olha como vai de experiência para experiência, né?
91
00:15:55,982 --> 00:16:02,582
[Mauricio Aniche] Então, o meu primeiro contato com o trabalho dele foi naquele "Agile Principles, Practices and Patterns", alguma coisa assim, né?
92
00:16:02,902 --> 00:16:11,342
[Mauricio Aniche] Foi antes do Clean Code, aliás. E eu vim... Eu estava vindo de 3 projetos na sequência.
Um deles, o primeiro, onde era uma loja virtual que a galera customizou,
93
00:16:11,342 --> 00:16:20,014
[Mauricio Aniche] a loja virtual aberta em ASP da Locaweb. quem lembra disso aqui, né? E eram aqueles arquivos ASP de 5 mil linhas, e tudo acontecia
ali.
94
00:16:20,014 --> 00:16:23,502
[Mauricio Aniche] Aí eu pulei para um projeto na Sony, onde era o projeto que controlava a venda
95
00:16:23,502 --> 00:16:28,030
[Mauricio Aniche] de DVDs da Sony, era tudo em JSP, e tudo na JSP.
96
00:16:28,030 --> 00:16:35,262
[Mauricio Aniche] Aí eu fui trabalhar na Verifone, programar em C, tudo num arquivo C completo.
E aí, para mim, não fazia sentido, não é possível
97
00:16:35,262 --> 00:16:42,342
[Mauricio Aniche] que não dava para ser melhor. E quando eu li aquele livro onde ele introduziu o SOLID
pela primeira vez lá, etc. e tal, eu falei, porra, até que dá para separar as coisas,
98
00:16:42,342 --> 00:16:50,654
[Mauricio Aniche] né? dá pra ser um pouquinho melhor, não precisa estar tudo no mesmo lugar.
Porque acho que a galera colocava, nos projetos que eu participei,
99
00:16:50,654 --> 00:16:55,534
[Mauricio Aniche] estava tudo sempre no mesmo lugar. E pra mim foi um divisor de águas, ele dizia,
dá pra tentar modelar um pouquinho melhor.
100
00:16:56,734 --> 00:17:02,934
[Mauricio Aniche] Agora, óbvio, ele é muito extremista na maneira de escrever.
Acho que é isso que você tem que ignorar quando lê.
101
00:17:02,934 --> 00:17:12,854
[Mauricio Aniche] Eu falei em algum tweet disso, que se você for seguir a risca ali, o que ele fala, ele é bem extremista.
"Banco de dados é um detalhe" Não sei em que mundo que banco de dados é um detalhe, né?
102
00:17:12,854 --> 00:17:26,298
[Mauricio Aniche] Mas acho que pra mim foi isso que me agradou no trabalho dele lá, sei lá, em 2006, 2007,
quando eu comecei a ler o trabalho dele. Mas eu concordo em tudo que você comentou, Mauricio, que é muito extremista, né?
103
00:17:26,298 --> 00:17:30,417
[Mauricio Aniche] Infelizmente é muito extremista, do meu ponto de vista, claro.
104
00:17:33,793 --> 00:17:37,338
[Rodrigo Branas] Eu ia colocar só 3 pontinhos importantes aqui, tá?
105
00:17:37,338 --> 00:17:47,570
[Rodrigo Branas] O primeiro ponto que eu acho que todo mundo concorda é que não faz sentido você misturar
o inbound driver, ou a inbound port, se a gente pensar em Ports & Adapters,
106
00:17:47,822 --> 00:17:56,822
[Rodrigo Branas] com regra de negócio, que é uma coisa que a gente sempre sofreu ao longo dos últimos 20, 30 anos, ou seja,
o teu controller tem regra de negócio, a tua tela tem regra de negócio,
107
00:17:56,822 --> 00:18:10,822
[Rodrigo Branas] geralmente o controller e tela, mas se você tivesse um CLI, talvez ele pudesse ter regra de negócio,
talvez se você tivesse algum outro tipo de driver da aplicação, era muito comum que a gente presenciasse isso.
108
00:18:10,822 --> 00:18:19,618
[Rodrigo Branas] Então o primeiro ponto-chave aqui do Clean Architecture é a camada de use cases, que seria...
aquela API da application que você expõe pra fora, certo?
109
00:18:19,618 --> 00:18:28,618
[Rodrigo Branas] Então, acho que nesse ponto, ninguém discorda que isso é uma coisa super válida, né?
É a mesma proposta do Alistair Cockburn, a mesma proposta do Ivar Jacobson,
110
00:18:28,618 --> 00:18:36,078
[Rodrigo Branas] de muitos anos atrás também, e de qualquer um que
queira escrever uma aplicação que cresça e que tenha
111
00:18:36,078 --> 00:18:43,078
[Rodrigo Branas] testabilidade e que possa ser conduzida de formas diferentes. Então,
nesse ponto aí, eu acho que o Clean Architecture está perfeito nas colocações.
112
00:18:43,470 --> 00:18:50,350
[Rodrigo Branas] Ele tem uma questãozinha em relação a Screaming Architecture,
que é sempre difícil você pensar naquele nome Service.
113
00:18:50,350 --> 00:18:58,070
[Rodrigo Branas] E qual é o nome do Service? É Order Service, Client Service, Product Service?
Então, ele diz assim, olha, vamos criar um negócio chamado Use Case,
114
00:18:58,070 --> 00:19:03,570
[Rodrigo Branas] que é a intenção exata do usuário, e a gente dá um nome,
então isso pode pulverizar uma grande quantidade de classes,
115
00:19:03,570 --> 00:19:10,310
[Rodrigo Branas] mas até aí eu acho que está tudo bem. Para mim, a grande incongruência do Clean Architecture
está em um passo para dentro, não um passo para fora.
116
00:19:10,310 --> 00:19:22,218
[Rodrigo Branas] Para fora... Tá tudo certo, separar frameworks e drivers, na minha visão, é inviável porque nem sempre os frameworks são intercambiáveis,
mas só o fato de você separar porta pra fora, porta pra dentro, já é uma coisa boa.
117
00:19:22,218 --> 00:19:32,958
[Rodrigo Branas] O erro pra mim é na camada de entities, tá?
Rapidamente, só pra transmitir aqui a minha ideia, orientação a objetos é uma coisa muito boa porque ela preserva invariância.
118
00:19:32,958 --> 00:19:38,298
[Rodrigo Branas] Basicamente esse é o objetivo da orientação a objetos.
Não é simplesmente criar classe, porque você pode criar classe e continuar sendo procedural.
119
00:19:38,298 --> 00:19:46,430
[Rodrigo Branas] Então você tem que... expor comportamento e preservar características
e assim você tem controle de invariância. Quando você tem um projeto muito orientado a objetos,
120
00:19:46,430 --> 00:19:52,350
[Rodrigo Branas] você tem uma relação entre os objetos. Então você começa a agrupar esses objetos em clusters.
Eles começam a ter referência uns pros outros.
121
00:19:52,350 --> 00:20:01,870
[Rodrigo Branas] Esse é exatamente o conceito do aggregate que o Eric Evans traz em Domain Driven Design.
E o aggregate tem que ter um determinado tamanho
122
00:20:01,870 --> 00:20:06,578
[Rodrigo Branas] pra que ele mantenha a consistência transacional
na hora de você fazer a persistência por meio de repositório.
123
00:20:07,182 --> 00:20:15,702
[Rodrigo Branas] Para que ele não seja nem muito grande e muito desengonçado
e ocupe muito espaço em memória e nem muito pequeno para que a granularidade seja tipo
124
00:20:15,702 --> 00:20:23,262
[Rodrigo Branas] um mapeamento de tabela praticamente, né? Então é uma linha tênue e difícil de obter.
E o Bob Martin não cita isso no livro dele.
125
00:20:23,262 --> 00:20:31,422
[Rodrigo Branas] Tanto que quando eu vou... Eu tenho um curso sobre Clean Architecture, não só sobre isso, né?
Sobre DDD, SOLID e outras coisas. E eu sempre faço essa mescla.
126
00:20:31,422 --> 00:20:38,462
[Rodrigo Branas] Então eu começo explicando pelo Ports & Adapters...
trago o conceito de Clean Architecture e substituo a camada de Entity
127
00:20:38,462 --> 00:20:46,062
[Rodrigo Branas] por Domain Driven Design, mas aonde houver um domínio
suficientemente complexo que pague o custo disso.
128
00:20:46,062 --> 00:20:52,662
[Rodrigo Branas] Porque se eu tenho uma aplicação muito simples, vai ser burocrático,
que é um pouco do que foi colocado por vocês logo no início.
129
00:20:52,662 --> 00:21:00,962
[Rodrigo Branas] Então, para mim, esse é um tipo de design, um tipo de opção,
que serve quando você tem um tipo de domínio mais complexo.
130
00:21:01,102 --> 00:21:07,362
[Rodrigo Branas] Se você pensa na modelagem estratégica do Domain Driven Design,
você separa um domínio em subdomínios, mapeia bounded contexts,
131
00:21:07,362 --> 00:21:15,742
[Rodrigo Branas] e cada bounded context é uma história diferente. Você pode adotar um scaffolding simples em um
e uma orientação a domínio super rica em outros usando DDD.
132
00:21:15,742 --> 00:21:24,962
[Rodrigo Branas] Mas para mim, sempre aquela mescla de Ports & Adapters e DDD,
ela é mais vencedora nesse caso. Clean Arch fica meio que numa sombra disso.
133
00:21:24,962 --> 00:21:26,350
[Rodrigo Branas] Esse é o meu ponto.
134
00:21:26,350 --> 00:21:29,880
[Alexandre Aquiles] Boa. Só queria... Vai lá, Otávio.
135
00:21:29,880 --> 00:21:37,274
[Otávio Lemos] Só complementando essa ideia do Branas, eu acho legal quando você começa a perceber que, na verdade,
136
00:21:37,274 --> 00:21:49,314
[Otávio Lemos] tem a ver exatamente com isso que ele falou. Você não precisa usar todas as camadas para todos os seus casos de uso.
Inclusive, você pode ter alguns casos de uso mais simples, nos quais você só tem o próprio caso de uso,
137
00:21:49,314 --> 00:21:58,994
[Otávio Lemos]não entra mais para dentro. Eu acho que quando você começa a fazer essas adaptações para o seu contexto,
aí a coisa começa a fazer mais sentido. Então deixa eu fazer o jabá aqui.
138
00:21:59,118 --> 00:22:07,518
[Otávio Lemos]Eu acho que o meu livro é mais simples, né?
O meu livro, "Arquitetura Limpa na Prática", ele resume as ideias e mostra um exemplo, né?
139
00:22:07,518 --> 00:22:16,038
[Otávio Lemos] E em 100 páginas lá você consegue pegar a essência da arquitetura limpa.
E é isso que o Branas falou também, eu acho interessante essa parte.
140
00:22:16,038 --> 00:22:22,238
[Otávio Lemos] Ninguém reclama de separar front-end e back-end.
Isso é uma coisa que a gente já faz faz muito tempo.
141
00:22:22,238 --> 00:22:33,490
[Otávio Lemos] Seria a parte esquerda da Arquitetura Hexagonal, ou Ports & Adapters.
O galho fica quando você quer desacoplar coisas como banco de dados e tal,
142
00:22:33,490 --> 00:22:44,430
[Otávio Lemos] e aí já fica mais difícil de fazer e não faz sentido em todos os sistemas que você desenvolve.
Tem que ser adaptado ao seu contexto. Então acho que isso vale a pena a gente ter na cabeça, né?
143
00:22:44,430 --> 00:22:57,398
[Otávio Lemos] Que o Uncle Bob é muito enfático, né? Então você tem que colocar um filtro ali, não dá pra usar tudo aquilo que ele coloca em todos os sistemas,
tem que adaptar pro seu contexto.
144
00:22:57,398 --> 00:23:06,398
[Alexandre Aquiles] Sei. Eu acho que assim, a gente está assumindo que use case e vamos dizer,
145
00:23:06,398 --> 00:23:15,278
[Alexandre Aquiles] service, ou coisa do gênero, é uma unanimidade.
Agora, é de fato uma unanimidade entre nós aqui, pessoal?
146
00:23:15,278 --> 00:23:26,238
[Alexandre Aquiles] Eu não sei, por exemplo, a Roberta, eu acho que tem críticas, né, Roberta?
Isso dependendo do contexto, né? Qual seria esse contexto para você não usar esse tipo de...
147
00:23:26,990 --> 00:23:29,617
[Alexandre Aquiles] de organização de código?
148
00:23:29,617 --> 00:23:32,548
[Roberta Arcoverde] Que tipo de organização que você fala? Distribuído?
149
00:23:32,548 --> 00:23:39,790
[Alexandre Aquiles] Tipo, assim, de separar a camada que está mais próxima
150
00:23:39,790 --> 00:23:45,790
[Alexandre Aquiles] da interface com o usuário do resto do sistema.
Porque eu lembro que a gente participou de um...
151
00:23:45,870 --> 00:23:51,855
[Alexandre Aquiles] Tem até um exemplo de um tweet lá que tinha até SQL
dentro de um controller, não tinha?
152
00:23:51,855 --> 00:23:57,006
[Roberta Arcoverde] Ah, não. Mas isso aí é um pouco indesculpável.
153
00:23:57,006 --> 00:24:00,813
[Alexandre Aquiles] Tá. Mas por que que... Por que aquilo?
154
00:24:00,813 --> 00:24:19,670
[Roberta Arcoverde] Eu acho que o foco da aplicação, quando a gente fala de Clean Architecture, de padrões, de modularidade, o que todo mundo quer, escrever uma aplicação que seja resiliente e fácil de manter a longo prazo.
155
00:24:19,670 --> 00:24:29,870
[Roberta Arcoverde] É isso que a gente quer dizer quando a gente fala de qualidade.
Ela é fácil de entender, ela é fácil de modificar, ela é fácil de manter em longo prazo.
156
00:24:29,870 --> 00:24:44,814
[Roberta Arcoverde] E tem... diversas técnicas e princípios e padrões para fazer isso que não necessariamente...
cuja modularidade não é necessariamente o único foco.
157
00:24:44,814 --> 00:24:59,614
[Roberta Arcoverde] Modularidade é um aspecto muito importante de manutenibilidade, mas não é um único.
Eu acho que quando você tem um Big Ball of Mud, ou seja, um sistema cuja arquitetura não pode sequer ser inferida
158
00:24:59,614 --> 00:25:08,165
[Roberta Arcoverde] porque ele é escrito de formas completamente aleatórias e tem muitos padrões e é difícil de entender onde,
159
00:25:08,165 --> 00:25:13,466
[Roberta Arcoverde] se você vai escrever código novo, onde aquele código deve ficar, esse não é um mundo que ninguém quer estar.
160
00:25:13,466 --> 00:25:18,547
[Roberta Arcoverde] Eu gosto de divisões de camadas, eu acho que elas são importantes.
161
00:25:18,547 --> 00:25:29,618
[Roberta Arcoverde] Eu acho que uma organização que permita com que o time de desenvolvimento, sempre que ele quiser alterar o código ou inserir uma nova funcionalidade, ele saiba exatamente aonde esse código tem que entrar.
162
00:25:30,126 --> 00:25:40,566
[Roberta Arcoverde] Isso é desejável, isso é importante para a manutenibilidade de longo prazo.
Se você está falando de aplicação web que segue MVC, por exemplo,
163
00:25:41,126 --> 00:25:52,686
[Roberta Arcoverde] não é legal que você tenha acesso a dados no controlador exatamente por isso.
Agora, é catastrófico? Também não sei se é catastrófico, acho que depende muito. Pode ser que seja, pode ser que não.
164
00:25:53,406 --> 00:26:02,714
[Roberta Arcoverde] Se é um sistema muito pequeno, que não tem tantas alterações assim.
Nesse exemplo que eu dei era de um trecho de código que tava inalterado há sete anos,
165
00:26:02,714 --> 00:26:16,714
[Roberta Arcoverde] então nunca deu dor de cabeça pra ninguém. Então faz diferença realmente encaixar 3 ou 4 novas classes ali pra separar esses concerns?
Não acho que faça, sabe? Não acho que faça.
166
00:26:16,714 --> 00:26:27,406
[Roberta Arcoverde] Eu acho que a coisa que mais me incomoda do tom desse livro e do tom desse autor é, com o perdão do meu francês, a cagação de regra mesmo, sabe?
167
00:26:27,406 --> 00:26:41,246
[Roberta Arcoverde] Parece que existe apenas uma forma de escrever sistemas, essa é a forma,
e quem faz assim tá correto, quem não faz assim tá fadado a escrever sistemas ruins, difíceis de manter.
168
00:26:41,246 --> 00:26:48,566
[Roberta Arcoverde] E é engraçado como comunidade como a gente aceita isso,
quando a gente também aceita um princípio que contradiz isso,
169
00:26:48,566 --> 00:26:58,574
[Roberta Arcoverde] que é o princípio de que não existe bala de prata, né?
É pouco controverso de que em design e arquitetura de software não existam soluções únicas,
170
00:26:58,574 --> 00:27:15,374
[Roberta Arcoverde] que tudo depende de contexto, e ao mesmo tempo existe uma resistência a perceber que
os designs propostos por Clean Architecture e pelo conjunto da obra do autor, sejam entendidos
171
00:27:15,374 --> 00:27:27,534
[Roberta Arcoverde] como os únicos corretos, e que por exemplo, como o Maurício estava falando, como os dois Maurícios
estavam falando, seja interessante abstrair o seu banco de dados.
172
00:27:27,534 --> 00:27:40,574
[Roberta Arcoverde] Ah não, é uma boa aplicação, bem feita, ela não deve se preocupar com qual é o mecanismo
de storage, quando na verdade eu acho que isso complexifica e atrapalha a manutenibilidade,
173
00:27:40,574 --> 00:27:49,894
[Roberta Arcoverde] ao invés de facilitar, porque a decisão de qual mecanismo de storage você vai usar
é uma das mais importantes no planejamento de uma arquitetura.
174
00:27:50,318 --> 00:28:01,118
[Roberta Arcoverde] E tentar torná-la invisível traz mais problemas, na minha opinião, do que auxílios.
Não sei se eu respondi a tua pergunta.
175
00:28:01,658 --> 00:28:13,458
[Alexandre Aquiles] Sim, sim. É interessante esse questionamento.
Tem bastante gente querendo falar aqui. Eu vou passar a palavra na ordem, assim, pro Ponte, pro Aniche, pro Linhares, pro Branas.
176
00:28:13,458 --> 00:28:15,846
[Alexandre Aquiles] Beleza? Mas vai lá, Ponte.
177
00:28:15,846 --> 00:28:19,086
[Rafael Ponte] Show. Vou pegar aqui a tua pergunta, né?
178
00:28:19,086 --> 00:28:24,846
[Rafael Ponte] Como é que a gente entende o que são use cases, né? Acho que o Clean Arch comenta muito, né?
179
00:28:24,846 --> 00:28:41,646
[Rafael Ponte] E de certa forma é algo até aberto, né? Mas para mim, acho que o Mauricio Aniche, o Linhares já... de muita data aí, mais de 10, 15 anos de experiência, a gente já sofreu demais com a ideia de gerar essas camadas indireção, né?
180
00:28:41,646 --> 00:28:50,538
[Rafael Ponte] Use cases, a gente chama de service, outros chamam de Manager. Então esse nome foi mudando com o tempo, né?
Mas isso fazia muito sentido há 15 anos atrás,
181
00:28:50,578 --> 00:28:58,258
[Rafael Ponte] talvez 10 anos atrás, eu falando aqui na plataforma Java, onde é o meu dia a dia,
porque os frameworks não eram maduros o suficiente
182
00:28:58,278 --> 00:29:03,358
[Rafael Ponte] para conseguir tirar todo aquele glue code,
aquele código de infra que a gente era obrigado
183
00:29:03,378 --> 00:29:12,298
[Rafael Ponte] a ter que implementar, escrever, ou copiar e colar de algum lugar.
Só que isso mudou, isso mudou nos últimos, sei lá, talvez 10 anos para cá,
184
00:29:12,318 --> 00:29:22,278
[Rafael Ponte] 9, 8 anos para cá. Você pega uma plataforma como Spring,
ou mesmo Java EE, que hoje é o Jakarta EE, e você consegue perceber que o controller que antes a gente temia
185
00:29:22,318 --> 00:29:28,318
[Rafael Ponte] de deixar qualquer tipo de lógica de negócio,
qualquer if, qualquer coisa relacionada ao nosso modelo de domínio,
186
00:29:28,678 --> 00:29:35,318
[Rafael Ponte] hoje não tem mais esse problema. Hoje você pegar um controller do Spring
basicamente é uma classe, um POJO, com algumas anotações.
187
00:29:36,038 --> 00:29:42,598
[Rafael Ponte] E só! O controller está tão limpo, tão simples,
onde o framework absorveu toda a complexidade,
188
00:29:42,638 --> 00:29:50,058
[Rafael Ponte] o glue code que a gente... tentou evitar durante anos,
que, para mim, na maioria dos casos, eu enxergo ele como meu use case.
189
00:29:50,338 --> 00:29:58,658
[Rafael Ponte] E para muitas pessoas, isso é bem feio, porque
se eu enxergo ele como use case, a chance são de que eu vou injetar um repositório,
190
00:29:58,698 --> 00:30:05,938
[Rafael Ponte] um ou dois repositórios ali. E a ideia de que injetar repositório
aproxima do banco de dados e está no controller
191
00:30:06,038 --> 00:30:15,650
[Rafael Ponte] é ainda mais doloroso para muita gente. Mas se você pensar, a camada de persistência
também foi abstraída pelos frameworks. Um repositório de Spring Data, nada mais é do que uma interface
192
00:30:15,670 --> 00:30:22,850
[Rafael Ponte] com algumas poucas anotações. E se você usa o JPA e o Hibernate,
então você tem uma camada de abstração com o Spring Data,
193
00:30:22,910 --> 00:30:30,810
[Rafael Ponte] mais uma segunda camada um pouco mais funda que a JPA e o Hibernate
que abstrai ainda mais a sua persistência, o JDBC e até um pouco o SQL ali.
194
00:30:31,310 --> 00:30:38,470
[Rafael Ponte] Então qual é o problema de encarar o controller como um use case?
Hoje, eu encaro ele como um use case até que algo me diga o contrário.
195
00:30:38,510 --> 00:30:48,038
[Rafael Ponte] E geralmente o que me diz o contrário é... Tá fácil testar?
Tá fácil entender? Eu consigo escrever um único teste aqui de integração?
196
00:30:48,038 --> 00:30:57,318
[Rafael Ponte] Ou tenho que quebrar em vários testes para que isso fique mais fácil de testar,
ter uma melhor cobertura e tudo mais? Então, querendo ou não, a manutenção
197
00:30:57,318 --> 00:31:08,158
[Rafael Ponte] é o que me guia junto com os testes. Então só para deixar claro, eu encaro que um controller
é sim uma camada de use case em qualquer literatura de arquitetura
198
00:31:08,158 --> 00:31:14,982
[Rafael Ponte] que alguém tenha lido aí. Essa é a minha percepção, porque eu abraço...
os frameworks que eu uso. A primeira regra que eu faço ao entrar em um
199
00:31:14,982 --> 00:31:24,662
[Rafael Ponte] projeto é abraçar o framework. Eu abraço framework e respeito o que ele me pede
para fazer. Em seguida eu abraço a linguagem de programação. Se a
200
00:31:24,662 --> 00:31:35,482
[Rafael Ponte] linguagem e o framework entram em conflito, eu favoreço o framework, porque
eu vendi a minha alma para o Spring e eu quero os benefícios de ter
201
00:31:35,482 --> 00:31:38,243
[Rafael Ponte] vendido minha alma para aquela plataforma.
202
00:31:38,243 --> 00:31:47,022
[Alexandre Aquiles] Hoje em dia eu estou muito nessa linha do Ponte. Mas, ô Aniche, vai lá!
203
00:31:47,022 --> 00:31:54,822
[Mauricio Aniche] Eu acho que a sacada é perceber isso mesmo que a Roberta e o Rafael comentaram,
porque se você olha para a aplicação Enterprise,
204
00:31:57,602 --> 00:32:06,302
[Mauricio Aniche] como que ela funciona? De maneira bem abstrata, como que funciona basicamente
grande parte dos casos de uso? O usuário manda dado, você aumenta esse dado
205
00:32:06,322 --> 00:32:11,422
[Mauricio Aniche] com a informação que você busca no banco de dados,
você faz umas validações, você muda um pouquinho esse dado,
206
00:32:11,442 --> 00:32:18,230
[Mauricio Aniche] você manda de volta para o banco de dados ou manda para um outro serviço web.
Uma grande parte das funcionalidades são isso.
207
00:32:18,230 --> 00:32:26,730
[Mauricio Aniche] E para modelar esse tipo de coisa, você não precisa de coisa muito requintada, muito chique, entendeu?
Uma básica separação de responsabilidade, os repositórios do Spring aqui,
208
00:32:26,730 --> 00:32:34,310
[Mauricio Aniche] põe uma validaçãozinha se for um pouquinho complicado, um pouquinho ali, etc. e tal,
Isso é mais o que o suficiente, né? Não precisa ir muito mais além.
209
00:32:34,310 --> 00:32:41,710
[Mauricio Aniche] Eu acho que esse é o ponto, né? Mas aí tem sempre aqueles 20% de funcionalidade
que é muito mais complicada no teu sistema, que vai mudar o tempo inteiro,
210
00:32:41,710 --> 00:32:46,682
[Mauricio Aniche] que regra nova entra, regra nova sai, etc. e tal.
talvez ali vale a pena um design mais rebuscado,