\documentclass{beamer}

\usepackage{graphicx}

\mode<presentation>

\usepackage[portuguese]{babel}
\usepackage{pifont}
\usepackage{xspace}
\usepackage{graphicx}
\usepackage{algorithm}
\usepackage{algorithmic}

\title{Mais sobre Padr\~{o}es de Projeto}
\author{Fernando Magno Quint\~{a}o Pereira}
\date{\today}

\begin{document}

\begin{frame}
\titlepage
\end{frame}

\section{Level 1}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 1}
O que ser\'{a} impresso?
\begin{center}
\includegraphics[width=\linewidth]{images/doubleDisp}
\end{center}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 2}
\begin{itemize}
\item Quais crit\'{e}rios a m\'{a}quina virtual usa para resolver uma chamada?
\item Ser\'{a} que {\em double dispatch} faz falta?
\item Como simular {\em double dispatch}?
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 3 -- O que ser\'{a} impresso?}
Qual o tipo est\'{a}tico de {\em this}?
\begin{center}
\includegraphics[width=\linewidth]{images/doubleDisp2}
\end{center}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 4}
Desenhe o diagrama UML para as classes abaixo:
\begin{center}
\includegraphics[width=\linewidth]{images/composite_classes}
\end{center}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 5}
\begin{enumerate}
\item Que objeto est\'{a} sendo criado abaixo?
\item Projete e implemente uma forma de imprimir a descri\c{c}\~{a}o de todos
os items simples que fazem parte de um item composto.
\end{enumerate}
\begin{center}
\includegraphics[width=\linewidth]{images/composite_driver}
\end{center}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 6}
Em nosso jogo, {\em As Trilhas de Alucubaca}, existe o conceito de venda de
items.
Em determinadas regi\~{o}es do mundo virtual vivem {\em compradores}.
Estes s\~{a}o personagens que avaliam um item, e o compram pelo valor avaliado.


Implemente um programa para avaliar o valor de um item composto. Note que
neste caso, n\~{a}o estamos chamando o m\'{e}todo \texttt{getValue()} do item,
afinal, n\'{o}s temos nossa pr\'{o}pria tabela, por sinal com pre\c{c}os
menores para a compra, e pre\c{c}o maiores para a venda!
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 7}
Voc\^{e} deve ter notado um padr\~{a}o se formando:
\begin{itemize}
\item Para imprimir um item composto \'{e} necess\'{a}rio visitar todos os
itens.
\item Para computar o valor de um item composto \'{e} necess\'{a}rio visitar
todos os itens.
\item Algum outro exemplo?
\end{itemize}
Como implementar um ``visitante"?
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Behold ``El Visitante"}
\begin{center}
\includegraphics[width=0.7\linewidth]{images/visitor}
\end{center}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 8}
O padr\~{a}o \texttt{Visitor} separa o ato de percorrer a estrutura de dados
do ato de aplicar alguma a\c{c}\~{a}o sobre esta estrutura de dados.
\begin{itemize}
\item Quem percorre a estrutura de dados?
\item Quem aplica alguma a\c{a}\~{a}o sobre a estrutura de dados?
\end{itemize}
Logo, h\'{a} algumas perguntas fundamentais que devem ser respondidas:
\begin{enumerate}
\item Como implementar o c\'{o}digo que percorre a estrutura de dados?
\item Este c\'{o}digo dever\'{a} ser implementado de forma diferente para cada
visitante diferente?
\item Como passar o visitante para o dado sobre o qual ele atuar\'{a}?
\end{enumerate}

\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 9}
Implemente um programa para encontrar o item mais fr\'{a}gil que \'{e}
parte de um item composto. Este item \'{e} aquele cujo m\'{e}todo
\texttt{getHitPoints()} retorna o menor valor.
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 10}
Como o padr\~{a}o \texttt{Visitor} lida com mudan\c{c}as na
especifica\c{c}\~{a}o do programa?
\begin{enumerate}
\item Quais partes do programa est\~{a}o fechadas para o uso? Quais n\~{a}o
est\~{a}o?
\item O que \'{e} preciso ser feito se for necess\'{a}rio implementar um
outro visitante?
\item E se eu criar um item novo, o que acontecer\'{a}?
\item Qual a alternativa para quem n\~{a}o quer usar \texttt{visitor}s?
\end{enumerate}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 11}
\texttt{Visitor}s s\~{a}o muito utilizados no projeto de compiladores escritos
em linguagens orientadas por objetos.
\begin{enumerate}
\item Onde este padr\~{a}o entra, neste caso?
\item E se n\~{a}o quisermos usar visitors, como poder\'{i}amos proceder?
\item O que \'{e} melhor neste caso, os visitantes, ou os m\'{e}todos nos
itens?
\end{enumerate}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 12}
Vamos voltar ao projeto de nosso bom e velho \texttt{Builder}.
Normalmente, nosso c\'{o}digo conteria uma chamada assim:
\begin{center}
\texttt{Item treasure = (new TreasureBuilder()).getItem();}
\end{center}
Note que estamos instanciando um \texttt{Builder} sempre que precisamos obter
um item.
\begin{itemize}
\item  Seria poss\'{i}vel mover o c\'{o}digo de instancia\c{c}\~{a}o de
\texttt{Builder} para um objeto comum?
\item Qual a vantagem disto?
\end{itemize}
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 13}
Como garantir que o construtor de \texttt{Builder} n\~{a}o possa ser
chamado no escopo da classe \texttt{Driver}?
\end{frame}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}
\frametitle{Quest\~{a}o 14}
Todo o c\'{o}digo de instancia\c{c}\~{a}o de \texttt{Builder} est\'{a}
contido na mesma classe, por\'{e}m, agora corremos o risco de termos
v\'{a}rias inst\^{a}ncias de \texttt{BuilderFactory} espalhadas pelo nosso
programa:

\begin{center}
\texttt{treasure = (new BuilderFactory()).\\
getBuilder("treasure").getItem();}
\end{center}

Como refatorar o projeto de \texttt{BuilderFactory} para que, em qualquer
momento da vida da aplica\c{c}\~{a}o, exista somente uma inst\^{a}ncia desta
classe?
\end{frame}

\end{document}
