Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Let's store read messages in `WeakSet`:
Vamos guardar as mensagens lidas em um `WeakSet`:

```js run
let messages = [
Expand All @@ -9,35 +9,35 @@ let messages = [

let readMessages = new WeakSet();

// two messages have been read
// duas mensagens foram lidas
readMessages.add(messages[0]);
readMessages.add(messages[1]);
// readMessages has 2 elements
// readMessages tem 2 elementos

// ...let's read the first message again!
// ...vamos ler a primeira mensagem de novo!
readMessages.add(messages[0]);
// readMessages still has 2 unique elements
// readMessages ainda tem 2 elementos únicos

// answer: was the message[0] read?
alert("Read message 0: " + readMessages.has(messages[0])); // true
// resposta: a message[0] foi lida?
alert("Mensagem 0 lida: " + readMessages.has(messages[0])); // true

messages.shift();
// now readMessages has 1 element (technically memory may be cleaned later)
// agora readMessages tem 1 elemento (tecnicamente a memória pode ser limpa depois)
```

The `WeakSet` allows to store a set of messages and easily check for the existence of a message in it.
O `WeakSet` nos permite guardar um conjunto de mensagens e verificar facilmente se uma mensagem existe nele.

It cleans up itself automatically. The tradeoff is that we can't iterate over it, can't get "all read messages" from it directly. But we can do it by iterating over all messages and filtering those that are in the set.
Ele se limpa automaticamente. A desvantagem é que não podemos iterar sobre ele, nem obter "todas as mensagens lidas" diretamente. Mas conseguimos fazer isso iterando sobre todas as mensagens e filtrando as que estão no `WeakSet`.

Another, different solution could be to add a property like `message.isRead=true` to a message after it's read. As messages objects are managed by another code, that's generally discouraged, but we can use a symbolic property to avoid conflicts.
Outra solução, diferente, seria adicionar uma propriedade como `message.isRead=true` a uma mensagem depois que ela for lida. Como os objetos de mensagem são gerenciados por outro código, isso geralmente é desaconselhado, mas podemos usar uma propriedade simbólica para evitar conflitos.

Like this:
Assim:
```js
// the symbolic property is only known to our code
// a propriedade simbólica só é conhecida pelo nosso código
let isRead = Symbol("isRead");
messages[0][isRead] = true;
```

Now third-party code probably won't see our extra property.
Agora, o código de terceiros provavelmente não vai ver nossa propriedade extra.

Although symbols allow to lower the probability of problems, using `WeakSet` is better from the architectural point of view.
Embora símbolos reduzam a probabilidade de problemas, usar `WeakSet` é melhor do ponto de vista arquitetural.
12 changes: 6 additions & 6 deletions 1-js/05-data-types/08-weakmap-weakset/01-recipients-read/task.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ importance: 5

---

# Store "unread" flags
# Guarde marcações de "não lida"

There's an array of messages:
Existe um array de mensagens:

```js
let messages = [
Expand All @@ -14,10 +14,10 @@ let messages = [
];
```

Your code can access it, but the messages are managed by someone else's code. New messages are added, old ones are removed regularly by that code, and you don't know the exact moments when it happens.
Seu código pode acessá-lo, mas as mensagens são gerenciadas pelo código de outra pessoa. Mensagens novas são adicionadas, as antigas são removidas regularmente por esse código, e você não sabe os momentos exatos em que isso acontece.

Now, which data structure could you use to store information about whether the message "has been read"? The structure must be well-suited to give the answer "was it read?" for the given message object.
Agora, qual estrutura de dados você poderia usar para guardar a informação sobre se a mensagem "já foi lida"? A estrutura precisa ser bem adequada para responder "ela foi lida?" para um determinado objeto de mensagem.

P.S. When a message is removed from `messages`, it should disappear from your structure as well.
P.S. Quando uma mensagem é removida de `messages`, ela também deve desaparecer da sua estrutura.

P.P.S. We shouldn't modify message objects, add our properties to them. As they are managed by someone else's code, that may lead to bad consequences.
P.P.S. Não devemos modificar os objetos de mensagem, adicionando propriedades nossas a eles. Como eles são gerenciados pelo código de outra pessoa, isso pode trazer más consequências.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

To store a date, we can use `WeakMap`:
Para guardar uma data, podemos usar `WeakMap`:

```js
let messages = [
Expand All @@ -11,5 +11,5 @@ let messages = [
let readMap = new WeakMap();

readMap.set(messages[0], new Date(2017, 1, 1));
// Date object we'll study later
// objeto Date que vamos estudar mais adiante
```
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ importance: 5

---

# Store read dates
# Guarde as datas de leitura

There's an array of messages as in the [previous task](info:task/recipients-read). The situation is similar.
Existe um array de mensagens, igual ao da [tarefa anterior](info:task/recipients-read). A situação é parecida.

```js
let messages = [
Expand All @@ -14,8 +14,8 @@ let messages = [
];
```

The question now is: which data structure you'd suggest to store the information: "when the message was read?".
A pergunta agora é: qual estrutura de dados você sugeriria para guardar a informação "quando a mensagem foi lida?".

In the previous task we only needed to store the "yes/no" fact. Now we need to store the date, and it should only remain in memory until the message is garbage collected.
Na tarefa anterior, só precisávamos guardar o fato "sim/não". Agora precisamos guardar a data, e ela só deve permanecer na memória até que a mensagem seja removida pela coleta de lixo.

P.S. Dates can be stored as objects of built-in `Date` class, that we'll cover later.
P.S. Datas podem ser guardadas como objetos da classe nativa `Date`, que veremos mais adiante.
Loading