Commit 3e62da57e5db8075cf26c1f7299a8de7049fb841

[pt_BR] Done with 5.5 and a slice of 5.6

Commit diff

PortugueseBook/Model/Model.tex

 
617617Suporte à traits está sendo adicionado aos browsers atualmente.
618618
619619%=========================================================
620\section{Everything happens by message sending}
620\section{Tudo acontece por meio do envio de mensagens}
621621
622622%\ruleref{message}
623623
624This rule captures the essence of programming in \st.
625
626In procedural programming, the choice of which piece of code to execute when a procedure is called is made by the caller.
627The caller chooses the procedure or function to execute \emph{statically}, by name.
628
629In object-oriented programming, we do \emph{not} ``call methods'': we ``\subind{message}{send} messages.''
630The choice of terminology is significant.
631Each object has its own responsibilities.
632We do not \emph{tell} an object what to do by applying some procedure to it.
633Instead, we politely \emph{ask} an object to do something for us by sending it a message.
634The message is \emph{not} a piece of code: it is nothing but a name and a list of arguments.
635The receiver then decides how to respond by selecting its own \emph{method} for doing what was asked.
636Since different objects may have different methods for responding to the same message, the method must be chosen \emph{dynamically}, when the message is received.
624Esta regra captura a essencia da programação em \st.
625Em programação procedual, a escolha de qual porção de código a ser executada quando o procedimento
626é chamado é feito pelo chamador.
627O chamador escolhe o procedimento ou função a ser executado \emph{estaticamente}, por nome.
628
629Em programação orientada a objeto, nós \emph{não} ``chamamos métodos'': nós ``\index{mensagem!envio} enviamos mensagens''. A escolha da terminologia é significante.
630Cada objeto tem suas próprias responsabilidades.
631Nós não \emph{dizemos} à um objeto o que fazer aplicando um procedimento a ele.
632Ao invés disso, nós educadamente \emph{pedimos} à um objeto para fazer algo para nós enviando uma mensagem.
633A mensagem \emph{não} é uma porção de código: é apenas um nome e uma lista de argumentos.
634O receptor, então, decide como responder selecionando seu próprio \emph{método} para realizar o que foi pedido.
635Uma vez que diferentes objetos podem ter métodos diferentes para responder à mesma mensagem,
636o método deve ser escolhido \emph{dinamicamente}, quando a mensagem é recebida.
637637\begin{code}{@TEST}
6383 + 4 --> 7 "send message + with argument 4 to integer 3"
639(1@2) + 4 --> 5@6 "send message + with argument 4 to point (1@2)"
6383 + 4 --> 7 "envia a mensagem + com argumento 4 para o inteiro 3"
639(1@2) + 4 --> 5@6 "envia a mensagem + com argumento 4 para o ponto (1@2)"
640640\end{code}
641641\noindent
642As a consequence, we can send the \emph{same message} to different objects, each of which may have \emph{its own method} for responding to the message.
643We do not tell the \ct{SmallInteger} \ct{3} or the \ct{Point} \ct{1@2} how to respond to the message \ct{+ 4}.
644Each has its own method for \ct{+}, and responds to \ct{+ 4} accordingly.
645
646One of the consequences of \st's model of message sending is that it encourages a style in which objects tend to have very small methods and delegate tasks to other objects, rather than implementing huge, procedural methods that assume too much responsibility.
642Como conseqüência, nós podemos enviar a \emph{mesma mensagem} para diferentes objetos, cada qual
643pode ter \emph{seu próprio método} para responder à mesma mensagem.
644Nós não dizemos ao \ct{SmallInteger} \ct{3} ou o \ct{Point} \ct{1@2} como responder a mensagem \ct{+ 4}.
645Cada um tem seu próprio método para \ct{+}, e responde à \ct{+ 4} de acordo.
646
647Uma das conseqüências do modelo de envio de mensagens do \st é que ele encoraja um estilo em que
648objetos tendem a ter métodos muito pequenos e delegam tarefas à outros objetos, ao invés de implementar
649enormes métodos procedurais que assumem muita responsabilidade.
647650Joseph Pelrine
648651\ab{Citation?}
649652\on{sorry, just personal communication and my own lecture notes!}
650expresses this principle succinctly as follows:
651\important{Don't do anything that you can push off onto someone else.}
653expressa este princípio sucintamente como se segue:
654\important{Não faça nada que você possa delegar para qualquer outro.}
652655\index{Pelrine, Joseph}
653656
654Many object-oriented languages provide both static and dynamic operations for objects; in \st there are only dynamic message sends. Instead of providing static class operations, for instance, classes are objects and we simply send messages to classes.
657Muitas linguagens orientadas a objeto oferecem operações estáticas e dinâmicas para objetos; em \st
658existem apenas envio de mensagens dinâmicas. Ao invés de oferecer operações de classe estáticas, por exemplo,
659classes são objetos e nós simplesmente enviamos mensagens para as classes.
655660
656\emph{Nearly} everything in \st happens by message sends.
657At some point action must take place:
661\emph{Quase} tudo em \st acontece por envio de mensagens.
662Em algum momento, a ação deve acontecer:
658663\begin{itemize}
659 \item \emph{Variable declarations} are not message sends.
660 In fact, variable \subind{variable}{declaration}{}s are not even executable.
661 Declaring a variable just causes space to be allocated for an object reference.
662 \item \emph{Assignments} are not message sends.
663 An \ind{assignment} to a variable causes that variable name to be freshly bound in the scope of its definition.
664 \item \emph{Returns} are not message sends.
665 A \ind{return} simply causes the computed result to be returned to the sender.
666 \item \emph{Primitives} are not message sends.
667 They are implemented in the \ind{virtual machine}.
668 \index{primitive}
664 \item \emph{Declaração de variáveis} não são envios de mensagens.
665 De fato, \subind{variável}{declaração} de variáveis nem são executáveis.
666 Declarar uma variável apenas aloca espaço para uma referência à um objeto.
667 \item \emph{Atribuições} não são envios de mensagens.
668 Uma \ind{atribuição} à uma variável associa o nome da variável no escopo de sua definição.
669 % FIXME: en_US(freshly bound) == pt_BR(?)
670 \item \emph{Retornos} não são envios de mensagens.
671 Um \ind{retorno} apenas retorna o resultado computado para o remetente da mensagem.
672 \item \emph{Primitivas} não são envios de mensagens.
673 Elas são implementadas na \ind{máquina virtual}.
674 \index{primitiva}
669675\end{itemize}
670Other than these few exceptions, pretty much everything else does truly happen by sending messages.
671In particular, since there are no ``public fields'' in \st, the only way to update an \ind{instance variable} of another object is to send it a message asking that it update its own field.
672Of course, providing setter and getter methods for all the instance variables of an object is not good object-oriented style.
673Joseph Pelrine also states this very nicely:
674\important{Don't let anyone else play with your data.}
676Além destas poucas exceções, tudo o mais realmente acontece por envio de mensagens.
677Em particular, já que não há ``campos públicos'' em \st, a única forma de atualizar uma
678\ind{variável de instância} de outro objeto é enviando uma mensagem a ele pedindo para
679que atualize seu próprio campo.
680Obviamente, oferecer métodos \emph{setter} e \emph{getter} para todas as variáveis de instância
681de um objeto não é um bom estilo de orientação a objeto.
682Joseph Pelrine também coloca isso muito bem:
683\important{Não deixe que ninguém mais brinque com seus dados.}
675684
676685%=========================================================
677\section{Method lookup follows the inheritance chain}
686\section{A busca de método segue a cadeia de herança}
687%FIXME: en_US(lookup) == pt_BR(?)
678688
679689%\ruleref{lookup}
680690
681What exactly happens when an object receives a message?
691O que exatamente acontece quando um objeto recebe uma mensagem?
682692
683The process is quite simple:
684the class of the receiver looks up the method to use to handle the message.
685If this class does not have a method, it asks its \ind{superclass}, and so on, up the \ind{inheritance} chain.
686When the method is found, the arguments are bound to the parameters of the method, and the \ind{virtual machine} executes it.
687\index{method!lookup}
693O processo é bem simples:
694a classe do receptor busca o método a ser utilizado para lidar com a mensagem.
695Se a classe não tem o método, ela pede a sua \ind{superclasse}, e assim por diante, subindo
696na cadeia hierárquica.
697Quando o método é encontrado, os argumentos são associados aos parâmetros do método, e a
698\ind{máquina virtual} a executa.
699\index{método!busca}
688700
689It is essentially as simple as this.
690Nevertheless there are a few questions that need some care to answer:
701É essencialmente tão simples quanto isso.
702No entanto, existem algumas questões que precisam de alguns cuidados ao serem respondidas:
691703
692704\begin{itemize}
693 \item \emph{What happens when a method does not explicitly return a value?}
694 \item \emph{What happens when a class reimplements a superclass method?}
695 \item \emph{What is the difference between \pvind{self} and \pvind{super} sends?}
696 \item \emph{What happens when no method is found?}
705 \item \emph{O que acontece quando um método não retorna explicitamente um valor?}
706 \item \emph{O que acontece quando a classe reimplementa o método da superclasse?}
707 \item \emph{Qual é a diferença entre \pvind{self} e \pvind{super} \emph{sends}?}
708 \item \emph{O que acontece quando nenhum método é encontrado?}
697709\end{itemize}
698710
699The rules for method lookup that we present here are conceptual: virtual machine implementors use all kinds of tricks and optimizations to speed-up method lookup.
700That's their job, but you should never be able to detect that they are doing something different from our rules.
701% Whatever the implementation does, these rules will give you a clear understanding of the semantics of sending messages to \self and \super.
711As regras para busca de métodos que nós apresentamos são conceituais: implementadores de máquinas
712virtuais usam todo tipo de truques e otimizações para aumentar a velocidade da busca de métodos.
713Este é o trabalho deles, mas você nunca deve ser capaz de detectar que eles estão fazendo
714algo diferente com nossas regras.
702715
703First let us look at the basic lookup strategy, and then consider these further questions.
716Primeiro, vamos observar as estratégias básicas de busca, e então, considere estas questões.
704717
705718%---------------------------------------------------------
706\subsection{Method lookup}
707Suppose we create an instance of \ct{EllipseMorph}.
719\subsection{Busca de métodos}
720Suponha que nós criamos uma instância de \ct{EllipseMorph}.
708721\begin{code}{@TEST | anEllipse |}
709722anEllipse := EllipseMorph new.
710723\end{code}
711724\noindent
712If we now send this object the message \ct{defaultColor}, we get the result \ct{Color yellow}:
725Se nós enviarmos à este objeto a mensagem \ct{defaultColor}, nós recebemos \ct{Color yellow} como resultado:
713726\begin{code}{@TEST | anEllipse | anEllipse := EllipseMorph new.}
714727anEllipse defaultColor --> Color yellow
715728\end{code}
716729\noindent
717The class \ct{EllipseMorph} implements \ct{defaultColor}, so the appropriate method is found immediately.
730A classe \ct{EllipseMorph} implementa \ct{defaultColor}, portanto o método apropriado é encontrado imediatamente.
718731
719\begin{method}[defaultColor]{A locally implemented method}
732\begin{method}[defaultColor]{Um método implementado localmente}
720733EllipseMorph>>>defaultColor
721 "answer the default color/fill style for the receiver"
734 "responde o estilo de cor/preenchimento padrao para o receptor"
722735 ^ Color yellow
723736\end{method}
737%FIXME: "padrao" sem acento
724738\cmindex{EllipseMorph}{defaultColor}
725739
726In contrast, if we send the message \ct{openInWorld} to \ct{anEllipse}, the method is not immediately found, since the class \ct{EllipseMorph} does not implement \ct{openInWorld}.
727The search therefore continues in the superclass, \lct{BorderedMorph}, and so on, until an \ct{openInWorld} method is found in the class \ct{Morph} (see \figref{openInWorldLookup}).
740Em contraste, se nós enviarmos a mensagem \ct{openInWorld} para \ct{anEllipse}, o método não
741é encontrado imediatamente, uma vez que a classe \ct{EllipseMorph} não implementa \ct{openInWorld}.
742A busca, portanto, continua na superclasse, \lct{BorderedMorph}, e assim por diante, até que
743um método \ct{openInWorld} seja encontrado na classe \ct{Morph} (ver \figref{openInWorldLookup}).
728744
729\begin{method}[openInWorld]{An inherited method}
745\begin{method}[openInWorld]{Um método herdado}
730746Morph>>>openInWorld
731 "Add this morph to the world. If in MVC, then provide a Morphic window for it."
747 "Adiciona este morph ao mundo. Se em um MVC, entao oferece uma Morphic window para ele."
732748 self couldOpenInMorphic
733749 ifTrue: [self openInWorld: self currentWorld]
734750 ifFalse: [self openInMVC]
735751\end{method}
752%FIXME: "entao" sem acento
736753\cmindex{Morph}{openInWorld}
737754
738755\begin{figure}[htb]
757757\ifluluelse
758758 {\includegraphics[width=\textwidth]{openInWorldLookup}}
759759 {\includegraphics[width=0.8\textwidth]{openInWorldLookup}}
760\caption{Method lookup follows the inheritance hierarchy.\label{fig:openInWorldLookup}}
760\caption{A busca de métodos segue a hierarquia de herança.\label{fig:openInWorldLookup}}
761761\end{center}
762762\end{figure}
763763
toggle raw diff