Commit 3b6c7899ea414a040cc4c2e18a4d7f8db671457f

[pt_BR] More work on the chapter Streams.

Commit diff

PortugueseBook/Streams/Streams.tex

 
3939\section{Duas sequências de elementos}
4040Uma boa metáfora para entender um fluxo é a seguinte: Um fluxo pode ser representada como duas sequências de elementos: a sequência de elementos visitados e a sequência de elementos a visitar. O fluxo é posicionado entre as duas sequências. Entender este modelo é importante uma vez que todos as operações de fluxo em \st dependem dele.
4141Por esta razão, a maioria das classes de \clsind{Fluxo} são subclasses de \clsind{PositionableStream}.
42\figref{_abcde} apresenta um fluxo que contém cinco caracteres. Este fluxo está na sua posição original, \ie não há elementos já visitados. Você pode voltar a esta posição usando a mensagem \mthind{PositionableStream}{reset}.
42A \figref{_abcde} apresenta um fluxo que contém cinco caracteres. Este fluxo está na sua posição original, portanto a lista de elementos já visitados está vazia. Você pode voltar a esta posição usando a mensagem \mthind{PositionableStream}{reset}.
4343
4444\begin{figure}[ht]
4545\centerline{\includegraphics[scale=0.5]{_abcdeStef}}
4848\vspace{.2in}
4949\end{figure}
5050
51A leitura de um elemento conceitualmente significa remover o primeiro elemento da sequência de elementos a visitar e colocá-lo na sequência de elementos visitados. Após ter lido um elemento usando a mensagem \ct{next}, o estado do seu fluxo fica semelhante ao mostrado na \figref{a_bcde}.
51A leitura de um elemento conceitualmente significa remover o primeiro elemento da sequência de elementos a visitar e colocá-lo na sequência de elementos visitados. Após ter lido um elemento usando a mensagem \ct{next}, o estado do fluxo fica semelhante ao mostrado na \figref{a_bcde}.
5252
5353\begin{figure}[ht]
5454\centerline{\includegraphics[scale=0.5]{a_bcdeStef}}
100100w nextPut: 12. --> resulta numa excecao
101101\end{code}
102102
103Fluxos não são apenas direcionado a coleções, eles podem ser usados em arquivos ou sockets também. O exemplo a seguir cria um arquivo chamado \ct{test.txt}, escreve duas strings separadas por uma quebra de linha, e fecha o arquivo.
103Fluxos não são apenas direcionado a coleções, eles também podem ser usados em arquivos ou sockets. O exemplo a seguir cria um arquivo chamado \ct{test.txt}, escreve duas strings separadas por uma quebra de linha, e fecha o arquivo.
104104
105105\needlines{3}
106106\begin{code}{}
113113\end{code}
114114\cmindex{FileStream class}{fileNamed:do:}
115115
116As seções a seguir apresentam tais protocolos em mais detalhes.
116As seções a seguir apresentam tais protocolos em detalhes.
117117
118118%=============================================================
119119\section{Criando fluxos a partir de coleções}
123123%-----------------------------------------------------------------
124124\subsection{Lendo coleções}
125125
126Esta seção apresenta os recursos usados para a leitura de coleções. Ao usar um fluxo para ler uma coleção, você recebe um ponteiro para a coleção. Este ponteiro irá se mover para frente conforme a leitura é feita, e você pode posicionar este ponteiro onde desejar. A classe \clsindmain{ReadStream} deve ser usada par ler elementos de coleções.
126Esta seção apresenta os recursos usados para a leitura de coleções. Ao usar um fluxo para ler uma coleção, você recebe um ponteiro para a coleção. Este ponteiro irá se mover para frente conforme a leitura é feita, e você pode posicionar este ponteiro onde desejar. A classe \clsindmain{ReadStream} deve ser usada para fazer a leitura dos elementos.
127127
128128Os métodos \mthind{ReadStream}{next} e \mthind{ReadStream}{next:} são usados para obter um ou mais elementos da coleção.
129129
231231%-----------------------------------------------------------------
232232\subsection{Escrevendo em coleções}
233233
234Nós acabamos de ver como iterar nos elementos de uma coleção usando \ct{ReadStream}. Agora nós iremos aprender como criar coleções usando \clsindmain{WriteStream}{}s.
234Nós acabamos de ver como iterar nos elementos de uma coleção usando \ct{ReadStream}. Agora nós iremos aprender como criar coleções usando a classe \clsindmain{WriteStream}{}.
235235
236\ct{WriteStream}s are useful for appending a lot of data to a collection at various locations. They are often used to construct strings that are based on static and dynamic parts as in this example:
236\ct{WriteStream}s são úteis para incluir dados em vários pontos numa coleção. Esses objetos são frequentemente usados para construir strings baseadas em partes estáticas e dinâmicas, como no exemplo a seguir:
237237
238\begin{code}{NB: can't be tested due to the changing number of classes}
238\begin{code}{NB: não pode ser testado em razão do número variável de classes.}
239239stream := String new writeStream.
240240stream
241 nextPutAll: 'This Smalltalk image contains: ';
241 nextPutAll: 'Esta imagem Smalltalk contem: ';
242242 print: Smalltalk allClasses size;
243243 nextPutAll: ' classes.';
244244 cr;
245 nextPutAll: 'This is really a lot.'.
245 nextPutAll: 'Muita coisa!'.
246246
247stream contents. --> 'This Smalltalk image contains: 2322 classes.
248This is really a lot.'
247stream contents. --> 'Esta imagem Smalltalk contem: 2322 classes.
248Muita coisa!'
249249\end{code}
250250
251This technique is used in the different implementations of the method
252\ct{printOn:} for example. There is a simpler and more efficient way
253of creating streams if you are only interested in the content of the
254stream:
251Esta técnica é usada em diferentes implementações do método \ct{printOn:}, por exemplo. Existe uma forma mais simples e eficiente de criar fluxos se você está interessado apenas no seu conteúdo:
255252
256253\begin{code}{@TEST |string|}
257254string := String streamContents:
264264string. --> '#(1 2 3) size = 3'
265265\end{code}
266266
267The method \mthind{SequenceableCollection class}{streamContents:} \label{sec:streamContents} creates a collection and a stream on
268that collection for you. It then executes the block you gave passing
269the stream as a parameter. When the block ends, \ct{streamContents:}
270returns the content of the collection.
267O método \mthind{SequenceableCollection class}{streamContents:} \label{sec:streamContents} cria uma coleção e um fluxo para essa coleção. Ele então executa o bloco que foi passado como parâmetro. Quando o bloco termina, o método \ct{streamContents:} retorna o conteúdo da coleção.
271268
272The following \ct{WriteStream} methods are especially useful in this context:
269O método \ct{WriteStream} a seguir é especialmente útil neste contexto:
273270
274271\begin{description}
275\item[\lct{nextPut:}] adds the parameter to the stream;
276\item[\lct{nextPutAll:}] adds each element of the collection, passed as a
277 parameter, to the stream;
278\item[\lct{print:}] adds the textual representation of the parameter to the
279 stream.
272\item[\lct{nextPut:}] adiciona o parâmetro ao fluxo;
273\item[\lct{nextPutAll:}] adiciona ao fluxo cada elemento da coleção passada como parâmetro;
274\item[\lct{print:}] adiciona ao fluxo a representação textual do parâmetro;
280275 \cmindex{Stream}{print:}
281276\end{description}
282277
283There are also methods useful for printing different kinds of characters to
284the stream like \mthind{WriteStream}{space}, \mthind{WriteStream}{tab} and
285\mthind{WriteStream}{cr} (carriage return). Another useful
286method is \mthind{WriteStream}{ensureASpace} which ensures that the last character
287in the stream is a space; if the last character isn't a space it adds one.
278Ainda existem métodos úteis para imprimir diferentes tipos de caracteres ao fluxo como \mthind{WriteStream}{space}, \mthind{WriteStream}{tab} e \mthind{WriteStream}{cr} (\foreign{carriage return}). Outro método útil é \mthind{WriteStream}{ensureASpace}, que garante que o último caractere do fluxo seja um espaço; se não for, um espaço é adicionado.
288279
289\paragraph{About Concatenation.}
290Using \mthind{WriteStream}{nextPut:} and \mthind{WriteStream}{nextPutAll:} on a \ct{WriteStream} is often the best way to
291concatenate characters. Using the comma concatenation operator (\ct{,}) is far
292less efficient:
293\index{Collection!comma operator}
280\paragraph{Sobre Concatenação.}
281Usando os métodos \mthind{WriteStream}{nextPut:} e \mthind{WriteStream}{nextPutAll:} num \ct{WriteStream} é, na maioria das vezes, a melhor forma de se concatenar caracteres. Usar o operador de concatenação (\ct{,}) é muito menos eficiente:
282
283\index{Coleção!operador vírgula}
294284
295285\begin{code}{}
296286[| temp |
295295 temp contents] timeToRun --> 1262 "(milliseconds)"
296296\end{code}
297297
298The reason that using a stream can be much more efficient is that
299comma creates a new string containing
300the concatenation of the receiver and the argument, so it must copy both of them.
301When you repeatedly concatenate onto the same receiver, it gets longer and longer each time,
302so that the number of characters that must be copied goes up exponentially.
303This also creates a lot of garbage, which must be collected. Using
304a stream instead of string concatenation is a well-known optimization.
298A razão de um fluxo ser muito mais eficiente é que a vírgula cria uma nova string contendo a concatenação do objeto receptor e do argumento, copiando então ambos os objetos. Quando você concatena repetidamente ao mesmo receptor, ele fica maior a cada vez, de modo que o número de caracteres que precisam ser copiados aumenta exponencialmente. Isso também cria muito lixo, que deve ser coletado. Usar um fluxo no lugar da concatenação de strings é uma otimização muito conhecida.
305299\lr{About Concatenation. This is not true for real world examples (the example benchmark is unrealistic). Most of the time concatenation is simpler, cleaner and much faster, for example when being used on a small number of longer strings. (p. 257)}
306In fact, you can use \mthind{SequenceableCollection class}{streamContents:} (mentioned on page \pageref{sec:streamContents}) to help you do this:
300Na verdade, você pode usar \mthind{SequenceableCollection class}{streamContents:} (mencionado na página \pageref{sec:streamContents}) para te ajudar a fazer isso:
307301
308302\begin{code}{}
309303String streamContents: [ :tempStream |
306306\end{code}
307307
308308%-----------------------------------------------------------------
309\subsection{Reading and writing at the same time}
309\subsection{Lendo e escrevendo ao mesmo tempo}
310310
311It's possible to use a stream to access a collection for reading and
312writing at the same time.
313Imagine you want to create an \ct{History} class which will manage
314backward and forward buttons in a web browser.
315A history would react as in figures from \ref{fig:emptyStream} to
316\ref{fig:page4}.
311É possível usar um fluxo para acessar uma coleção para leitura e escrita ao mesmo tempo.
312Imagine que você queira criar uma classe \ct{History} que irá gerenciar os botões ``voltar'' e ``avançar'' em um navegador web.
313O histórico reagiria de acordo com as figuras \ref{fig:emptyStream} a \ref{fig:page4}.
317314
318315\begin{figure}[!ht]
319316\centerline{\includegraphics[scale=0.5]{emptyStef}}
320\caption{A new history is empty. Nothing is displayed in the web browser.}
317\caption{O novo histórico está vazio. Nada é mostrado no navegador web.}
321318\label{fig:emptyStream}
322319\vspace{.2in}
323320\end{figure}
324321
325322\begin{figure}[!ht]
326323\centerline{\includegraphics[scale=0.5]{page1Stef}}
327\caption{The user opens to page 1.}
324\caption{O usuário abre a página 1.}
328325\label{fig:page1}
329326\vspace{.2in}
330327\end{figure}
331328
332329\begin{figure}[!ht]
333330\centerline{\includegraphics[scale=0.5]{page2Stef}}
334\caption{The user clicks on a link to page 2.}
331\caption{O usuário clica em um link para a página 2.}
335332\label{fig:page2}
336333\vspace{.2in}
337334\end{figure}
338335
339336\begin{figure}[!ht]
340337\centerline{\includegraphics[scale=0.5]{page3Stef}}
341\caption{The user clicks on a link to page 3.}
338\caption{O usuário clica em um link para a página 3.}
342339\label{fig:page3}
343340\vspace{.2in}
344341\end{figure}
345342
346343\begin{figure}[!ht]
347344\centerline{\includegraphics[scale=0.5]{page2_Stef}}
348\caption{The user clicks on the back button. He is now viewing page 2 again.}
345\caption{O usuário clica no botão ``voltar''. Ele está agora vendo a página 2 novamente.}
349346\label{fig:page2_}
350347\vspace{.2in}
351348\end{figure}
352349
353350\begin{figure}[!ht]
354351\centerline{\includegraphics[scale=0.5]{page1_Stef}}
355\caption{The user clicks again the back button. Page 1 is now displayed.}
352\caption{O usuário clica novamente no botão ``voltar''. A página 1 está agora sendo mostrada.}
356353\label{fig:page1_}
357354\vspace{.2in}
358355\end{figure}
359356
360357\begin{figure}[!ht]
361358\centerline{\includegraphics[scale=0.5]{page4Stef}}
362\caption{From page 1, the user clicks on a link to page 4. The history forgets pages 2 and 3.}
359\caption{Da página 1, o usuário clica em um link para a página 4. O histórico esquece das páginas 2 e 3.}
363360\label{fig:page4}
364361\vspace{.2in}
365362\end{figure}
366363
367This behaviour can be implemented using a \clsind{ReadWriteStream}.
364Este comportamento pode ser implementado sando um \clsind{ReadWriteStream}.
368365
369366\needlines{6}
370367\begin{code}{}
376376 stream := ReadWriteStream on: Array new.
377377\end{code}
378378
379Nothing really difficult here, we define a new class which contains a
380stream. The stream is created during the \ct{initialize} method.
379Nada de muito complicado aqui, apenas definimos uma nova classe que contém um fluxo. O fluxo é criado no método \ct{initialize}.
381380
382We need methods to go backward and forward:
381Nós precisamos de métodos para voltar e avançar:
383382
384383\begin{code}{}
385384History>>goBackward
386 self canGoBackward ifFalse: [self error: 'Already on the first element'].
385 self canGoBackward ifFalse: [self error: 'Ja estamos no primeiro elemento'].
387386 ^ stream back
388387
389388History>>goForward
390 self canGoForward ifFalse: [self error: 'Already on the last element'].
389 self canGoForward ifFalse: [self error: 'Ja estamos no ultimo elemento'].
391390 ^ stream next
392391\end{code}
393392
394Until then, the code was pretty straightforward. Now, we have to deal
395with the \ct{goTo:} method which should be activated when the user
396clicks on a link. A possible solution is:
393Até aqui, o código é bem simples. Agora, nós precisamos lidar com o método \ct{goTo:} que deve ser ativado quando o usuário clica em um link. Uma possível solução é:
397394
398395\begin{code}{}
399396History>>goTo: aPage
400397 stream nextPut: aPage.
401398\end{code}
402399
403This version is incomplete however. This is because when the user
404clicks on the link, there should be no more future pages to go to,
405\ie the forward button must be deactivated. To do this, the simplest
406solution is to write \ct{nil} just after to indicate the history end:
400Esta versão está incompleta, entretanto. Isso porque quando o usuário clicar em um link, não deve mais haver páginas a se visitar, \ie o botão ``avançar'' deve ser desabilitado. Para fazer isso, a solução mais simples é escrever \ct{nil} em seguida para indicar o fim do histórico:
407401
408402\begin{code}{}
409403History>>goTo: anObject
406406 stream back.
407407\end{code}
408408
409Now, only methods \ct{canGoBackward} and \ct{canGoForward} have to be
410implemented.
409Agora, os métodos \ct{canGoBackward} e \ct{canGoForward} precisam ser implementados.
411410
412A stream is always positioned between two elements. To go backward,
413there must be two pages before the current position: one page is the
414current page, and the other one is the page we want to go to.
411Um fluxo é sempre posicionado entre dois elementos. Para voltar, devem existir duas páginas anteriores à posição atual: uma página é a página atual, e a outra página é a página que queremos mostrar.
415412
416413\begin{code}{}
417414History>>canGoBackward
418418 ^ stream atEnd not and: [stream peek notNil]
419419\end{code}
420420
421Let us add a method to peek at the contents of the stream:
421Vamos adicionar um método para olhar o conteúdo do fluxo:
422422\begin{code}{}
423423History>>contents
424424 ^ stream contents
425425\end{code}
426426
427And the history works as advertised:
427E o histórico funciona como prometido:
428428\begin{code}{}
429429History new
430430 goTo: #page1;
437437\end{code}
438438
439439%=============================================================
440\section{Using streams for file access}
440\section{Usando fluxos para acessar arquivos}
441441
442442You have already seen how to stream over collections of elements. It's
443443also possible to stream over files on your hard disk.
toggle raw diff