<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>orientacao-a-objetos &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/orientacao-a-objetos/</link>
	<description>Feed of posts on WordPress.com tagged "orientacao-a-objetos"</description>
	<pubDate>Sun, 20 Jul 2008 00:14:38 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Falhas no ensino de Orienta&ccedil;&atilde;o a Objetos]]></title>
<link>http://devblogs.wordpress.com/2008/06/29/falhas-no-ensino-de-orientao-a-objetos/</link>
<pubDate>Sun, 29 Jun 2008 12:30:50 +0000</pubDate>
<dc:creator>Evandro Rosa Santos</dc:creator>
<guid>http://devblogs.wordpress.com/2008/06/29/falhas-no-ensino-de-orientao-a-objetos/</guid>
<description><![CDATA[O Blog Fragmental é uma fonte de informações importantes para muitos desenvolvedores e em uma mar]]></description>
<content:encoded><![CDATA[<p>O <a href="http://blog.fragmental.com.br/">Blog Fragmental</a> é uma fonte de informações importantes para muitos desenvolvedores e em uma maravilhosa seqüência de textos e posts o autor apresentou um pouco das falhas no ensino da Orientação a Objetos que tanto atrapalha os desenvolvedores Java.</p>
<p>No post <a href="http://blog.fragmental.com.br/2008/05/18/objetos-nao-sao-atributos-funcoes/">Objetos não são atributos + funções</a> o autor apresenta de uma forma bastante humorada os grandes problemas do ensino da Orientação a Objetos para pessoas que já tiveram experiência em programação procedural. Talvez esse seja um dos principais motivos que fazem com que alguns dos desenvolvedores da linguagem C odeiem a linguagem Java.</p>
<p>Existe também o wiki <a href="http://fragmental.com.br/wiki/index.php/Evitando_VOs_e_BOs">Evitando VOs e BOs</a> onde existe uma crítica do autor ao modelo de programação OO que foi utilizado inicialmente no desenvolvimento EJB: o "Modelo de Objeto Anêmico". Apesar de todos os problemas encontrados, esse modelo de desenvolvimento Java é utilizado até hoje.</p>
<p>O ensino de Orientação Objetos tem muitas falhas, mas com esses textos é possível perceber se você está ou não  no caminho certo.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Orientação a objetos com python para iniciantes]]></title>
<link>http://medeubranco.wordpress.com/?p=32</link>
<pubDate>Sun, 22 Jun 2008 03:48:44 +0000</pubDate>
<dc:creator>medeubranco</dc:creator>
<guid>http://medeubranco.wordpress.com/?p=32</guid>
<description><![CDATA[Python é uma linguagem orientada a objetos. Nos artigos anteriores, não usei essa característica ]]></description>
<content:encoded><![CDATA[<p>Python é uma linguagem orientada a objetos. Nos artigos anteriores, não usei essa característica da linguagem para manter o "direto ao ponto". </p>
<p>Este artigo é para quem ainda não sabe nada de OOP (ou <a href="http://pt.wikipedia.org/wiki/POO">POO</a>), como é o caso do colega que o motivou.</p>
<p>Indo direto ao ponto, vamos pegar um "objeto" conhecido e criar uma classe que o represente.</p>
<p>A nossa classe vai contemplar seus atributos e seu comportamento (o que o nosso objeto faz).</p>
<p>Nosso objeto vai ser a tia velha. Seus atributos serão o nome e idade (que faz dela tia velha), além das coisas que ela fala (coisas típicas de tia). Seu comportamento, ou ação, é falar aleatoriamente as coisas que toda tia velha fala. </p>
<p>Repare que o que foi dito sobre a classe "tia velha" se aplica a toda e qualquer tia velha, independente de nome, idade ( pode ter tia velha de vinte e poucos anos, acredite ) ou de quem é o sobrinho.</p>
<p>vamos ao código</p>
<pre>
<pre>
<pre>
<pre>
<pre>[sourcecode language='python']
import random

# inicio da definicao da classe
class TiaVelha:
    def __init__(self, nome, idade):
        """
        inicializador da classe.
        cada tia velha criada
        serah criada por este metodo init
        """

        #definindo os atributos
        self.nome=nome
        self.idade=idade
        self.frases=[]

        #criando o repertorio de frases
        self.frases.append( "Como voce cresceu!" )
        self.frases.append( "Voce precisa arrumar uma namoraaaada!" )
        self.frases.append( "Voce ainda nao arrumou emprego?!!" )
        self.frases.append( "Respeita sua mae, menino!" )
        self.frases.append( "Gracinha!" )

    def falar(self):
        """
        metodo principal da tia velha
        """
        x=len(self.frases)
        n=int(random.random()*x-1)
        print self.frases[n]

    def apresentar_se(self):
        print   """
                Ola.
                Meu nome eh """ + self.nome + """
                e tenho """ + str(self.idade)  + """ anos.
                Sou uma tia velha e o que mais faco eh falar
                """

# o codigo abaixo somente
# sera executado se este
# arquivo for executado
# diretamente.
#
# nao o serah se a classe
# TiaVelha for importada
# para dentro de outro
# programa python
if __name__=='__main__':

    # criando uma 'nova' tia velha
    # com nome 'Odila' e idade 67
    # eh neste momento que __init__()
    # serah chamado
    odila=TiaVelha('Odila',67)

    # executando um metodo
    odila.apresentar_se()

    print
    print
    print

    # fazendo a tia odila falar 15 vezes
    for x in range(15):
        odila.falar()
[/sourcecode]</pre>
</pre>
</pre>
</pre>
</pre>
<p>A linha 1 <code>import random</code> só entrou neste programa porque no método <b>falar(self)</b> foi preciso usar números aleatórios.</p>
<p>Explicar o resto acho que é redundância.</p>
<p>Este artigo teve a intenção de apresentar orientação a objetos a quem ainda nada sabia a respeito.</p>
<p>Pesquisa e treinamento são necessários para se aprofundar no assunto.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[OOP "PHP Orientado a Objetos"]]></title>
<link>http://pupillomaster.wordpress.com/?p=10</link>
<pubDate>Sat, 07 Jun 2008 20:18:05 +0000</pubDate>
<dc:creator>pupillomaster</dc:creator>
<guid>http://pupillomaster.wordpress.com/?p=10</guid>
<description><![CDATA[Fala galera, estou postando ai mais uma ajuda pra todos vocês, eu estou atualmente estudando Orient]]></description>
<content:encoded><![CDATA[<p><span style="color:#ff0000;"><strong>Fala galera,</strong></span> estou postando ai mais uma <span style="color:#ff0000;"><strong>ajuda pra todos vocês</strong></span>, eu estou atualmente estudando Orientação a Objetos, ou seja <span style="color:#3366ff;"><span style="text-decoration:underline;"><em><strong>descobri o "PARAíSO"</strong></em></span></span> :-D , depois de muito tempo no <span style="color:#ff0000;"><span style="text-decoration:underline;"><em><strong>"INFERNO"</strong></em></span></span>... :-o .</p>
<p>Opa, calma pessoal não é o que vocês estão pensando, deixa eu me explicar.</p>
<p>A maioria dos programadores de <span style="color:#ff0000;"><strong>&#60;? PHP ?&#62; </strong></span>não se preocupam em <strong><span style="color:#ff0000;">separar a programacão do design</span></strong> , aliás não só de <span style="color:#ff0000;"><strong>&#60;? PHP ?&#62;</strong></span>, muitos programadores até pela pressa de acabar um projeto não se preocupam com isso, eu fui um desses... , e quero que todos vocês conheçam o <em><span style="color:#3366ff;"><span style="text-decoration:underline;"><strong>"CÉU"</strong></span></span></em> tambem, afinal, <strong>Deus disse:</strong></p>
<p><em><span style="color:#ff6600;"><strong>_Amai aos outros como a si mesmo.</strong></span></em></p>
<p>A <strong><span style="color:#ff0000;">programação é uma arte</span></strong> então cuide dela como se fosse você.</p>
<p><span style="color:#ff0000;"><em><strong>PS:</strong></em></span> É claro se você não for um suicida, :-D , brincadeirinha.</p>
<p>Estou colocando uma nova apostila de <span style="color:#ff0000;"><strong>&#60;? PHP ?&#62;</strong></span> <span style="color:#ff0000;"><strong>Orientado a Objetos</strong></span>, que o pessoal da <strong>UNICAMP</strong> desenvolveu, é uma ótima forma de começar a se <strong>"redimir"</strong>.</p>
<p>Espero que todos os programadores, tenham essa <span style="color:#ff0000;"><strong>consciênçia de organização</strong></span>. ;-) .Valeu</p>
<p>Abraço a todos e até a próxima.</p>
<p><a title="Apostila de PHP Orientado a Objetos de A a Z" href="http://www.4shared.com/file/50212415/adc3a133/apostila_php_avancado_By_marcelo_spider.html?dirPwdVerified=7e8873d2" target="_blank"><span style="color:#ff6600;">Clique aqui para baixar a apostila</span></a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[GF® Livros® 2008 - Sistema de automação para livrarias.]]></title>
<link>http://bsideias.wordpress.com/?p=169</link>
<pubDate>Thu, 29 May 2008 06:14:49 +0000</pubDate>
<dc:creator>bsideias</dc:creator>
<guid>http://bsideias.wordpress.com/?p=169</guid>
<description><![CDATA[

Estou finalizando este que é mais um projeto de faculdade chamado GF®  Livros® 2008, uma ]]></description>
<content:encoded><![CDATA[<p style="text-align:center;"><a href="http://PostURL" target="_blank"></a></p>
<p style="text-align:center;"><strong></strong><a href="http://bsideias.wordpress.com/files/2008/05/gf-livros-lancamento.jpg"><img class="size-medium wp-image-170 alignleft" style="float:left;" src="http://bsideias.wordpress.com/files/2008/05/gf-livros-lancamento.jpg?w=300" alt="" width="205" height="203" /></a></p>
<p style="text-align:justify;">Estou finalizando este que é mais um projeto de faculdade chamado GF®  Livros® 2008, uma aplicação que automatiza livrarias.  A aplicação foi desenvolvida usando a linguagem de programação C# e arquivos xml, não consta banco de dados pois o intuito da grade semestral era apresentar a serialização de objetos em arquivos xml fazendo assim  a persistência dos dados. O projeto conta com a junção de quatro matérias que são programação orientada a objetos, algoritmos e programação 3, probabilidade e estatística e estrutura de dados. O projeto terá uma vida de construção por volta de seis meses e teria muito a melhorar  se o mesmo trabalho e empenho continuassem a serem aplicados. A data de lançamento será dia 14/06/08 sem horário definido. Mas nete dia ele será apresentado na faculdade de manhã mostrando pela primeira vez ao mundo sua cara. Ao lado segue duas imagens da aplicação. Uma é a tela de login e a outra a tela de cadastro de livros. Como os projetos da turma ainda estão em fase de construção, não irei liberar muitos detalhes (técnicos) sobre a aplicação. Não que eu não queira ajudar, prefiro ajudar a deixar meu esforço ser colado. :)  </p>
<p style="text-align:justify;"><strong></strong> Neste projeto também vejo um produto que teria como ganhar muito mercado e assim render muita grana, mas antes precisaria de uma pequena injeção de capital para que continuasse a ser desenvolvido. Gosto de brincar com essas idéias de "ver um produto", até porque não subestimo os universitários, são deles e de seus trabalhos que muitas vezes surgem as grandes oportunidades e idéias existentes.</p>
<p style="text-align:justify;"><strong>Tópicos que o sistema atende</strong></p>
<ul>
<li>
<div style="text-align:justify;">
<div>Interface amigável</div>
</div>
</li>
<li>
<div style="text-align:justify;">Acesso a WebServices</div>
</li>
<li>Controle de acesso</li>
<li>
<div style="text-align:justify;">Controle de estoque</div>
</li>
<li>
<div style="text-align:justify;">Controle de vendas</div>
</li>
<li>Estatísticas de acessos ao sistema, entrada e saída de produtos são adiquiridas da exportação de valores em arquivos CSV (<a href="http://en.wikipedia.org/wiki/Comma-separated_values" target="_blank">Comma Separated Values</a>) </li>
<li>*O usuário determina qual estrutura de dados a aplicação vai usar entre árvores AVL ou <a href="http://bsideias.wordpress.com/2008/03/11/lista-ligada/" target="_blank">listas ligadas</a>.</li>
</ul>
<p><strong>O que mais poderia ser implementado?</strong></p>
<ul>
<li>Banco de dados (Para funcionar em livrarias de médio porte acima)</li>
<li>Controle de outros subsistemas a ele ligado (Terminais de consulta sobre livros dentro de uma livraria)</li>
<li>Design profissional</li>
<li>Gráficos para mostrar um balanço dos fluxos de caixa amigavél</li>
<li>Gráficos para mostrar as melhores e piores vendas</li>
<li>Gráficos para mostrar tendências de maximização dos lucros (A parte que se eu consseguir fazer ficara muito legal onde o objetivo é que o sistema reconheça para onde deve ir o dinheiro investido na livraria, garantindo assim um lucro no mínimo, mínimo, só que previsto antes)</li>
<li>Opções de customização para o cliente</li>
</ul>
<p> </p>
<p>*Obs: A estrutura de dados também foi construida, ou seja não foi usada estruturas de dados prontas como LinkedList em C#.</p>
<p>Então lembre-se dia 14/06/08 é o lançamento.</p>
<p>UltraG</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Princípios de Projetos Orientado a Objeto]]></title>
<link>http://msgorgonho.wordpress.com/?p=5</link>
<pubDate>Wed, 21 May 2008 14:57:27 +0000</pubDate>
<dc:creator>Marcondes Gorgonho</dc:creator>
<guid>http://msgorgonho.wordpress.com/?p=5</guid>
<description><![CDATA[O tempo de vida do desenvolvimento de um sistema é dividido em uma média de 20% na sua elaboraçã]]></description>
<content:encoded><![CDATA[<p>O tempo de vida do desenvolvimento de um sistema é dividido em uma média de 20% na sua elaboração e criação e 80% em sua manutenção. Com isso, não existe duvidas que é de fundamental importância à construção de uma correta arquitetura, uma vez que a certeza é que a maior parte do investimento será empenhada na manunteção.</p>
<p>A única constante real no desenvolvimento de software é a sua continua MUDANÇA. Uma das melhores maneiras de se verificar se um software foi bem projetado é medindo o grau de dificuldade de alterar ou adicionar novos requisitos.</p>
<p>Um software que não é bem projetado desaba nos primeiros sinais de mudança, em contra partida, um grande software pode ser facilmente alterado.</p>
<p>Um software altamente flexível não é criado da noite para o dia, os princípios de projetos OO devem ser aplicados à arquitetura do sistema de forma iterativa visando este objetivo. Mesmo após a arquitetura do sistema estabelecida, nunca tenha medo de aperfeiçoá-las, mesmo que isso signifique retroceder, uma vez que isto resultara em uma significativa economia a longo prazo.</p>
<p><strong>AGREGAÇÃO SIMPLES E POR COMPOSIÇÃO</strong></p>
<p>- Fundamento mais básico da programação OOP, sendo que um modelo de domínio OO (Domain Model) é elaborado e construído com único objetivo fazer os objetos existentes se relacionar para promover um serviço maior.</p>
<p>- É a forma mais simples e utilizada para relacionados dos objetos de um sistema.</p>
<p>- <strong>Agregação</strong> <strong>simples</strong> é quando um objeto é usado como parte de outro objeto, mas ainda sim ele existe, sobrevive e pode ser usada fora do objeto encapsulador.</p>
<p>- <strong>Agregação por composição</strong> é quando um objeto é criado e usado somente como parte de outro objeto maior. O objeto parte não pode sobreviver ou ser utilizada sem o objeto parte agregador.</p>
<p><strong>HERANÇA COM CLASSES ABSTRATAS OU CONCRETAS</strong></p>
<p>- Utilizadas para agrupar características e comportamentos concretos ou abstratos de inúmeros tipos semelhantes.</p>
<p>- Utilizados unicamente para agregar características e/ou comportamentos semelhantes encontrados em vários objetos diferentes com o objetivo de evitar duplicação de código na codificação dos mesmos.</p>
<p>- Muito conhecido como principio de projeto “Aberto-Fechado” que significa que a classe esta fechada para alteração, uma vez ela foi implementada e testada, mas que pode ser facilmente estendida por classes filhas e alteradas via métodos subscritos usando chamadas de métodos polimórficos.</p>
<p>- A referencia do pai deve ser capaz de apontar para o filho e executar as mesmas operações polimorficas semanticamente equivalentes (IS A), se caso isso não acontecer, o caso não é de herança.</p>
<p><strong>ENCAPSUALMENTO</strong></p>
<p>- Colocar em um lugar único os códigos duplicados existentes.</p>
<p>- Ajuda a proteger suas classes de alterações necessárias.</p>
<p>- Responsável pela prevenção de problemas de manutenção de qualquer outro principio OOP.</p>
<p>- Localiza a alterações necessárias ao comportamento de um objeto na qual ele possa variar.</p>
<p>- <strong>Pode ser usado como:</strong></p>
<p>1. Override de métodos herdados, cada classe anula o do pai, alterando dentro do próprio objeto como lhe é devido.</p>
<p>2. Criando uma outra classe semanticamente correta que agrege o determinado comportamento, criando agregações em outras classes.</p>
<p>- Muito conhecido como principio de projeto “Dry” utilizado para ter cada informação e seus comportamentos em um lugar único e sensato lugar dentro da aplicação, fazendo com que os requisitos sejem implementados somente uma vez.</p>
<p><strong>CODIFICANDO PARA INTERFACES</strong></p>
<p>- Codificar para interface ao invés de implementação (classes) é utilizado quando se precise implementar algo com tarefa dupla:</p>
<p>1. Definir comportamento semelhante para vários tipos diferentes.</p>
<p>2. Ser utilizado como foco principal de outras classes que usam esses tipos (ponteiros polimórficos)</p>
<p>- Torna o código totalmente flexível muito mais fácil de estender.</p>
<p>- Funcionara com todas as subclasses da interface, até mesmo com aquelas que ainda não foram criadas.</p>
<p>- Sempre use preferencialmente parâmetros e agregações simples ou por composição para objetos polimórficos, sendo ponteiros para interfaces, classes abstratas ou até superclasses concretas.</p>
<p><strong>DELEGAÇÃO</strong></p>
<p>- È o ato de um objeto encaminhar para outro objeto a responsabilidade da implementação de uma operação que deveria ser executada pelo primeiro. O equals() é um exemplo comum de delegação......Por que outros objetos podem precisar identificar se um determinado objeto é igual ao outro, mas quem faz isso é o próprio objeto comparado e não aquele que deseja saber a resposta (que deveria ser o cara que deveria implementar isso.).</p>
<p>- È utilizado para implementar aplicações 'livremente unidas'.</p>
<p>- É outra opção comparada com a herança. Uma classe não precisa herdar de outra, ele pode simplesmente agregar objeto e delegar as funções a ele.</p>
<p>- Usado em casos nos quais uma classe precisa apresentar os mesmos comportamentos de uma família de classes, porém ela não pode ser herdada da classe pai pelo fato dela não pertencer à hierarquia de classes.</p>
<p>- Usado em casos onde uma classe necessite usar uma funcionalidade de outra classe com algumas modificações, mas que não deseje alterá-la por outras dependências. Considere uso de delegação, crie uma classe terceira, agrege objeto da classe com a funcionalidade e acrescente nesta classe a terceira o comportamento diferencial.</p>
<p><strong>PROPRIEDADES DINÂMICAS</strong></p>
<p>- Quando existir a necessidade de criar varias sub-classes por causa de propriedades altamente dinâmicas, pode user usado uma coleção Map para implementar este comportamento. Isso evitara alterações e refatorações no projeto quando existir a necessidade de adicionar novos tipos com novos conjuntos de propriedades.</p>
<p><strong>UM MOTIVO PARA MUDAR (Coesão)</strong></p>
<p>- Uma classe deve ser implementada com apenas um único objetivo – Representar a implementação de uma abstração do mundo real.</p>
<p>- Quando uma classe possui mais que um motivo para ser alterada é por que provavelmente ela esta fazendo mais coisas do que devida, ou seja, ela esta agregando mais de um objetivo.</p>
<p>- Analise bem e divida em varias classes diferentes de forma que cada classe tenha apenas um motivo para ser alterada. Isso estará minimizando as chances de que uma classe tenha mudar ao reduzir o numero de coisas de possa causar sua alteração.</p>
<p>- Muito conhecido como principio da responsabilidade única (SRP ou Coesão) e esta intimamente relacionado com o principio Dry.</p>
<p><strong>COESÃO</strong></p>
<p>- A coesão mede o grau de conectividade entre os elementos de único modulo, classe ou objeto. Quanto maior a coesão de seu software, mais bem definidas e relacionadas serão as responsabilidades de cada classe individual da aplicação. Cada classe possui um conjunto especifico de ações que devem ser executadas por ela que é única razão de sua existência.</p>
<p>- Uma classe coesiva faz apenas “uma coisa bem feita” e não tenta fazer ou ser alguma outra coisa ao mesmo tempo. Classes coesivas se concentram em tarefas específicas, não assumindo ou fazendo papeis de outros. Quanto mais coesivas são suas classes, mais livre será a união entre as classes.</p>
<p>- Sempre que existir a necessidade de alteração no software dentro do ciclo de vida, sempre caminhe no sentido de aumentar a coesão das classes do projeto.</p>
<p><strong>OBSERVAÇÔES</strong></p>
<p>A herança, agregação e composição são técnicas que permitem a reutilização de código. Entretanto, escolha a <em>DELEGAÇÃO</em> e <em>COMPOSIÇÃO</em> ao invés da <em>HERANÇA</em> que a arquitetura será bem mais flexível, fácil de manter, estender e reutilizar.</p>
<p>Espero ter contribuído para um mundo OO melhor.</p>
<p>Abraço a todos.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Aprenda Python]]></title>
<link>http://junk4all.wordpress.com/?p=236</link>
<pubDate>Tue, 29 Apr 2008 23:38:56 +0000</pubDate>
<dc:creator>victorwestmann</dc:creator>
<guid>http://junk4all.wordpress.com/?p=236</guid>
<description><![CDATA[Se voce tem interesse em python mas não sabe por onde começar o link desta empresa pode ser ouro:
]]></description>
<content:encoded><![CDATA[<p>Se voce tem interesse em python mas não sabe por onde começar o link desta empresa pode ser ouro:</p>
<p><a href="http://www.async.com.br/projects/python/pnp/python.html" target="_blank"><strong>Python na Prática: Um curso objetivo de programação em Python</strong></a></p>
<p>Vantagens da linguagem python</p>
<ol>
<li>Simples. Python é fácil de aprender a usar.</li>
<li>Diversos frameworks web para facilitar a sua vida.</li>
<li>Reutilização de código.</li>
<li>Multiparadigma: funciona como uma linguagem estruturada, orientada a objetos ou ainda como uma linguagem funcional.</li>
<li>Documentação. Python é extensamente documentada.</li>
<li>Portabilidade. Python roda em Windows, Linux, Mac e até em celulares!</li>
<li>IDEs livres. Python pode rodar através da IDE do Netbeans, do Eclipse e muitas outras.</li>
<li>Multiplataforma. Escreva um aplicativo, gráfico inclusive, em Linux e rode-o em Windows e Mac sem alterar o código.</li>
<li>Legibilidade do código. Programadores python são fanáticos por boas práticas de programação e a linguagem também força uma escrita de seus programas de uma forma limpa, clara e elegante.</li>
<li>Diversos módulos com muita coisa pronta.</li>
</ol>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Viva os objetos]]></title>
<link>http://alexandrems.wordpress.com/?p=5</link>
<pubDate>Tue, 08 Apr 2008 20:45:05 +0000</pubDate>
<dc:creator>alexandrems</dc:creator>
<guid>http://alexandrems.wordpress.com/?p=5</guid>
<description><![CDATA[Nos primeiros anos da minha faculdade e quando estudava processamento de dados no 2º grau (Cobol na]]></description>
<content:encoded><![CDATA[<p>Nos primeiros anos da minha faculdade e quando estudava processamento de dados no 2º grau (Cobol na veia). Eu nem imaginava o que era a tal de programação orientada a objetos. Quando me falaram que esse treco era uma tendencia, eu fiquei meio assustado porque antigamente sentia dificuldade em mudar e aprender coisas novas.</p>
<p>Mas virei "omi", botei as "cara" e resolvi aprender esse tal de objetos. Comecei mexendo com Java para me obrigar a programar OO. Dai passei para o PHP, foi uma maravilha, varias classes, métodos, atributos, carro liga, carro desliga, carro é do tipo automóvel e a  moto também é. Mas ainda assim eu fazia muitas coisas estruturadas.  Então aprendi um pouco sobre UML, opa ai o negócio ficou mais bunitinho. 'Deseinhos' antes de escrever uma linha de código, coisa fina. Meus código estruturados foram desaparencendo.</p>
<p>E também surgiu na minha vida os Padrões de Projetos (<em>Designers Patterns</em>). Também de inicio foi meio complicado de enteder que diabos era isso, na verdade eu achava que era um treco muito foda por isso não entendia. Mas é algo teóricamente simples, não tem segredos. Assim meus códigos foram evoluindos e prova disso foi exatamente hoje.</p>
<p>Tive que incluir um campo em uma tabela de um sistema, só que esta tabela é básicamente a principal do sistema, entao fiquei algumas horas pensando a melhor maneira de inserir esse campo, e não foi tão dificil assim, além de incluir na tabela fiz o mesmo no mapeamento, mexi em 3 métodos de classes diferentes e vuala, funcionando perfeitamente. Viva a orientação a objetos :)</p>
<p>Por isso vou contribuir com links interessantes sobre Orientação a Objetos:<br />
<a href="http://www.dca.fee.unicamp.br/cursos/POOCPP/node3.html" target="_blank">unicamp:</a> Bom tutorial sobre OO.<br />
<a href="http://www.adianti.com.br/phpoo" target="_blank">PHP Programando com Orientação a Objetos :</a> Esse eu tenho e recomendo.<br />
<a href="http://www.mundooo.com.br" target="_blank">MundoOO</a> : Tudo sobre Orientação a Objetos.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Curso sobre PHP Orientado a Objeto]]></title>
<link>http://caironoleto.wordpress.com/?p=32</link>
<pubDate>Wed, 12 Mar 2008 12:43:54 +0000</pubDate>
<dc:creator>Cairo Noleto</dc:creator>
<guid>http://caironoleto.wordpress.com/?p=32</guid>
<description><![CDATA[Parece que o PHP vai ser torna mais e mais minha linguagem favorita de desenvolvimento.
Essa semana ]]></description>
<content:encoded><![CDATA[<p>Parece que o PHP vai ser torna mais e mais minha linguagem favorita de desenvolvimento.</p>
<p>Essa semana na faculdade, vou iniciar um "curso" sobre como utilizar o PHP Orientado a Objetos para alguns alunos do curso que precisam dela para seus trabalhos de diplomação.</p>
<p><!--more--></p>
<p>Resolvi procurar um livro na Biblioteca  sobre PHP, e achei <a href="http://www.submarino.com.br/books_productdetails.asp?Query=ProductPage&#38;ProdTypeId=1&#38;ProdId=21199314&#38;ST=SR&#38;franq=215329" title="Livro no Submarino" target="_blank">esse</a>, PHP: Programando com orientação a objetos.</p>
<p>Olhei alguns topicos do livro, ele é simples, de linguagem simples,  mas com um ótimo conteudo. Recomendo o livro para quem nunca iniciou contato com PHP, e já queira ótimas referencias sobre orientação a objetos.</p>
<p>Vou me basear nesse livro para ministrar esse "curso".</p>
<p>Até a proxima!</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Introdução à UML]]></title>
<link>http://multimidiarista.wordpress.com/?p=4</link>
<pubDate>Wed, 27 Feb 2008 13:21:17 +0000</pubDate>
<dc:creator>multimidiarista</dc:creator>
<guid>http://multimidiarista.wordpress.com/?p=4</guid>
<description><![CDATA[O texto abaixo, de autoria de Gilleanes Guedes para o livro &#8220;UML 2 - Guia Prático&#8221; (Ed.]]></description>
<content:encoded><![CDATA[<p><img align="right" src="http://multimidiarista.wordpress.com/files/2008/02/uml2_gilleanes_novatec_capa.jpg" alt="Capa do livro UML 2, de Gilleanes Guedes" />O texto abaixo, de autoria de Gilleanes Guedes para o livro "UML 2 - Guia Prático" (Ed. Novatec), é bastante esclarecedor como breve introdução sobre a UML (Unified Modeling Language):</p>
<blockquote><p>A UML (Unified Modeling Language ou Linguagem de Modelagem Unificada) é uma linguagem visual utilizada para modelar sistemas computacionais por meio do paradigma de Orientação a Objetos. Essa linguagem se tornou, nos últimos anos, a linguagem-padrão de modelagem de software adotada internacionalmente pela indústria de Engenharia de Software.</p>
<p>Deve ficar bem claro, no entanto, que a UML não é uma linguagem de programação, mas uma linguagem de modelagem, cujo objetivo é auxiliar os engenheiros de software a definir as características do software, tais como seus requisitos, seu comportamento, sua estrutura lógica, a dinâmica de seus processos e até mesmo suas necessidades físicas em relação ao equipamento sobre o qual o sistema deverá ser implantado. Todas essas características são definidas por meio da UML antes de o software começar a ser realmente desenvolvido.</p></blockquote>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Encapsulamento]]></title>
<link>http://falhanossa.wordpress.com/?p=18</link>
<pubDate>Mon, 04 Feb 2008 00:50:43 +0000</pubDate>
<dc:creator>Daniela</dc:creator>
<guid>http://falhanossa.wordpress.com/?p=18</guid>
<description><![CDATA[Encapsulamento é uma das bases da Orientação a Objetos onde a idéia principal é tornar cada obj]]></description>
<content:encoded><![CDATA[<p><b><font color="#008000">Encapsulamento </font></b>é uma das bases da <font color="#008000">Orientação a Objetos</font> onde a idéia principal é tornar cada objeto <b>auto-suficiente</b> (na medida do possível). Com isso podemos gerar código com um grande índice de <b>reuso</b>, além de facilitar a manutenção.</p>
<p>Vamos tomar como exemplo um<font color="#000000"> </font><font color="#000000">ComboBox: </font>Você adiciona o componente no <i>Stage </i>e insere os dados  no mesmo (label, data, etc), certo? O componente é responsável por exibí-los. Assim, podemos dizer que você <b>usa</b> um <font color="#000000">ComboBox </font>e tem acesso às propriedades necessárias para personalizá-lo ao seu modo (<font color="#000000"><i>Talvez o combo do flash não seja o melhor exemplo de personalização, mas essa é outra história, rss</i></font>). Já pensou se você precisasse programar um código para que depois de um numero x de elementos fosse inserida uma rolagem no combo? Felizmente, neste conceito (<i><font color="#000000">e no do flash, graças a Deus!</font>)</i>, você não precisa. O combo é responsável pelos seus <b>estados </b>(<font color="#000000"><i>lembre dessa palavra! Vamos lá, repita comigo:estado, estado, estado...</i>)</font>, e é ele quem deve cuidar da sua rolagem independente do número de itens que possua.</p>
<p>Vamos supor que o nosso combo possua uma variável estática (que consequentemente tem o mesmo valor para todos os combos - ou em se tratando de OO propriamente dita, para todas as instâncias do objeto) chamada <i>MIN_ELEMENTS</i>, que é responsável por armazenar o número mínimo de elementos visíveis, cuja declaração seria a seguinte:<code></code></p>
<p><font color="#ff9900"><code>public static var MIM_ELEMENTS:Number = 1;</code></font></p>
<p>Então, por descuido ou qualquer outro motivo alguém resolve escrever o código:</p>
<p><font color="#ff9900"><code>ComboBox.MIM_ELEMENTS = -10;</code></font></p>
<p>A variável é publica e pode ser acessada de qualquer lugar. Mas me diga, é possível renderizar -10 itens? Você acha possível que a alteração de um atributo como este poderia afetar o funcionamento do combo? É provável que sim. Não precisamos ter acesso a atributos deste gênero para utilizar o nosso objeto combo, mas é um dado importante dentro do mesmo. Assim a declaração correta seria:</p>
<p><code><font color="#ff9900">private static var MIM_ELEMENTS:Number = 1;</font><br />
</code><br />
Agora esse atributo só é visível dentro da classe e só pode ser alterado internamente.</p>
<p>Vamos a outro exemplo. Temos uma classe <font color="#ff00ff"><i>Pessoa </i></font>e um de seus atributos é <i>sexo </i>e seu conteúdo pode ser <i>feminino </i>ou <i>masculino</i>.</p>
<pre><code><font color="#ff9900">class Pessoa{
	public var sexo:String;
	// continua o codigo
	//  ...
}

var p:Pessoa = new Pessoa();
p.sexo = "Maria";</font>
 </code></pre>
<p>A variável <i>sexo </i>é <b>pública </b>e do tipo <i>String </i>portanto poderia aceitar tranquilamente a <i>String </i>"Maria", entretanto, isso pode - e provavelmente irá - comprometer o funcionamento do nosso objeto, tendo em vista que o <i>sexo </i>"Maria" definitivamente não existe. Assim, utilizamos recursos de encapsulamento de OO para proteger o nosso objeto. Os <b>getters </b>e os <b>setters</b>.</p>
<pre><font color="#ff9900">class Pessoa{
	private var _sexo: String;

	public function get sexo():String{
		return _sexo;
	}

	public function ser sexo(sexo:String){
		sexo = sexo.toLowerCase();
		if (sexo == "feminino" or sexo="masculino")
			_sexo = sexo;

		// caso nao fosse atribuido poderia ser disparado um evento,
		// ser gerada uma excessao,
		// exibir uma mensagem de erro e por ai vai.

	}

}
 </font></pre>
<p>No exemplo acima, garantimos que será inserido apenas um dado válido. E o <b>getter</b>? Bom, se você restringe o acesso a um dado e ele precise ser visto fora do objeto, é necessário disponibilizá-lo (<u>se e somente se</u> ele realmente precisa ser visto de fora). Mas não confunda! O getter pode conter outras coisas além do retorno do atributo.</p>
<p>Geralmente quando se começa a aprender POO (seja para criar o hábito, começar a identificar necessidades, ou qualquer outra coisa que se possa querer com isso) se indica utilizar atributos privados para tudo (ou quase) e a criação de <b>getters</b>/<b>setters </b>de todos eles. Isso porque quando se vem de uma linguagem procedural se pode fazer tudo com todos os atributos, não existe <font color="#008000">encapsulamento </font>e literalmente "<i>todo mundo é de todo mundo</i>". Então tenta-se a criar (ou modificar) uma cultura. Se isso é certo ou não... é um jeito (e a maioria dos programadores em algum momento passam por essa fase, depois passamos a fase de nos livrar do hábito do excesso).</p>
<p>A identificação das necessidade da utilização desses <i>metodozinhos</i> vem com a experiência em POO. É preciso saber identificar quando o usuário pode inserir um dado diretamente, quando ele pode ver um dado, quando ele pode inserir algum dado mas com restrições, quando você precisa saber se um dado é inserido, etc... Uma forma de saber isso antes de colocar a mão na massa é a <font color="#ff0000"><b>modelagem</b></font>. O código abaixo por exemplo é uma maneira mais burocrática de "<i>gerar uma variável pública</i>".<br />
<code><br />
</code><code></code></p>
<pre><font color="#ff9900">private var _sexo: String; 

public function get sexo():String{
	return _sexo;
}

public function set sexo(sexo:String){
	_sexo = sexo;
}</font></pre>
<p>Então... <font color="#ff0000"><b>Vamos modelar, modelar e modelar?</b></font> Ok! Você "<i>não tem tempo pra isso</i>" ou "<i>não gosta de fazer isso</i>" ou qualquer outro "<i>ou</i>". Neste caso, eu simplesmente aconselho que comece com todas os atributos privados e vá filtrando conforme desenvolve a classe (dentre os males, penso que este é o menor), mas acredite: <font color="#ff0000"><u><b>modelar é mais rápido</b></u></font>.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Controle de velocidade de jogo com ticks]]></title>
<link>http://vertexbuffer.wordpress.com/2008/01/29/controle-de-velocidade-de-jogo-com-ticks/</link>
<pubDate>Tue, 29 Jan 2008 19:22:19 +0000</pubDate>
<dc:creator>dfaobolinho</dc:creator>
<guid>http://vertexbuffer.wordpress.com/2008/01/29/controle-de-velocidade-de-jogo-com-ticks/</guid>
<description><![CDATA[Muitos me perguntam - &#8220;Como posso fazer para controlar a velocidade de execução do meu jogo?]]></description>
<content:encoded><![CDATA[<p>Muitos me perguntam - "Como posso fazer para controlar a velocidade de execução do meu jogo?" Já vi pessoas tentando resolver este problema usando timers do sistema e até mesmo threads - mas existe um jeito bem simples, porém poderoso, para controlar a velocidade do jogo - usando ticks.</p>
<p>A idea básica é voce definir a execução do jogo em X ticks por segundo - assim garantindo que o jogo roda na mesma velocidade em todas as máquinas, e deixando a velocidade independente do FPS (frames per second - frames por segundo). A lógica é simples - voce tem uma variável que define quantos milisegundos cada tick tem para executar, e só executa o próximo tick após esse tempo mínimo ter passado:</p>
<p>[sourcecode language='cpp']</p>
<p>// alguns typesdefs - padrao q geralmente gosto de usar<br />
typedef unsigned int dword;<br />
typedef unsigned char byte;</p>
<p>// definicao de uma lista de objetos<br />
typedef vector<Objeto*> VetorDeObjetos;</p>
<p>// variável q vai guardar o tempo dos ticks - em milisegundos<br />
//     neste caso, 34milisegundos significa 30 updates por segundo<br />
dword msTick = 34;<br />
// variável q guarda o tempo do update anterior<br />
dword msLastUpdate = 0;</p>
<p>// funcao de execução chamada dentro do loop de jogo<br />
void rodaTick()<br />
{<br />
   // estou usando SDL para facilitar o exemplo<br />
   //    esta funcao do SDL retorna o numero de milisegundos<br />
   //    desde o inicio do programa<br />
   dword msTempo = SDL_GetTicks();</p>
<p>   // devo executar o tick?<br />
   if ( msTempo >= (msLastUpdate + msTick) )<br />
   {<br />
      // seta o valor de ultima atualizaçao<br />
      msLastUpdate = msTempo;</p>
<p>      // chama funcao update() de todos os objetos do jogo<br />
      for ( VetorDeObjetos::iterator it = objetos.begin(); it != objetos.end(); it++ )<br />
         it->update(msTempo);<br />
   }<br />
   // agora manda desenhar todos os objetos<br />
   for ( VetorDeObjetos::iterator it = objetos.begin(); it != objetos.end(); it++ )<br />
      it->draw();<br />
}</p>
<p>[/sourcecode]</p>
<p>Como disse, bem simples. O update eh feito periodicamente baseado no valor de msTick, mas o draw() é chamado todas as vezes. Assim voce garante o maior FPS possivel, mas a velocidade de execução do jogo se mantem igual,</p>
<p>Mas e se a máquina por acaso engasga por algum tempo (mesmo q minusculo)? Como garantir que a lógica do jogo nao fique defasada?<br />
Podemos colocar uma verificação extra para que, em vez de executar cada tick se o tempo passou do estimado, ele executar todos os ticks até que o tempo de execução esteja correto em relação ao tempo de aplicação. Vamos alterar nossa funcao um pouco para criar esse efeito:</p>
<p>[sourcecode language='cpp']</p>
<p>void rodaTick()<br />
{<br />
   // estou usando SDL para facilitar o exemplo<br />
   //    esta funcao do SDL retorna o numero de milisegundos<br />
   //    desde o inicio do programa<br />
   dword msTempo = SDL_GetTicks();</p>
<p>   // devo executar o tick?<br />
   while ( msTempo >= (msLastUpdate + msTick) )<br />
   {<br />
      // seta o valor de ultima atualizaçao<br />
      msLastUpdate += msTick;</p>
<p>      // chama funcao update() de todos os objetos do jogo<br />
      for ( VetorDeObjetos::iterator it = objetos.begin(); it != objetos.end(); it++ )<br />
         it->update(msTempo);<br />
   }<br />
   // agora manda desenhar todos os objetos<br />
   for ( VetorDeObjetos::iterator it = objetos.begin(); it != objetos.end(); it++ )<br />
      it->draw();<br />
}</p>
<p>[/sourcecode]</p>
<p>Com o while, todos os ticks serão executados corretamente até se atingir o tempo atual de execução, mesmo que a máquina engasgue por alguns ticks.</p>
<p>Mas podemos melhorar ainda mais este sistema. Imagine por um instante que temos na nossa engine vários sistemas - tais como IA, física, etc. Podemos querer atualizar a IA com metade da frequencia de que atualizamos o movimento e física. Para isso, vamos implementar o suporte a multiplos ticks, mas antes vamos olhar um esqueleto da classe objeto:</p>
<p>[sourcecode language='cpp']</p>
<p>class Objeto<br />
{<br />
protected:<br />
   dword _tickMascara;</p>
<p>   // outros membros protected e private</p>
<p>public:<br />
   // construtores/destrutores</p>
<p>   // outros métodos</p>
<p>   // métodos de tick<br />
   inline bool verificaTick(const dword tick)<br />
   {<br />
      return ( _tickMascara & tick );<br />
   }</p>
<p>   // métodos de update e desenho<br />
   virtual void update(const dword tick, const dword msTempo) = 0;<br />
   virtual void draw() = 0;<br />
};</p>
<p>[/sourcecode]</p>
<p>A nossa classe Objeto tem um membro protegido, _tickMascara, que define uma mascara 32bits - essa máscara iremos usar para definir se este objeto responde, ou não, ao nosso tick. Deste jeito, podemos ter até 32 ticks diferentes, cada um correspondendo a 1 bit da mascara. O método verificaTick é usado para verificar se o tick definido no parametro é aceito pelo objeto. Mudei também o método update para que receba o tick que estamos atualizando, evitando assim a necessidade de chamar dois métodos diferentes sempre que precisamos atualizar.</p>
<p>Vamos agora olhar a definição da nossa variável que controla o tempo do tick:</p>
<p>[sourcecode language='cpp']</p>
<p>// máximo de ticks suportados<br />
#define MAX_TICKS 32</p>
<p>// definimos para q serve cada tick - define o indice e a máscara de cada tick<br />
#define TICK_IA_INDICE        0<br />
#define TICK_IA_MASK        0x001;<br />
#define TICK_MOV_INDICE     1<br />
#define TICK_MOV_MASK         0x002;</p>
<p>// como precisamos manter até 32 ticks, o formato é diferente<br />
struct tickInfo_t<br />
{<br />
   dword numTicks;<br />
   dword msLastUpdate[MAX_TICKS];<br />
   dword msTick[MAX_TICKS];<br />
} tickInfo;</p>
<p>// vamos usar esta funcao para inicializar os ticks<br />
void tickInit()<br />
{<br />
   // estamos usando 2 ticks neste exemplo<br />
   tickInfo.numTicks = 2;</p>
<p>   // IA atualiza 15 vezes por segundo<br />
   tickInfo.msTick[TICK_IA_INDICE] = 67;<br />
   // moviemento 30 vezes por segundo<br />
   tickInfo.msTick[TICK_MOV_INDICE] = 34;</p>
<p>   // zerar os contadores de tempo de cada tick<br />
   for ( int i = 0; i < tickInfo.numTicks; i++ )<br />
      tickInfo.msLastUpdate[i] = 0;<br />
}</p>
<p>// e agora, nossa funcao rodaTick()<br />
void rodaTick()<br />
{<br />
   // estou usando SDL para facilitar o exemplo<br />
   //    esta funcao do SDL retorna o numero de milisegundos<br />
   //    desde o inicio do programa<br />
   dword msTempo = SDL_GetTicks();</p>
<p>   // temos q passar por todos os ticks agora<br />
   dword tickAtual = 1;<br />
   for ( int i = 0; i < tickInfo.numTicks; i++ )<br />
   {<br />
      // devo executar o tick?<br />
      while ( msTempo >= (tickInfo.msLastUpdate[i] + tickInfo.msTick[i]) )<br />
      {<br />
         // seta o valor de ultima atualizaçao<br />
         tickInfo.msLastUpdate[i] += tickInfo.msTick[i];</p>
<p>         // chama funcao update() de todos os objetos do jogo<br />
         // repare que agora estamos passando a mascara do tick juntamente com o tempo<br />
         for ( VetorDeObjetos::iterator it = objetos.begin(); it != objetos.end(); it++ )<br />
            it->update(tickAtual, msTempo);<br />
      }<br />
      // passamos para o próximo tick usando shift<br />
      //     para quem nao conhece, este operador vai fazer com q todos os bits<br />
      //     andem 1 casa para a esquerda<br />
      tickAtual <<= 1;<br />
   }<br />
   // agora manda desenhar todos os objetos<br />
   for ( VetorDeObjetos::iterator it = objetos.begin(); it != objetos.end(); it++ )<br />
      it->draw();<br />
}</p>
<p>[/sourcecode]</p>
<p>Agora temos diversos ticks funcionando em tempos diferentes. Vamos olhar um exemplo de um objeto que responde a esses dois ticks que definimos:</p>
<p>[sourcecode language='cpp']</p>
<p>class Pessoa : Objeto<br />
{<br />
private:<br />
   // membros privados</p>
<p>public:<br />
   // no construtor definimos os ticks aceites por este objeto<br />
   Pessoa() : _tickMascara( TICK_IA_MASK &#124; TICK_MOV_MASK ) {}<br />
   virtual ~Pessoa() {}</p>
<p>   // metodo update<br />
   virtual void update(const dword tick, const dword msTempo)<br />
   {<br />
      // vamos atualizar<br />
      if ( tick & TICK_IA_MASK )<br />
         updateIA(msTempo);<br />
      if ( tick & TICK_MOV_MASK )<br />
         updateMovimento(msTempo);<br />
   }</p>
<p>   // os metodos de atualizaçao de ia e movimento<br />
   void updateIA ( const dword msTempo ) {}<br />
   void updateMovimento ( const dword msTempo ) {}</p>
<p>   // metodo draw...<br />
};</p>
<p>[/sourcecode]</p>
<p>Ao definir _tickMascara com os 2 tipos de tick, o metodo update será chamada a cada update dos ticks IA e MOV. Se removermos um dos ticks da definição no construtor, o metodo irá fazer nada com esse tick. Podemos melhorar consideravelmente a performance deste sistema verificando se o objeto responde ao tick especificado verificando o método verificaTick() anteriormente a chamar o método update().</p>
<p>Este código necessita no entanto que voce tenha na sua engine de jogo alguns requesitos necessários:</p>
<p>- Um passo de inicialização, onde voce pode inicializar os ticks;<br />
- Um repositório central com todos os objetos do jogo - em formato lista, arvore, etc;</p>
<p>Quaisquer dúvidas ou sujestões são sempre benvindas - espero ter sido util com este artigo. Abraços e até mais!</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[POO - Programação Orientada a Objetos ]]></title>
<link>http://bsideias.wordpress.com/?p=115</link>
<pubDate>Tue, 29 Jan 2008 13:35:07 +0000</pubDate>
<dc:creator>bsideias</dc:creator>
<guid>http://bsideias.wordpress.com/?p=115</guid>
<description><![CDATA[
Continuando com os posts sobre as matérias do meu 3° semestre de sistemas de informação, chegou]]></description>
<content:encoded><![CDATA[<p align="justify">
Continuando com os posts sobre as matérias do meu 3° semestre de sistemas de informação, chegou a hora da POO.
</p>
<p align="center">
<strong>O que é programar Orientado a Objetos?</strong>
</p>
<p align="justify">
Programar Orientado a Objetos é pensar em como criar seu código como você pensa na vida real. É você abstrair os objetos da vida real e leva-los para as linhas de código como eles são - com suas características, que são os atributos e suas ações, que são os métodos. Todo objeto tem características e ações.
</p>
<p align="justify">
A POO foi criada com o intuito de resolver os problemas da programação estruturada. A idéia era resolver problemas o mais rápido possivel e com a segurança que funcionaria em qualquer lugar a mesma solução. A grande vantagem disso é o reaproveitamento de código, isso traz uma redução no tempo que uma solução pode ser gerada. Tempo em programação pode ser muito caro, por isso a POO é tão bem aceita!
</p>
<p align="center">
<strong>O que é um Objeto?</strong>
</p>
<p align="justify">
Um objeto é um elemento computacional que representa, no domínio da solução, alguma entidade (abstrata ou concreta) de interesse do sistema sob análise. Objetos similares são agrupados em classes. No paradigma da orientação a objetos, tudo pode ser potencialmente representado como um objeto. Sob o ponto de vista da programação, um objeto não é muito diferente de uma variável no paradigma de programação convencional.
</p>
<p>Quando se define uma variável em Java, essa variável terá:</p>
<ul>
<li>
<p align="justify">
Um espaço em memória para registrar o seu estado atual (um valor)
</p>
</li>
<li>
<p align="justify">
Um conjunto de operações associadas que podem ser aplicadas a ela, através dos operadores definidos na linguagem que podem ser aplicados a valores inteiros (soma, subtração, inversão de sinal, multiplicação, divisão inteira, resto da divisão inteira, incremento, decremento).
</p>
</li>
</ul>
<p align="justify">
Da mesma forma, quando se cria um objeto, esse objeto adiquire um espaço em memória para armazenar seu estado (os valores de seu conjunto de atributos, definidos pela classe) e um conjunto de operações que podem ser aplicadas ao objeto (o conjunto de métodos definidos pela classe).
</p>
<p align="justify">
Portanto um programa orientado a objetos é composto por um conjunto de objetos que interagem através de "trocas de mensagens" entre eles. Na prática, essa troca de mensagem traduz-se na chamada de métodos (funções) entre objetos.
</p>
<p align="center">
<strong>Exemplo de um objeto:</strong>
</p>
<p align="justify">
Um Jaguar é um objeto. Ele tem como características a cor, peso, quantidade de portas, modelo, ano, etc. Também tem ações como frear, buzinar, acelerar, abrir os vidros, trocar de marchas, etc. Portanto programar Orientado a Objetos é você fazer essa abstração do mundo real e transforma-la em código. Mais adiante mostrarei um exemplo de código Orientado a Objetos.
</p>
<p align="center">
<strong>A POO tem quatro pilares que a sustenta, seguindo:</strong>
</p>
<p><strong>Abstração:</strong></p>
<p align="justify">
É a capacidade de você pensar nos objetos da vida real e classifica-los. É o processo pelo qual modelamos sistemas reais ou imaginários, extraindo do seu contexto os seus principais elementos "Objetos", e descrevemos cada objeto, com suas principais "características" de dados e funcionalidades.
</p>
<p align="justify">
Uma Ferrari por exemplo tem as mesmas características do objeto Jaguar citado acima, possui até mais, mas eles tem algo em comum, ou seja, ambos são carros, logo pertencem a classe carro. A Ferrari é um tipo de carro e o Jaguar também, mas cada um com suas características e ações particulares e comuns.
</p>
<p align="justify">
Programar Orientado a Objetos é fácil, o difícil é programar Orientado a Objetos bem. Pois se programando bem, você pode tirar proveito de todas as vantagens que a POO possui e para se programar bem Orientado a Objetos a principal característica que o programador deve ter é uma boa abstração do mundo real.
</p>
<p><strong>Encapsulamento:</strong></p>
<p align="justify">
Os objetos como dito acima contém atributos e métodos. O encapsulamento trata de dar alguma segurança aos objetos. Explico:
</p>
<p align="justify">
Um objeto Cliente por exemplo tem atributos como qualquer outro e estes não podem ser acessados por qualquer outro objeto diretamente. Existem dois tipos de atributos, os privados e os publicos. Em UML e OO (orientação a objetos) é definido que para atributos privados usa-se o sinal de "-" antes do nome e para atributos publicos usa-se o sinal de "+" antes do nome.
</p>
<p>Exemplo:</p>
<p align="center">
<img src='http://bsideias.wordpress.com/files/2008/01/objeto-cliente.jpg' alt='objeto cliente' />
</p>
<p align="justify">
Para que o encapsulamento exista é preciso deixar os atributos privados e os métodos públicos, assim está sendo garantido que os valores atribuídos aos atributos serão sempre respeitados pelas regras existentes.
</p>
<p>Exemplo: </p>
<p align="justify">
O atributo cpf deve sempre ter 11 números, se o atributo não for privado, ele perde essa regra (11 números) pois alguém poderia acessar e colocar 12 ou 9 números tornando-o inválido.
</p>
<p align="justify">
Como os atributos privados não podem ser acessados diretamente por outros objetos, existem os métodos publicos que são os responsáveis em acessar os atributos e trazer ou levar algum dado para o objeto respeitando as regras.
</p>
<p>Idéia de encapsulamento:</p>
<p align="center">
<img src='http://bsideias.wordpress.com/files/2008/01/encapsulamento.jpg' alt='encapsulamento' />
</p>
<p><strong>Herança:</strong></p>
<p align="justify">
O que torna a orientação a objetos única é o conceito de herança que no inglês significa inheritence.
</p>
<p align="justify">
Herança é um mecanismo que permite que características comuns a diversas classes com comportamentos comuns ou parecidos, sejam abstraídas e centralizadas em uma classe base, ou superclasse. Tem uma relação "É um".
</p>
<p>Exemplo:</p>
<p align="justify">
Um Jaguar "é um" carro. Logo ele foi herdado da classe carro, pois contém as características comuns de um carro.
</p>
<p align="justify">
A partir dessa superclasse outras classes podem ser especificadas. Portanto uma subclasse que é uma classe herdada da superclasse recebe sem codificação extra as características da superclasse. Ainda podemos adicionar elementos particulares a está subclasse.
</p>
<p align="justify">
Na linguagem Java uma subclasse somente pode herdar uma única superclasse diretamente.
</p>
<p>Exemplo:</p>
<p align="center">
<img src='http://bsideias.wordpress.com/files/2008/01/heranca.jpg' alt='herançajaguar' />
</p>
<p><strong>Polimorfismo:</strong></p>
<p align="justify">
Analisando a palavra Polimorfismo, ela significa muitas formas. Ou seja, para uma árvore de herança, temos muitas formas de objetos e métodos a partir de uma superclasse e suas subclasses. Polimorfismo é o princípio pelo qual usamos objetos construídos a partir de uma árvore de herança, através de referências do tipo de uma superclasse da hierarquia.
</p>
<p align="justify">
Formas de polimorfismo:</p>
<ul>
<li>Subclasses;</li>
<li>Sobrescrita de método;</li>
<li>Sobrecarga de método ou construtor</li>
</ul>
<p align="center">
<strong>Sobrescrita de métodos - Overriding</strong>
</p>
<p align="Justify">
Esta utilidade nos permite escrever numa subclasse um ou mais métodos presentes numa das superclasses podendo alterar o comportamento da superclasse.
</p>
<p>Exemplo:</p>
<p align="center">
<img src='http://bsideias.wordpress.com/files/2008/01/polimorfismo.jpg' alt='polimorfismo' />
</p>
<p align="justify">
Quando numa subclasse <strong>reescrevemos</strong> um método já existente numa superclasse, chamamos de sobreescrita de método ou reescrita de método mas o termo técnico é <strong>Method Overriding.</strong> Lembrando que a sobrescretica de métodos só é valida quando o método reescrevido na subclasse tem exatamente a mesma identificação (nome, tipos, etc.) do método da superclasse.
</p>
<p align="center">
<strong>Sobrecarga de métodos - Overloading</strong>
</p>
<p align="Justify">
O Polimorfismo ainda permite que numa mesma classe tenhamos métodos com o mesmo nome, desde que o número ou tipos de parâmetros passados sejam diferentes.
</p>
<p>Exemplo:</p>
<p align="center">
<img src='http://bsideias.wordpress.com/files/2008/01/sobrecarga.jpg' alt='sobrecarga' />
</p>
<p align="justify">
A sobrecarga de métodos é uma ferramenta poderosa, pois nos permite criar vários métodos com o mesmo nome, isso facilita o entendimento de problemas mais complexos, pois não é necessária a criação de nomes de funcionalidades sem sentido aparente.
</p>
<p align="center">
<strong>Classes</strong>
</p>
<p align="justify">
Entendido todos os conceitos acima fica fácil entender o que é uma classe. Como na vida real existem diversos objetos do mesmo tipo, nos softwares também é assim. Imagine o sistema de gerenciamento de veículos do Detran. Quantos objetos do tipo carro este sistema  deve manipular por dia? Se fosse feita uma descrição para cada um, o sistema jamais iria funcionar.
</p>
<p align="justify">
Assim, podemos descrever um mesmo tipo de objetos uma única vez e cada vez  que um novo objeto precise ser criado, é só utilizar a mesma fôrma. Esta fôrma é chamada <strong>classe.</strong>
</p>
<p align="justify">
Pense em uma padaria, quando você vai escolher bolos se depara com muitos bolos idênticos. Ai você se pergunta, seria o padeiro capaz de produzir tantos bolos com a mesma forma apenas usando as mãos?<strong>NÃO!</strong> Ele usou uma fôrma para fazer estes bolos, a fôrma foi o molde que ele queria para seus bolos. Com os objetos não é diferente, as classes são os moldes (modelos, fôrmas, plantas) para criação dos os objetos em tempo de execução dos programas.
</p>
<p align="justify">
Ainda tem mais, uma classe é a descrição de um conjunto de objetos que possuem os mesmos atributos, operação e semântica. Dizemos que um objeto é uma <strong>instância</strong> de uma classe, quando ele é criado a partir dela, seguindo sua especificação.
</p>
<p align="center">
<strong>Ainda existe a diferença entre abstração e instância</strong>
</p>
<p align="justify">
A abstração denota a essência ideal de uma coisa; a instância denota uma manifestação concreta.
</p>
<p align="justify">
Poderíamos também dizer que, na codificação existem somente as classes, não os objetos. Já em tempo de execução, o que existe são os objetos e não as classes. Também dizemos que uma variável é de um determinado tipo (inteiro, booleano, real, etc.) numa linguagem de programação, então dizemos que um objeto é de uma determinada classe.
</p>
<p align="justify">
Uma classe é a reunião de objetos idênticos por meio de atributos e métodos.</p>
<p>Neste post existe muitas possibilidades de assuntos mais profundos, mas eu tentei focar somente em OO.</p>
<p>Vou ficando por aqui e até o próximo post sobre <strong>Probabilidade e Estatística.</strong></p>
<p>UltraG</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Verdadeiro ou falso: tipos]]></title>
<link>http://falhanossa.wordpress.com/?p=20</link>
<pubDate>Fri, 25 Jan 2008 10:45:52 +0000</pubDate>
<dc:creator>Daniela</dc:creator>
<guid>http://falhanossa.wordpress.com/?p=20</guid>
<description><![CDATA[Se considerarmos,
var a:String = new String(&#8221;string&#8221;);
var b:String = new String(&#8221;]]></description>
<content:encoded><![CDATA[<p>Se considerarmos,</p>
<p>var a:String = new String("string");<br />
var b:String = new String("string");<br />
var c:String = "string";<br />
var d:String = "string";<br />
Então:</p>
<p>1) a == b ?</p>
<p>2) a === b?</p>
<p>3) c == a?</p>
<p>4) c === a?</p>
<p>5) c == d?</p>
<p>6) c === d?</p>
<p><b>Respostas (publicado em 03/02/08):</b></p>
<p>Começando pela diferença entre os operadores de igualdade.</p>
<p>O operador de igualdade estrita (===) é como o operador de igualdade, com uma diferença importante:<b> o operador de igualdade estrita não executa a conversão de tipo</b>. Se os dois operandos forem de tipos diferentes, o operador de igualdade estrita retornará <i>false </i>(MACROMEDIA, Guia de Referência do ActionScript Flash  MX 2004, pag. 44).</p>
<p>A variável <i>a</i>, assim como a variável <i>b</i> são <b>objetos </b>do tipo <i>String</i>. Ao serem comparadas  com operador  estrito ou não, sempre retornarão <i>false</i>.</p>
<p>1) a == b //  false<br />
2) a === b // false</p>
<p>Isso porque <i>a</i> e <i>b</i> são objetos diferentes. Mesmo sendo instâncias da mesma classe e contendo atributos iguais, eles possuem identidade         diferentes, são armazenados em lugares diferentes da memória, assim as variáveis <i>a</i>  e <i>b</i> são referências a objetos <i>String e</i> contém o endereço de memória de cada um dos objetos criados. Dessa forma podemos concluir que, quando comparamos <i>a</i> e <i>b</i>,  sempre será <i>false</i>,  pois em seu conteúdo não constam valores literais, mas distintos endereços de memória.</p>
<p>Então, como comparar os seus conteúdos?</p>
<p>a.valueOf() === b.valueOf()  <b>ou</b> a.valueOf() == b.valueOf()</p>
<p>Mais uma consulta ao help do flash e temos, <i>valueOf </i>- Método; retorna o valor primitivo do objeto especificado. Se o objeto não tiver um valor primitivo, o objeto é retornado.</p>
<p>Já as variáveis<i> c</i> e <i>d</i> são tipos  primitivos e possuem em seu conteúdo um valor literal que lhes foi atribuído. Veja mais um trecho do Guia de Referência AS:</p>
<p><i>Os tipos de dados descrevem que tipos de informações um elemento do ActionScript ou variável pode conter. Existem dois tipos de dados internos no Flash: primitivo e referência. Os dados do tipo primitivo — String, Number e Boolean — têm um valor constante e, portanto, podem manter o valor real do elemento que representam. Os de referência— MovieClip e Object — têm valores que podem ser alterados e, portanto, contêm referências ao valor real do elemento. </i></p>
<p>Assim, considerando que <i>c</i> e <i>d</i> armazenam um conteúdo e não uma referência a uma posição de memória, podemos afirmar que:</p>
<p>5) c == d // true<br />
6) c === d //true</p>
<p>Com base em tudo isso, podemos concluir também que:</p>
<p>4) c === a // false</p>
<p>Considerando que estamos comparando uma referência de memória com um tipo primitivo.</p>
<p>Já no caso:</p>
<p>3) c== a // true</p>
<p>É verdadeiro porque o operador de igualdade (==) analisa conteúdos e faz a conversão de tipo. Como o conteúdo é idêntico, o resultado é verdadeiro, independente de serem valores literais, variáveis ou referências. Então você me pergunta, porque a== b não é verdadeiro então? E a resposta é... Como o operador de igualdade considera  que c == a e String(a) == b são verdadeiros?</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Objetos: Instâncias e referências]]></title>
<link>http://falhanossa.wordpress.com/2008/01/24/objetos-instancias-e-referencias/</link>
<pubDate>Thu, 24 Jan 2008 13:17:57 +0000</pubDate>
<dc:creator>Daniela</dc:creator>
<guid>http://falhanossa.wordpress.com/2008/01/24/objetos-instancias-e-referencias/</guid>
<description><![CDATA[Objetos são instâncias de classes, que determinam qual informação um objeto contém e como ele p]]></description>
<content:encoded><![CDATA[<p><u><b>Objetos são instâncias de classes</b></u>, que determinam qual informação um objeto contém e como ele pode manipulá-la. É através de objetos que (praticamente) todo o processamento ocorre em aplicações desenvolvidas com linguagens de POO.</p>
<p class="western" style="text-decoration:none;"> <b>Manipulando objetos</b></p>
<p> Quando declara-se uma variável cujo tipo é o nome de uma classe, como em:</p>
<pre>var nome:String;</pre>
<p class="western"> <span style="text-decoration:none;"><span>não está se criando um objeto dessa classe, mas simplesmente uma </span></span><b><span style="text-decoration:none;"><span>referência para um objeto</span></span></b><span style="text-decoration:none;"><span> da classe String, a qual inicialmente não faz referência a nenhum objeto válido:</span></span></p>
<p><img src="http://falhanossa.files.wordpress.com/2008/01/1.gif" /></p>
<p class="western"><span style="text-decoration:none;"><span>Quando um objeto dessa classe é criado, obtém-se uma referência válida, que é armazenada na variável. Por exemplo:</span></span></p>
<pre>   Nome = new String(“Nova instância”);</pre>
<p class="western"> Nome <span style="text-decoration:none;"><span>é uma variável que armazena uma referência para um objeto específico da classe String,</span></span><span style="text-decoration:none;"><span> cujo conteúdo é "Nova instância":</span></span></p>
<p><img src="http://falhanossa.wordpress.com/files/2008/01/2.gif" /></p>
<p class="western"><span style="text-decoration:none;"><span>A variável nome </span></span><span style="text-decoration:none;"><span>mantém apenas a referência para o objeto e não o objeto em si. Assim, uma atribuição como</span></span></p>
<pre>   var Nome2:String = Nome;</pre>
<p class="western" style="text-decoration:none;"> não cria outro objeto, mas simplesmente uma outra referência para o mesmo objeto</p>
<p><img src="http://falhanossa.wordpress.com/files/2008/01/3.gif" /></p>
<p class="western" style="margin-bottom:0;text-decoration:none;">Referência:<br />
<a href="http://www.dca.fee.unicamp.br/cursos/PooJava/objetos/manipul.html"><span style="text-decoration:none;"><span>http://www.dca.fee.unicamp.br/cursos/PooJava/objetos/manipul.html</span></span></a><br />
O link acima está com explicações e exemplo de codigos para Java.</p>
<p class="western" style="margin-bottom:0;text-decoration:none;">&#160;</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Functors - ponteiros para métodos]]></title>
<link>http://vertexbuffer.wordpress.com/2008/01/14/functors-ponteiros-para-metodos/</link>
<pubDate>Mon, 14 Jan 2008 03:25:11 +0000</pubDate>
<dc:creator>dfaobolinho</dc:creator>
<guid>http://vertexbuffer.wordpress.com/2008/01/14/functors-ponteiros-para-metodos/</guid>
<description><![CDATA[Me pediram para postar um exemplo de um sistema de eventos usando o assunto do post passado (ponteir]]></description>
<content:encoded><![CDATA[<p>Me pediram para postar um exemplo de um sistema de eventos usando o assunto do post passado (<a href="http://vertexbuffer.wordpress.com/2008/01/11/ponteiros-de-funcao/" target="_blank">ponteiros para funções e métodos</a>), mas decidi que antes de fazer esse post, irei falar sobre functors - pois irei utilizar esse conceito no sistema de eventos.</p>
<p>Como falei no post anterior, um ponteiro para um método de uma classe tem uma sintaxe estranha e que pode facilmente complicar códigos, e além disso necessitamos de uma referência ao objeto do qual esse método será executado. Para facilita então o uso desses ponteiros especiais, vamos criar um conjunto simples de classes que encapsulam a funcionalidade de um ponteiro para método - esse conceito é chamado de Functor.</p>
<p>Para que a classe seja genérica, necessitaremos utilizar templates. Mas, como um template na prática gera uma classe diferente para cada tipo, necessitamos criar uma classe-base para que nossos functors possam ser tratados por código genérico. E aqui está o código da classe:</p>
<p>[sourcecode language='cpp']</p>
<p>class Functor<br />
{<br />
public:<br />
    virtual void operator() () = 0;<br />
};</p>
<p>[/sourcecode]</p>
<p>É uma classe abstrata bem simples - com apenas um operador virtual, o operador (). Isso nos permite fazer algo do tipo:</p>
<p>[sourcecode language='cpp']</p>
<p>void funcao(Functor &func)<br />
{<br />
    // chama funcao encapsulada pelo functor<br />
    func();<br />
}</p>
<p>[/sourcecode]</p>
<p>É logico q a classe Functor apenas nao resolve nada, então vamos olhar agora o código da classe que realmente faz a diferença - <font color="#333399">TemplateFunctor</font></p>
<p>[sourcecode language='cpp']</p>
<p>template <class T><br />
class TemplateFunctor : public Functor<br />
{<br />
protected:<br />
    // definindo o tipo do ponteiro<br />
    typedef void (T::*metodo)();<br />
    // o ponteiro para o objeto em questao<br />
    T *_pObj;<br />
    // o ponteiro para o método<br />
    metodo _fpMetodo;<br />
public:<br />
    // construtor<br />
    TemplateFunctor ( T *o, metodo m ) : _pObj(o),_fpMetodo(m) {}</p>
<p>    // operador de chamada de funcao ()<br />
    void operator() ()<br />
    {<br />
        (_pObj->*_fpMetodo) ();<br />
    }<br />
};</p>
<p>[/sourcecode]</p>
<p>Agora sim, temos um functor funcionando. A classe é relativamente simples - temos a definição do tipo do ponteiro, a definição dos ponteiros para o objeto e para o método, um construtor que garante a construção apropriada do functor, e o operador () q nos permite chamar o método através deste functor como se o objeto fosse o próprio método. Vamos exemplificar a seguir:</p>
<p>[sourcecode language='cpp']</p>
<p>// uma classe qualquer<br />
class A<br />
{<br />
public:<br />
    A() {}</p>
<p>    void metodoQualquer() { /*faz algo*/ }<br />
};</p>
<p>// nao podemos ter um functor sem um objeto<br />
A a();<br />
// criando o functor - passando objeto e método<br />
TemplateFunctor<A> aFunc(&a, &A::metodoQualquer);<br />
// chamando o método através do functor<br />
aFunc();</p>
<p>[/sourcecode]</p>
<p>Algo que provavelmente voce está se pergutando agora é - e se eu quiser métodos com outros tipos de retorno e parametros? Bom, para isso é necessária a criação de classes functor diferentes ou, então, planejar a sua própria functor para trabalhar com parameterização genérica (receber uma <font color="#333399">union</font>, ou um ponteiro <font color="#333399">void</font>). Porém, para um sistema de eventos, por exemplo, onde todos os métodos chamados terão a mesma assinatura, este tipo de functor facilita bastante a codificação.</p>
<p>Como sempre, postem suas dúvidas e sugestoes, estarei mais que disponivel para responde-las.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Ponteiros de função]]></title>
<link>http://vertexbuffer.wordpress.com/2008/01/11/ponteiros-de-funcao/</link>
<pubDate>Fri, 11 Jan 2008 19:08:35 +0000</pubDate>
<dc:creator>dfaobolinho</dc:creator>
<guid>http://vertexbuffer.wordpress.com/2008/01/11/ponteiros-de-funcao/</guid>
<description><![CDATA[Uma função nada mais é, em sua essência, do que apenas um conjunto de instruções binárias em ]]></description>
<content:encoded><![CDATA[<p>Uma função nada mais é, em sua essência, do que apenas um conjunto de instruções binárias em alguma posição de memória. Sendo assim, então, o C/C++ permite voce criar um ponteiro para uma função, que irá guardar o endereço de memória da função que poderá ser executada. Esse tipo de funcionalidade permite técnicas como de bom exemplo sistema de eventos.</p>
<p>Antes de começar a demonstrar como usar ponteiro para funções, vou deixar avisado que a sintaxe para os definir é um tanto quanto esdruxula, então nao se assustem muito.</p>
<p>Como C (e C++) é uma linguagem fortemente tipada, nenhum dado pode ser de tipo desconhecido para ser utilizado, e funções nao sao exceçao. Alem disso, funções tem o agravante de não apenas terem um tipo de dado de retorno, mas também a possibilidade de receber n parametros. Então, ao declarar um ponteiro para função, necessitamos declarar  seu tipo de retorno e os tipos de todos os parametros. Voce consegue o endereço de uma função usando o nome da função, sem o operador (). O uso do operador &#38; antes do nome da função é, neste caso, opcional. Porém, mais além iremos ver um caso onde o seu uso é obrigatório. Vamos ver alguns exemplos:</p>
<p>[sourcecode language='cpp']</p>
<p>// exemplo de função 01<br />
void vazia() {}<br />
// seu ponteiro e atribuiçao<br />
void (*fpVazia)(void) = vazia;</p>
<p>// exemplo de função 02<br />
int numero() { return 2; }<br />
// seu ponteiro e atribuição<br />
int (*fpNumero)(void) = numero;</p>
<p>// exemplo de função 03<br />
int soma(int a, int b) { return a+b; }<br />
// seu ponteiro e atribuição<br />
int (*fpSoma)(int,int) = soma;</p>
<p>[/sourcecode]</p>
<p>Como disse anteriormente, a sintaxe é ligeiramente estranha, mas funciona. Temos aqui tres ponteiros para funções. Agora para executar cada uma dessas, usamos a seguinte sintaxe:</p>
<p>[sourcecode language='cpp']</p>
<p>// executa cada uma das funções anteriores<br />
fpVazia();<br />
int num = fpNumero(); // num recebe 2<br />
int res = fpSoma(2,2); // res recebe 4</p>
<p>// outras formas de executar:<br />
(fpVazia)();<br />
(*fpVazia)();</p>
<p>[/sourcecode]</p>
<p>Repare que eu coloquei algumas outras formas de executar no final do código. Embora todas elas funcionem na maioria dos compiladores, alguns compiladores mais antigos podem dar problema com um ou outro formato. Além disso, para executar ponteiros para métodos (funções membros de classe), a sintaxe para chamadas de função vai ficar menos flexivel.</p>
<p>Para facilitar um pouco a sintaxe de uso de ponteiros para função, podemos utilizar o operador typedef, como exemplifico a seguir:</p>
<p>[sourcecode language='cpp']</p>
<p>// exemplo de declaração sem typedef<br />
void (*funcExemplo)(int,int) fpExemplo;</p>
<p>// agora usando typedef para criar<br />
// um tipo de dado novo que é um<br />
// ponteiro para função<br />
typedef void (*funcExemplo)(int,int);<br />
// declarando o ponteiro<br />
funcExemplo fpExemplo;</p>
<p>[/sourcecode]</p>
<p>Muito mais simples, não? se vc pensar na questão de passar ponteiros para função como parametro de outra função, esta facilidade de criar um tipo de dado deixa o código muito mais limpo e facil de entender.</p>
<p>Ponteiros para funções são muito úteis, mas voce deve estar pensando "posso usar isso para criar ponteiros de métodos de classes?". A resposta carrega junto uma explicação:</p>
<p>Um método estático de uma classe é exatamente igual a uma função comum - apenas que o compilador mantém controle sobre as permissões de acesso. Um método não-estático, porém, tem uma diferença bem especial. O formato de chamada ( chamada <font color="#333399">_thiscall</font>), envia internamente um parametro extra - um ponteiro para o objeto no qual o método está sendo chamado. Disso podemos tirar que, além de sabermos o endereço dessa função, necessitados do ponteiro (ou referência) para o objeto também. Aqui está o exemplo de um ponteiro para um método:</p>
<p>[sourcecode language='cpp']</p>
<p>// vamos ver uma classe<br />
class A<br />
{<br />
private:<br />
   int _a;</p>
<p>public:<br />
   A(int a) : _a(a) {}<br />
   ~A() {}</p>
<p>   // método a ser executado<br />
   int soma(int b) { return _a + b; }<br />
};</p>
<p>// criação do tipo ponteiro 'funcSoma'<br />
typedef int (A::*funcSoma)(int);</p>
<p>// criando ponteiro<br />
funcSoma fpSoma = &A::soma;<br />
// nao podemos chamar a função sem um<br />
// objeto do tipo A<br />
A a(2);<br />
A p = new A(3);</p>
<p>// chamando função pelo ponteiro<br />
int res;<br />
res = (a.*fpSoma)(2); // res recebe 4<br />
res = (p->*fpSoma)(2); // res recebe 5</p>
<p>[/sourcecode]</p>
<p>Repare em algumas peculariedades. Primeiramente, inicializamos o ponteiro passando o caminho do método ( &#38;A::soma - diz q soma pertence à classe A. Neste caso, o uso do operador &#38; passa a ser obrigatório). Como disse anteriormente, chama o método sem uma referência a um objeto da classe é impossível, então criamos os objetos 'a' e 'p' do tipo A. Finalmente, vemos os métodos sendo executados. Repare bem na sintaxe: voce usa o próprio objeto para chamar o método. No caso, dependendo do tipo (se é uma referência ou um ponteiro), usamos um operador diferente. ' .* ' ou ' -&#62;* '.</p>
<p>Num outro post, irei descrever a implementação de uma classe genérica (templated) que facilita a manipulação de ponteiro para métodos.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[YATK - Uma breve introdução]]></title>
<link>http://blabos.wordpress.com/2008/01/07/yatk-uma-breve-introducao/</link>
<pubDate>Mon, 07 Jan 2008 01:13:11 +0000</pubDate>
<dc:creator>blabos</dc:creator>
<guid>http://blabos.wordpress.com/2008/01/07/yatk-uma-breve-introducao/</guid>
<description><![CDATA[Em minhas andanças pelo mundo da programação fui parar na terra de C++. País estranho, habitado ]]></description>
<content:encoded><![CDATA[<p>Em minhas andanças pelo mundo da programação fui parar na terra de C++. País estranho, habitado por colonizadores que vieram de um país ainda mais estranho chamado C, e criaram sua própria sociedade. Muitas regras e muitos conceitos são novos e liberais, mas ainda há muita influência das tradições trazidas de C.</p>
<p>Quando as leis de C++ não são suficientemente poderosas para resolver os conflitos, o povo apela para as tradições de C. Muito embora sejam consideradas arcaicas, as tradições de C sempre resolvem os problemas, algumas vezes de formas dispendiosas é verdade, mas sempre resolvem.</p>
<p>Visando minimizar a dispendiosidades das tradições de C, cidadãos de bem de C++ passaram a estudá-las a fundo e criar simplificações que pudessem esconder o complexo emaranhado de detalhes e entregar apenas os resultados finais das tradições aplicadas. Esses cidadãos deram às suas simplificações nomes bonitos como 'frameworks', 'wrappers', 'tool kits', entre outros, e obtiveram maior ou menor grau de sucesso ao longo de sua jornada.</p>
<p>Viajando por muito tempo através desse país, vi coisas fantásticas como <a href="http://pt.wikipedia.org/wiki/Inter-Process_Communication">IPC</a>, <a href="http://pt.wikipedia.org/wiki/Base_de_dados">Databases</a> e <a href="http://en.wikipedia.org/wiki/Berkeley_sockets">Sockets</a>. Resolvi então agradecer a hospitalidade e os ensinamentos de seu povo fixando residência e ajudando na 'tradução' de algumas das antigas leis, junto com alguns valorosos companheiros de estrada. Dei à minha contribuição o nome de YATK por acreditar que ela não seja uma implementção maior do que as dos que vieram antes de mim.</p>
<p>Logo mais contarei nossas aventuras atravessando os desertos de Shared Memory, onde tribos nômades rivais disputavam arduamente os oásis de recursos gerando diversos conflitos sistêmicos, e como conseguimos ensiná-los a trabalhar sincronizados. Até a próxima...</p>
<p><a href="http://sourceforge.net/projects/yatk">http://sourceforge.net/projects/yatk</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Pilha de telas]]></title>
<link>http://vertexbuffer.wordpress.com/2008/01/04/7/</link>
<pubDate>Fri, 04 Jan 2008 15:13:39 +0000</pubDate>
<dc:creator>dfaobolinho</dc:creator>
<guid>http://vertexbuffer.wordpress.com/2008/01/04/7/</guid>
<description><![CDATA[Oi povo, desculpem a demora para responder, final do ano é sempre uma correria, e no trabalho não ]]></description>
<content:encoded><![CDATA[<p>Oi povo, desculpem a demora para responder, final do ano é sempre uma correria, e no trabalho não é diferente. Estou de volta com novos posts dicas e informações.</p>
<p>Sei que falei que iria falar da classe BaseGame da engine, mas decidi passar pra algo mais pratico. Várias pessoas nas ultimas semanas vieram conversar comigo sobre gerenciamento de telas em engines de jogos. Aqui na Tecnodata, desenvolvemos uma solução bem elegante e de conceito simples - uma pilha.</p>
<p>A engine tem, internamente, uma pilha controlada por um gerenciador de telas. Esse gerenciador contem os metodos de push() e pop(), assim como metodos para acessar a tela no topo da pilha ( topScreen() ), e delegar as chamadas dos metodos Update() e Draw() à tela mais visivel. Para que isso seja viável, uma tela é um conceito encapsulado em uma classe Tela. Vamos ver um exemplo de código de como isso poderia funcionar em C++. O esqueleto da classe Tela:<br />
[sourcecode language='cpp']</p>
<p>class Tela<br />
{<br />
public:<br />
    virtual void update(dword msTime) = 0;<br />
    virtual void draw(dword msTime) = 0;<br />
};</p>
<p>[/sourcecode]<br />
A classe Tela é bem simples, basicamente apenas declarando uma interface minima que todas as telas devem ter para que possam ser gerenciadas. (nota: o tipo de dados dword é simplesmente um valor 32bits sem sinal - ou seja - um unsigned int numa maquina 32bits).Agora vamos ver o esqueleto do gerenciador:<br />
[sourcecode language='cpp']</p>
<p>class GerenciadorTelas<br />
{<br />
private:<br />
    stack<Tela*> _pilha;</p>
<p>public:<br />
    // construtor/destrutor omitidos</p>
<p>    void push(Tela *tela);<br />
    Tela* pop();<br />
    Tela* telaAtual();</p>
<p>    void update(dword msTime);<br />
    void draw(dword msTime);<br />
};</p>
<p>[/sourcecode]<br />
Como eu tinha dito, o gerenciador internamente trabalha com uma pilha de telas. Para adicionar uma nova tela visivel no jogo, basta criar o objeto dessa tela (ie. Tela *t = new TelaQualquer() ) e adicionar na pilha. Desse jeito, no proximo frame da engine, a tela irá trocar automaticamente da tela anterior para a nova, pois estará chamando update e draw na nova tela.</p>
<p>O interessante é que, como estamos falando de pilha, a tela anterior ainda existe, entao voltar para a tela anterior é tao simples quanto dar um pop() no gerenciador. Isso garante que voce possa ter uma hierarquia de telas no seu jogo faceis de gerenciar e navegar.O exemplo mostrado aqui é extremamente simples, apenas para demonstrar a idea básica. Porém, no nosso sistema, telas incluem máquina de estados, serialização e transparência (caso uma tela tenha uma transparência inferior a 1.0, a tela abaixo dela na pilha também é visivel e, portanto, também recebe chamadas a update() e draw() ).</p>
<p>O gerenciador de telas não apenas gerencia a pilha, como também tem opções específicas para transição entre-telas (não apenas troca), acesso a telas por índice e por tipo (não apenas ao topo da pilha), e tem todos seus métodos como virtuais, possibilitando sua extensão fácil caso necessário.<b></b><br />
<b>Leitura extra</b></p>
<p>Um artigo bem interessante sobre organização de telas em classes pode ser lido <a href="http://vinigodoy.wordpress.com/page/4/" target="_blank">neste post</a> do blog <a href="http://vinigodoy.wordpress.com/" target="_blank">Ponto V</a>. Nao deixem de visitar.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[DB4Objects]]></title>
<link>http://techinside.wordpress.com/2007/11/13/db4objects/</link>
<pubDate>Tue, 13 Nov 2007 16:21:23 +0000</pubDate>
<dc:creator>manhani</dc:creator>
<guid>http://techinside.wordpress.com/2007/11/13/db4objects/</guid>
<description><![CDATA[  Pra quem não conhece, o DB4Objects ou simplesmente DB4O como todos o chamam, é um pequeno banco ]]></description>
<content:encoded><![CDATA[<p><span style="color:#999999;font-style:italic;font-size:10px;"></span>  <span style="color:#999999;font-style:italic;font-size:10px;"></span><a href="http://techinside.wordpress.com/2007/11/13/db4objects/db4o-logo/" rel="attachment wp-att-16" title="DB4O Logo"><img src="http://techinside.wordpress.com/files/2007/11/h_logo.gif" alt="DB4O Logo" align="left" /></a>Pra quem não conhece, o <strong>DB4Objects</strong> ou simplesmente <strong>DB4O</strong> como todos o chamam, é um pequeno <strong>banco de dados</strong> orientado à objetos open source.</p>
<p>Uma excelente opção  para quem está desenvolvendo um sistema de pequeno porte e utilizando orientação à objetos. O <strong>DB4O</strong> faz a persistência baseando-se em suas classes objeto, dispensando todo e qualquer mapeamento necessário como quando utilizamos banco de dados relacionais, e com apenas uma linha de código salva os dados desejados em banco.</p>
<p>Exemplo:</p>
<blockquote><p><font color="#0000ff"><code>public void store(Car car){<br />
ObjectContainer db =<br />
Db4o.openFile("car.yap");<br />
<strong>db.set(car)</strong>;<br />
db.commit();<br />
db.close();<br />
}</code></font></p></blockquote>
<p>Como podem ver neste trecho de <strong>código</strong>, a sua utilização é bem simples precisando apenas passar ao método, a classe que será salva e o arquivo do banco onde os dados serão persistidos. Todo o resto é feito pelo banco de dados.</p>
<p>Disponível tanto para <strong>Java</strong> quanto para <strong>.Net</strong>, este banco de dados diz rodar até 55 vezes mais rápido do que sistemas convencionais, o que é bem significante considerando-se que o que todo desenvolvedor busca na maioria de suas aplicações além da qualidade é a velocidade de resposta.</p>
<p>Para visualizar os dados persistidos no banco é utilzada uma ferramenta chamada Object Manager, também muito simples de se utilizar.</p>
<p><a href="http://techinside.wordpress.com/2007/11/13/db4objects/screenshot-object-manager/" rel="attachment wp-att-17" title="Screenshot Object Manager"></p>
<p style="text-align:center;"><img src="http://i222.photobucket.com/albums/dd142/techinside/db40ss.jpg" alt="DB4O" height="238" width="350" /></p>
<p></a></p>
<p>Para se aprofundar mais sobre a tecnologia utilizada por este software, ou mesmo fazer o <strong>download</strong> do jar/dll,  visite o site do <a href="http://www.db4o.com" target="_blank">DB4O.</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Novo livro de PHP]]></title>
<link>http://marcelioleal.wordpress.com/2007/11/06/novo-livro-de-php/</link>
<pubDate>Tue, 06 Nov 2007 17:51:48 +0000</pubDate>
<dc:creator>marcelioleal</dc:creator>
<guid>http://marcelioleal.wordpress.com/2007/11/06/novo-livro-de-php/</guid>
<description><![CDATA[ 
Eu recomendo e já encomendei o meu. 
]]></description>
<content:encoded><![CDATA[<p> <a href="http://www.dalloglio.net/phpoo"><img src="http://www.dalloglio.net/images/book2big-poo.png" /></a></p>
<p>Eu recomendo e já encomendei o meu. :)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Uncle Bob and Chad Fowler - Debating Static versus Dynamic Typing]]></title>
<link>http://queroseragil.wordpress.com/2007/11/02/uncle-bob-and-chad-fowler-debating-static-versus-dynamic-typing/</link>
<pubDate>Fri, 02 Nov 2007 21:53:40 +0000</pubDate>
<dc:creator>Rafael Mueller</dc:creator>
<guid>http://queroseragil.wordpress.com/2007/11/02/uncle-bob-and-chad-fowler-debating-static-versus-dynamic-typing/</guid>
<description><![CDATA[JAOO 2007: Bob Martin and Chad Fowler - Debating Static versus Dynamic Typing.
Um vídeo de 35 minut]]></description>
<content:encoded><![CDATA[<p><a href="http://mschnlnine.vo.llnwd.net/d1/ch9/0/JAOO2007_Static_VS_Dynamic.wmv" target="_blank">JAOO 2007: Bob Martin and Chad Fowler - Debating Static versus Dynamic Typing</a>.</p>
<p>Um vídeo de 35 minutos com <a href="http://www.objectmentor.com/omTeam/martin_r.html" target="_blank">Robert C. Martin</a> e <a href="http://chadfowler.com/about-me" target="_blank">Chad Fowler</a> no <a href="http://jaoo.dk/conference/" target="_blank">JAOO 2007</a>.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Entrevista com Uncle Bob @ JAOO 2007]]></title>
<link>http://queroseragil.wordpress.com/2007/11/02/entrevista-com-uncle-bob-jaoo-2007/</link>
<pubDate>Fri, 02 Nov 2007 21:33:30 +0000</pubDate>
<dc:creator>Rafael Mueller</dc:creator>
<guid>http://queroseragil.wordpress.com/2007/11/02/entrevista-com-uncle-bob-jaoo-2007/</guid>
<description><![CDATA[É sempre bom ouvir alguém como Robert C. Martin - Uncle Bob falar  
Aqui está disponível uma peq]]></description>
<content:encoded><![CDATA[<p>É sempre bom ouvir alguém como <a href="http://www.objectmentor.com/omTeam/martin_r.html" target="_blank">Robert C. Martin</a> - Uncle Bob falar :)</p>
<p><a href="http://mschnlnine.vo.llnwd.net/d1/ch9/0/JAOO2007_BobMartin.wmv" target="_blank">Aqui</a> está disponível uma pequena entrevista com 11 minutos, onde ele fala que atualmente ainda existe *muita* coisa horrível sendo produzida, códigos que não deveriam ser escritos. São práticas que são conhecidas a muito tempo como sendo práticas ruins e mesmo assim continuam sendo utilizadas.</p>
<p>Depois ele fala sua opinião sobre desenvolvimento de software ser um engenharia, segue falando sobre TDD, um pouco sobre como Java, .NET e Ruby e como os códigos desenvolvidos nessas linguagens são/podem ser mais fluentes/expressivos... e por aí vai, é uma entrevista curta mas com bastante conteúdo :)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Programação orientada a Objetos - Boas práticas de programação (1)]]></title>
<link>http://gregui.wordpress.com/2007/10/10/programacao-orientada-a-objetos-boas-praticas-de-programacao-1/</link>
<pubDate>Wed, 10 Oct 2007 18:51:27 +0000</pubDate>
<dc:creator>Gregui Shigunov</dc:creator>
<guid>http://gregui.wordpress.com/2007/10/10/programacao-orientada-a-objetos-boas-praticas-de-programacao-1/</guid>
<description><![CDATA[Tenho participações em fóruns como JavaFree e PortalJava. E notei que muitos programadores se ]]></description>
<content:encoded><![CDATA[<p>Tenho participações em fóruns como JavaFree e PortalJava. E notei que muitos programadores se "batem" com orientação a objetos, mesmo utilizando uma linguagem Orientada a Objetos como Java, Flex, Php.</p>
<p>Tentarei trazer dicas de orientação a objeto e boas práticas de programação, utilizando exemplos simples para o fácil entendimento. No momento estou bem ocupado, então posso demorar para postar coisas novas! ;)</p>
<p>Então...</p>
<p>Notem este código:<br />
<font color="#0000ff">public class Motor {</font></p>
<p><font color="#0000ff">}</font></p>
<p><font color="#0000ff">public class Carro {<br />
private Motor motor = new Motor();</font></p>
<p><font color="#0000ff"><font color="#339966">     //construtora </font><br />
public Carro(Motor motor) {<br />
this.motor = motor;<br />
}<br />
}</font></p>
<p>Um exemplo muito simples, com dois objeto (Carro e Motor);</p>
<p>Agora, notem...<br />
- A contrutora da classe "Carro", informa (obriga) que um "Carro" tenha um "Motor".<br />
- Então antes de instanciar um carro, eu preciso instanciar um motor (motor pode ser "null", nulo).<br />
- Quando eu contruir um carro, eu incluo o motor no carro, mas notem a linha 2:<br />
private Motor motor = new Motor();<br />
- Se a construtora de "Carro" me obriga ter um "Motor", por que diabo ela já tem um motor construído?</p>
<p>É mais ou menos como: "Vou contruir um carro 2.0, mas o carro já possuí um motor 1.0, então terei que tirar o motor 1.0, e substituir pelo 2.0"<br />
(No mundo real isso é bom, já que eu teria um motor sobrando, mas ...  na programação há disperdício de processamento e memória para criar o motor 1.0, já que foi contruído e não foi utilizado)</p>
<p>- Agora você deve se perguntar, grande coisa... Não vai fazer muita diferença.<br />
- Para um exemplo simples como esse sim, mas imagine um sistema complexo, com classe gigantes e complexas</p>
<p>Agora olhem a classe abaixo:</p>
<p><font color="#0000ff">public class Carro {<br />
<b>private Motor motor = null;</b></font></p>
<p><font color="#0000ff"><font color="#008000">    //construtora</font><br />
public Carro(Motor motor) {<br />
this.motor = motor;<br />
}<br />
}</font></p>
<p>No carro eu "declarei" mas não "instanciei" o Motor.<br />
É mais ou menos como: "tenho um carro, agora só falta o motor (reservei espaço para o Motor)"</p>
<p>Uma outra Boa Prática de Programação (BPP) é, sempre informar o valor da variável ao declará-la.<br />
Como no exemplo abaixo</p>
<p>Exemplo de utilização:</p>
<p><font color="#0000ff">Motor motor_1;    <font color="#008000">//não recomendado</font><br />
Motor motor_2 = null;   <font color="#008000">//OK</font><br />
Motor motor_3 = new Motor(); <font color="#008000">//OK</font></font></p>
<p><font color="#0000ff">motor_1 = new Motor();<br />
motor_2 = new Motor();</font></p>
<p><font color="#0000ff">Carro corsa = new Carro(motor_1);<br />
Carro corsa_sedan = new Carro(motor_2);</font></p>
<p>Até a próxima ;)</p>
]]></content:encoded>
</item>

</channel>
</rss>
