Skip to content

Commit 44192cf

Browse files
committed
Adiciona tradução do exercício "interface sequencial" - capítulo 6
- Finaliza tradução segunda metade do capítulo 6
1 parent 1728a2f commit 44192cf

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

chapters/06-a-vida-secreta-dos-objetos.md

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,36 @@ console.log(sc.draw(3, 2));
561561

562562
**Dicas**
563563

564-
Você vai ter que armazenar os 3 argumentos construtores na instância do objeto. Os métodos `minWidth` e `minHeight` devem chamar através dos métodos correspondentes na célular interna (`inner`), mas assegure-se que nenhum número menor que o tamanho dado é retornado (possivelmente usando `Math.max`).
564+
Você vai ter que armazenar os 3 argumentos construtores na instância do objeto. Os métodos `minWidth` e `minHeight` devem chamar através dos métodos correspondentes na célula interna (`inner`), mas assegure-se que nenhum número menor que o tamanho dado é retornado (possivelmente usando `Math.max`).
565565

566566
Não se esqueça de adicionar um método `draw` que simplesmente encaminha a chamada para a célula interior.
567+
568+
### Interface sequencial
569+
570+
Projete uma *interface* que abstraia interações sobre uma coleção de valores. Um objeto que fornece esta interface representa uma sequência, e a interface deve de alguma forma tornar possível para o código que usa este objeto iterar sobre uma sequência, olhando para o valor dos elementos de que ela é composta e tendo alguma forma de saber quando o fim da sequência foi atingido.
571+
572+
Quando você tiver especificado sua interface, tente escrever uma função `logFive` que pega um objeto sequencial e chama `console.log` para seus primeiros 5 elementos - ou menos, se a sequência tiver menos do que cinco elementos.
573+
574+
Então implemente um tipo de objeto `ArraySeq` que envolve um array e permite interação sobre o array usando a interface que você desenvolveu. Implemente outro tipo de objeto `RangeSeq` que itera sobre um intervalo de inteiros (recebendo os argumentos `from` e `to` em seu construtor).
575+
576+
```js
577+
// Your code here.
578+
579+
logFive(new ArraySeq([1, 2]));
580+
// → 1
581+
// → 2
582+
logFive(new RangeSeq(100, 1000));
583+
// → 100
584+
// → 101
585+
// → 102
586+
// → 103
587+
// → 104
588+
```
589+
590+
**Dicas**
591+
592+
Uma forma de resolver isso é fornecendo objetos sequenciais *state*, que significa que suas propriedades são alteradas no seu processo de uso. Você pode armazenar um contador que indica quão longe o objeto sequenciais avançaram.
593+
594+
Sua interface vai precisar expor ao menos uma forma de pegar o próximo elemento e encontrar se a iteração já chegou no fim da sequencia. É tentador fazer isso em um método, `next`, que retorna `null` ou `undefined` quando a sequência chegar ao fim. Mas agora você tem um problema quando a sequência realmente tiver `null`. Então um método separado (ou uma propriedade getter) para descobrir se o fim foi alcançado é provavelmente preferível.
595+
596+
Outra solução é evitar mudar o estado do objeto. Você pode expor um método para pegar o elemento atual (sem o auxílio de nenhum contador) e outro para pegar uma nova sequência que representa os elementos restantes depois do atual (ou um valor especial se o fim da sequência tiver sido atingido). Isso é bem elegante - um valor sequencial vai "permanecer ele mesmo" mesmo depois de ter sido usado e pode ser compartilhado com outro código sem a preocupação sobre o que pode acontecer com ele. Isso é, infelizmente, algo um pouco ineficiente numa linguagem como JavaScript porque envolve criar vários objetos durante a iteração.

0 commit comments

Comments
 (0)