1 00:00:01,190 --> 00:00:05,220 Neste video, vamos mostrar como criar pacotes, classes, e descrever testes. 2 00:00:05,770 --> 00:00:09,100 A primeira coisa a se fazer é abrir o "System Browser". 3 00:00:09,530 --> 00:00:12,590 O System Browser permite navegar pacotes. Aqui estão os pacotes. 4 00:00:14,260 --> 00:00:21,790 Para criar um pacote, vamos clicar em "Add Package", digitar "MyCounter". 5 00:00:22,280 --> 00:00:27,050 Como temos muitos pacotes e não queremos ver todos, seria bom filtrá-los. 6 00:00:27,950 --> 00:00:30,000 Temos nosso pacote "MyCounter". 7 00:00:30,150 --> 00:00:33,200 E aqui, vamos definir uma classe vamos chamá-la "Counter" 8 00:00:33,420 --> 00:00:37,550 e ela tem uma variável de instância, "count". 9 00:00:38,140 --> 00:00:42,290 O pequeno ícone laranja ali indica que o código não foi salvo. 10 00:00:42,610 --> 00:00:45,690 Vamos compilar o código, com a função "Accept". 11 00:00:46,290 --> 00:00:49,570 E agora, vemos a classe "Counter" que foi compilada. 12 00:00:49,830 --> 00:00:56,290 O sistema investiga a classe e mostra dicas de qualidade de código. Veremos isso depois. 13 00:01:00,790 --> 00:01:03,580 Tem uma exclamação em vermelho porque não escrevemos comentários. 14 00:01:03,720 --> 00:01:13,880 Então vamos escrever um primeiro comentário: "Sou um contador simples". 15 00:01:45,790 --> 00:01:49,230 Vamos escrever um pequeno exemplo para que o leitor entenda 16 00:01:49,397 --> 00:01:53,050 como esta classe funciona: "Counter new"... 17 00:01:55,750 --> 00:02:04,280 "Counter increment increment" 18 00:02:04,420 --> 00:02:08,900 "Counter count". Aqui, deve ser igual a dois. 19 00:02:09,880 --> 00:02:14,180 De novo, o código não foi salvo, então vamos compilá-lo. 20 00:02:14,347 --> 00:02:16,540 Foi salvo. Não temos mais um contador. 21 00:02:16,850 --> 00:02:20,050 Agora, vamos definir métodos de acesso. 22 00:02:21,940 --> 00:02:24,770 Colocamos métodos de acesso sob o protocolo "accessing" 23 00:02:26,640 --> 00:02:31,540 Digitamos: "count", retornando a variável "count". 24 00:02:33,160 --> 00:02:40,740 Da mesma forma, digitamos ": aNumber" para fazer um método "setter" 25 00:02:46,190 --> 00:02:48,380 Veja que eu modifiquei o método "count". 26 00:02:48,547 --> 00:02:50,770 Você pode pensar que ele foi descartado, mas não, porque 27 00:02:50,937 --> 00:02:54,120 toda vez que modifico um método com um nome diferente 28 00:02:54,287 --> 00:02:55,320 ele cria um novo método. 29 00:02:55,487 --> 00:02:58,530 Eu compilo o novo método, e tenho “count”. 30 00:03:01,160 --> 00:03:05,190 Agora, podemos de fato testar nosso pequeno programa. 31 00:03:07,360 --> 00:03:14,700 Eu abro o Playground, eu quero criar um contador 32 00:03:14,860 --> 00:03:23,020 Quero criar um contador, adiciono um valor: "C count: 7" 33 00:03:23,200 --> 00:03:29,860 Se eu perguntar qual seu valor, ele me mostra... 7 34 00:03:32,400 --> 00:03:37,140 Agora, queremos escrever isso na forma de um teste 35 00:03:37,280 --> 00:03:40,440 para que assim possamos executar isso automaticamente. 36 00:03:40,630 --> 00:03:42,910 Vamos criar uma classe de teste. 37 00:03:43,077 --> 00:03:44,820 Como criar uma classe de teste em Pharo? 38 00:03:45,000 --> 00:03:48,450 Mudamos a superclasse, dizemos que ela herda "TestCase" 39 00:03:50,220 --> 00:03:56,140 e vamos definir uma classe chamada "CounterTest". 40 00:03:56,910 --> 00:03:59,860 Agora, vamos compilá-la. 41 00:04:00,660 --> 00:04:03,700 Eu tenho uma classe "CounterTest" no meu sistema. 42 00:04:04,570 --> 00:04:10,030 Vamos definir um novo método, eu vou adicioná-lo ao protocolo "tests". 43 00:04:11,620 --> 00:04:14,300 Aqui eu posso definir um novo método. 44 00:04:14,467 --> 00:04:17,940 Métodos de teste devem sempre começar com "test" 45 00:04:18,107 --> 00:04:21,690 e estar em uma classe que herda "TestCase" 46 00:04:22,380 --> 00:04:30,620 Vamos chamá-lo "testCounterisSetAndRead" 47 00:04:31,740 --> 00:04:36,540 Temos praticamente nosso teste, já escrevemos quase tudo. 48 00:04:37,620 --> 00:04:40,330 Vamos indentar um pouco melhor. 49 00:04:40,497 --> 00:04:51,180 Criei meu contador, e aqui digito "self assert: ... equals: 7" 50 00:04:52,920 --> 00:05:01,040 Esta expressão é equivalente a "self assert: c count = 7" 51 00:05:01,720 --> 00:05:04,640 o que é mais prático. Quando você faz algo errado, 52 00:05:04,807 --> 00:05:08,470 o resultado é mais elegante nesta primeira forma. 53 00:05:09,020 --> 00:05:10,910 Vamos compilar. 54 00:05:12,790 --> 00:05:17,740 Agora, posso executar meu teste. e voilà, meu teste está verde. 55 00:05:19,790 --> 00:05:26,180 Quando você tem testes verdes, é uma boa hora para salvar seu código. 56 00:05:26,370 --> 00:05:27,930 Em Pharo, você pode salvar sua imagem. 57 00:05:28,090 --> 00:05:29,600 É o que vou fazer, vou salvar a imagem 58 00:05:29,740 --> 00:05:31,320 Mas só a imagem não é o suficiente. 59 00:05:31,560 --> 00:05:36,820 Vou mostrar como salvar o código em um sistema de versionamento. 60 00:05:37,070 --> 00:05:40,460 Como eu não sei se você terá acesso à Internet, 61 00:05:40,560 --> 00:05:44,610 Eu vou salvar o código em um repositório local. 62 00:05:44,770 --> 00:05:51,440 Veja, existe esse diretório que aponta todos os pacotes 63 00:05:51,520 --> 00:05:55,360 os quais eu posso trabalhar, e que eu ou o sistema instalamos. 64 00:05:55,770 --> 00:06:02,870 Aqui, o sistema mostra pacotes com modificações que não foram salvas 65 00:06:03,070 --> 00:06:07,360 Ignorando os dois primeiros, vemos que "MyPackage" tem um asterisco. 66 00:06:07,460 --> 00:06:10,760 Isto significa que tenho código na imagem que não foi salvo. 67 00:06:12,130 --> 00:06:14,020 O que eu vou fazer: vou clicar em "Save" 68 00:06:14,187 --> 00:06:17,320 Escolho primeiro o repositório, e clico em "Save". 69 00:06:18,920 --> 00:06:29,600 E digito "first version with accessors and a green test" 70 00:06:32,240 --> 00:06:36,530 E "Accept". Agora, um pacote foi salvo. Vamos verificar. 71 00:06:36,697 --> 00:06:41,370 Quando eu abrir este diretório, ele vai conter 72 00:06:42,410 --> 00:06:44,460 vários pacotes instalados pelo sistema. 73 00:06:44,627 --> 00:06:48,470 Mas em particular, se eu filtrar, irei achar 74 00:06:48,637 --> 00:06:51,130 meu pacote e suas versões. 75 00:06:57,620 --> 00:07:00,740 Aconselho que, toda vez que adicionar uma funcionalidade, 76 00:07:00,907 --> 00:07:03,460 você automaticamente salve o código. 77 00:07:06,770 --> 00:07:12,130 Agora, vamos definir um teste antes de implementar uma funcionalidade. 78 00:07:12,410 --> 00:07:15,560 Vamos escrever um teste do que seria incrementar um contador. 79 00:07:19,020 --> 00:07:21,200 "testIncrement" O que queremos obter? 80 00:07:26,330 --> 00:07:27,430 Queremos criar um contador, 81 00:07:33,510 --> 00:07:38,400 atribuir um valor inicial, 82 00:07:38,840 --> 00:07:43,410 depois, incrementá-lo duas vezes. 83 00:07:44,100 --> 00:07:45,310 E o que devo checar? 84 00:07:45,477 --> 00:07:51,870 Que este contador tenha o valor correto. 85 00:07:57,900 --> 00:07:59,720 Eu compilo. 86 00:08:03,000 --> 00:08:06,880 Meu teste está vermelho porque eu não implementei, no contador, 87 00:08:07,510 --> 00:08:10,390 as operações "increment" e "decrement". 88 00:08:11,520 --> 00:08:21,460 E aqui, vou adicionar: "operations"... "increment". 89 00:08:22,550 --> 00:08:27,840 Vamos escrever "self count 2: self count + 1" 90 00:08:27,920 --> 00:08:30,820 Se usamos métodos de acesso internamente ou não, 91 00:08:30,920 --> 00:08:32,080 é uma questão de estilo. 92 00:08:34,510 --> 00:08:40,780 Similarmente, vamos definir "decrement". 93 00:08:42,380 --> 00:08:48,190 Veja que há um teste em "increment", posso executá-lo e ele está verde. 94 00:08:48,357 --> 00:08:50,370 Então tenho dois testes funcionando. 95 00:08:50,710 --> 00:08:53,520 Se eu for pra classe de teste, todos meus testes estão verdes. 96 00:08:53,670 --> 00:08:56,790 O que posso fazer? Vou salvar novamente. 97 00:08:56,950 --> 00:09:03,000 Vou digitar "Adding increment and decrement". 98 00:09:13,110 --> 00:09:23,883 Quando eu inspecionar, terei duas versões do meu pacote. 99 00:09:24,090 --> 00:09:29,020 Vamos escrever um teste para "decrement" 100 00:09:29,100 --> 00:09:30,860 porque não há razão para não fazê-lo. 101 00:09:31,700 --> 00:09:40,320 "Decrement", por exemplo posso atribuir valor "2" 102 00:09:40,487 --> 00:09:43,890 e decrementar duas vezes. Devo obter zero. 103 00:09:44,057 --> 00:09:50,203 Meu teste está verde, então vou salvar. 104 00:10:06,490 --> 00:10:14,300 Agora, o que queremos é, quando executarmos "Counter new" 105 00:10:14,460 --> 00:10:17,340 usando "Print it", ele mostra um contador cujo valor eu não sei. 106 00:10:17,420 --> 00:10:19,000 O que não é muito prático. 107 00:10:19,360 --> 00:10:22,260 Gostaríamos de modificar este comportamento. 108 00:10:24,130 --> 00:10:26,630 Para fazer isso,vamos adicionar um método 109 00:10:26,797 --> 00:10:29,840 chamado ”printOn:", sob o protocolo "printing". 110 00:10:31,340 --> 00:10:34,920 "printOn:" é chamado pelo sistema toda vez que fizermos "printStream". 111 00:10:35,760 --> 00:10:37,620 Ele tem "aStream" como argumento. 112 00:10:38,690 --> 00:10:39,440 O que vamos fazer? 113 00:10:40,200 --> 00:10:43,170 Dizemos que queremos ter um contador, então 114 00:10:43,337 --> 00:10:47,460 tipicamente usaremos a funcionalidade da superclasse. 115 00:10:51,740 --> 00:11:05,560 E gostaria de adicionar um pequeno texto 116 00:11:17,370 --> 00:11:21,480 por exemplo, "with value" e depois, "self count". 117 00:11:24,150 --> 00:11:27,740 Faço isso porque o contador é um número 118 00:11:27,907 --> 00:11:32,180 então quero obter sua representação textual. 119 00:11:34,260 --> 00:11:36,980 Eu digito "cr". Eu compilo. 120 00:11:42,900 --> 00:11:45,000 O sistema diz que posso expressar melhor esse método, 121 00:11:45,060 --> 00:11:47,270 mas não tem problema. No momento, não importa. 122 00:11:48,590 --> 00:11:50,120 Posso digitar "Counter new". 123 00:11:51,000 --> 00:11:54,360 Eu inspeciono, e tenho um contador com valor "nil". 124 00:11:54,907 --> 00:11:58,020 É normal porque ainda não inicializei o contador. 125 00:12:01,260 --> 00:12:04,960 Agora, vamor adicionar suporte à inicialização. 126 00:12:07,590 --> 00:12:09,780 Pra fazer isso, começaremos escrevendo um teste. 127 00:12:14,050 --> 00:12:23,180 Eu digo que o valor na criação de um contador deve ser zero. 128 00:12:24,950 --> 00:12:36,210 Vou digitar "self assert: Counter new count = 0" 129 00:12:38,020 --> 00:12:41,090 Vamos notar que meu teste falhou. Por quê? 130 00:12:41,257 --> 00:12:45,140 Porque se eu executar isso, vou obter "nil" 131 00:12:47,140 --> 00:12:49,820 Como não temos acesso às variáveis de instância 132 00:12:50,000 --> 00:12:53,560 da classe "CounterTest", eu posso selecionar 133 00:12:53,727 --> 00:12:57,110 esta expressão e executá-la diretamente. 134 00:13:00,280 --> 00:13:04,420 Uma vez que este teste falhou, o que posso fazer? 135 00:13:04,580 --> 00:13:10,120 Vou adicionar um método "initialize" sob o protocolo "initialization". 136 00:13:16,900 --> 00:13:27,940 E daí, eu digito "super initialize" e vou dizer "count := 0" 137 00:13:28,020 --> 00:13:31,550 Este método é invocado toda vez que executo o método "new". 138 00:13:32,330 --> 00:13:35,700 Agora posso ver meus testes, eles estão verdes. 139 00:13:35,867 --> 00:13:40,070 Similarmente, se eu executar "count", obterei zero. 140 00:13:41,010 --> 00:13:46,280 Mais uma vez, vamos salvar o código. 141 00:14:04,000 --> 00:14:09,300 O interessante é que posso ver todo meu histórico. 142 00:14:09,467 --> 00:14:12,310 Também posso inspecionar e navegar nesse histórico. 143 00:14:12,520 --> 00:14:16,180 Se eu clicar em "version", posso ver o diff entre esses dois sistemas. 144 00:14:17,960 --> 00:14:21,900 As mudanças entre as versões 3 e 4 são ”initialize", "printOn", e o teste. 145 00:14:22,000 --> 00:14:31,860 Se eu quiser ver a diferença entre as versões 2 e 4, 146 00:14:31,960 --> 00:14:34,160 eu tenho todas essas mudanças. 147 00:14:35,870 --> 00:14:39,620 Resta uma coisa a se fazer, eu gostaria de mudar um pouco 148 00:14:39,720 --> 00:14:43,100 a maneira que os objetos são criados. 149 00:14:43,820 --> 00:14:49,040 Eu começo por criar um teste para esclarecer o que quero obter. 150 00:14:49,160 --> 00:14:58,460 Vou definir um teste chamado "AlternateClassCreation" 151 00:14:59,780 --> 00:15:11,000 Digamos, eu quero garantir que um contador com valor 19, 152 00:15:11,500 --> 00:15:20,000 incrementá-lo, e depois pedir seu valor, obterei 20. 153 00:15:21,000 --> 00:15:23,000 Ok? 154 00:15:30,000 --> 00:15:34,000 Vamos adicionar parênteses aqui, fica melhor. 155 00:15:38,000 --> 00:15:42,000 Mais uma vez, o teste não passa 156 00:15:44,000 --> 00:15:48,960 e o assistente aqui diz: "esta mensagem não existe". 157 00:15:49,000 --> 00:15:52,000 Então, note que a mensagem "withValue:" 158 00:15:52,200 --> 00:15:55,000 não é mandada para um objeto, e sim para uma classe. 159 00:15:55,500 --> 00:15:59,000 Isso significa que devo definir essa mensagem numa classe. 160 00:15:59,080 --> 00:16:01,720 Seleciono "Class", então passo pro nível de classe. 161 00:16:01,840 --> 00:16:10,000 e vou adicionar um protocolo chamado "instance creation" 162 00:16:12,500 --> 00:16:16,400 "withValue: aNumber"... E o que devo fazer? 163 00:16:17,500 --> 00:16:21,260 A primeira coisa a fazer é criar um contador, 164 00:16:21,320 --> 00:16:24,500 uma variável pro contador, farei lentamente. 165 00:16:24,600 --> 00:16:26,840 "self new" para criar um contafor 166 00:16:26,900 --> 00:16:30,480 e eu digito "self count: aNumber" 167 00:16:31,160 --> 00:16:34,000 e vou retornar este contador. 168 00:16:34,100 --> 00:16:35,900 Posso fazer isso de forma mais compacta. 169 00:16:35,940 --> 00:16:38,000 mas, no momento, faremos mais simples. 170 00:16:38,100 --> 00:16:40,000 Eu compilo meu método. 171 00:16:40,100 --> 00:16:43,720 O que significa que agora posso mandar mensagens. 172 00:16:44,960 --> 00:16:49,120 E você viu, quando eu clico neste botão, 173 00:16:49,460 --> 00:16:53,000 eu passo do nível de classe pro nível de instância. 174 00:16:53,100 --> 00:16:55,540 Aqui eu estava no nível de classe, e agora volto 175 00:16:55,620 --> 00:16:57,500 para as mensagens enviadas às instâncias. 176 00:16:58,100 --> 00:17:01,200 O que isso significa? Significa que se executo 177 00:17:01,500 --> 00:17:09,020 "Counter withValue: 18" O que obterei? 178 00:17:09,100 --> 00:17:11,000 Obterei uma instância da classe "Counter". 179 00:17:12,500 --> 00:17:15,000 Obtenho um contador com valor igual a 18, 180 00:17:15,100 --> 00:17:18,520 E aqui posso executar "decrement" 181 00:17:21,100 --> 00:17:23,340 E se atualizo o objeto, eu obtenho 17. 182 00:17:26,100 --> 00:17:30,120 Agora, se inspeciono meus testes, todos eles passam 183 00:17:30,220 --> 00:17:35,000 Então, vou mais uma vez salvar o código e pronto. 184 00:17:45,000 --> 00:17:48,000 Terminado por enquanto.