cvs: php-gtk-doc /manual/pt_BR/tutorials objectorientation.xml

[email protected] ("Fernando Correa da Concei??o")
Newsgroups php.gtk.doc
Message-ID <cvsfernandoc1160255376@cvsserver>
fernandoc		Sat Oct  7 21:09:36 2006 UTC

  Added files:                 
    /php-gtk-doc/manual/pt_BR/tutorials	objectorientation.xml 
  Log:
  New Translation, only two more in tutorials
fernandoc-20061007210936.txt (text/plain, 17.9 KB)
http://cvs.php.net/viewvc.cgi/php-gtk-doc/manual/pt_BR/tutorials/objectorientation.xml?view=markup&rev=1.1
Index: php-gtk-doc/manual/pt_BR/tutorials/objectorientation.xml
+++ php-gtk-doc/manual/pt_BR/tutorials/objectorientation.xml
<?xml version="1.0" encoding="utf-8" ?>
<!-- EN-Revision: 1.5 Maintainer: fernandoc Status: ready -->
<chapter id="tutorials.objectorientation">
 <title>Programação Orientada a Objetos</title>

 <sect1> 
  <title>Sobre este tutorial</title>
  <simpara>
   Este tutorial irá tentar ensinar a você como programar em PHP-GTK 2 em uma
   mareira orientada a objetos. O PHP5 vem com um grande suporte orientado a objetos e asim nós
   podemos explorar todas as vantagens de programação orientada a objetos enquanto
   fazemos aplicações em PHP-GTK 2.
  </simpara>
  <simpara>
    Porque programar em uma maneira orientada a objetos? Existem várias vantagens
    em escolher este estilo de programação, especialmente se sua aplicação é dividida 
    em vários módulos e é esperado que tenha milhares de linhas de tamanho.
    Uma das vantagens mais importantes e a limpeza e organização do código.
    Será muito mais fácil para você e para os outros ler e modificar o seu código se
    o seu programa esta em uma maneira orientada a objetos do que se você escolheu fazer
    a sua aplicação de uma maneira puramente orientada a procedimentos.
  </simpara>
  <simpara>
    Se você esta convencido de que a orientação a objetos é o caminho a seguir, vamos começar!
  </simpara>
 </sect1>

 <sect1 id="tutorials.objectorientation.basics">
  <title>Orientação a Objetos Basica</title>
  <simpara>
   Eu vou assumir que você já seja acostumado a programação orientada a objetos.
   se você não for, eu sugiro que você se acostume com ela antes de
   continuar com este tutorial. Você pode também olhar o manual do PHP
   na seção sobre orientação a objetos para o PHP5, assim tudo
   isto fará mais censo para você
  </simpara>
  <para>
   Nós vamos começar em "portar" o programa simples Alô Mundo! para uma
   natureza orientada a objetos, assim você pode ter uma amostra do conceito rapidamente. A primeira
   coisa que você tem que fazer é criar uma classe. A maneira mais fácil de fazer a sua classe
   é extender umas das classes do PHP-GTK 2. Agora, a maioria das aplicações tem um  
   <classname>GtkWindow</classname> como seu widget principal. Assim faz o nosso
   programa Alô Mundo. Assim o que nós vamos fazer é criar uma classe que 
   <literal>extenda</literal> <classname>GtkWindow</classname>, assim fará
   o nosso trabalho mais fácil:
   <programlisting role="php"><![CDATA[
<?php

class Hello extends GtkWindow
{
    // o código vai aqui.
}

?>]]></programlisting>
   Agora nós precisamos criar o construtor da nossa classe (uma função que é
   chamada quando um objeto da nossa classe é criado). Vamos pensar sobre o
   que nós precisamos colocar no construtor. Já que o construtor é a primeira coisa a ser chamada
   quando um objeto da nossa classe é criado, nós precisamos todos os aspectos
   do design do nosso programa no construtor. Isto indica que o construtor
   é o lugar onde criamos todos os widgets que vamos precisar, desenhar o nosso
   layout (veja <link linkend="tutorials.packing">Empacotando Widgets</link>) e
   finalizar como a nossa aplicação deve aparecer.
  </para>
  <para>
   Agora a nossa classe extende <classname>GtkWindow</classname>, mas isso não quer disser
   que o construtor <classname>GtkWindow</classname> será chamado
   automaticamente. Este é o funcionamento padrão no PHP5 e assim nós devemos chamar o construtor de
   <classname>GtkWindow</classname> explicitamente, usando a palavra chave 
   <literal>parent</literal>:
   <programlisting role="php"><![CDATA[
class Hello extends GtkWindow
{
    function __construct()
    {
        parent::__construct();
    }
}
]]></programlisting>
   Isto significa que um GtkWindow será criado (sem parâmetros passados para
   o seu construtor) quando um objeto da nossa classe "Hello" for criado. Agora a questão
   é como acessar a janela récem criada. A palavra chave
   <literal>this</literal> vem em nosso socorro! Usando esta palavra chave
   nós podemos modificar todos os aspectos da nossa janela récem criada:
   <programlisting role="php"><![CDATA[
function __construct()
{
    parent::__construct();
    $this->set_title('Alô Mundo!');
    $this->connect_simple('destroy', array('gtk', 'main_quit'));
}
]]></programlisting>
  </para>
  <para>
    Já que este é um programa muito simples, nós podemos finalizar as nossas tarefas
    no construtor em sí. Nós simplesmente colocamos o código que nós tinhamos colocado em nosso
    programa orientado a procedimentos aqui. Assim nós temos o programa terminado:
    <example>
     <title>Alô Mundo - Estilo Orientado a Objetos</title>
     <programlisting role="php">
      <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" 
       href="&directory.examples;/tutorials/objectoriented/simple.phpw" parse="text">
       <xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback>
      </xi:include>
     </programlisting>
    </example>
    Mesmo sendo dificilmente este exemplo um grande exemplo para mostrar o caminho para
    uma maneira orientada a objetos, ele deve ajudar bastante para você começar. Nós iremos
    ver alguns dos conceitos mais avançados agora.
  </para>
 </sect1>

 <sect1 id="tutorials.objectorientation.advanced">
  <title>Um pouco mais de complexidade</title>
  <para>
   Nós não usamos a maioria do poderoso suporte a orientação a objetos do PHP5 ainda. Vamos
   fazer uma aplicação que abra um arquivo de texto e mostre o seu conteúdo para você,
   uma aplicação simples parecida com o bloco de notas. Por favor note que esta é uma
   aplicação muito muito simples apenas para fins educativos e não tem uma funcionalidade pratica.
   Aqui esta o código, leia-o, e não seja intimidado pelo seu tamanho. Uma explicação
   detalhada segue o código:
   <example>
    <title>Um simples bloco de nota</title>
    <programlisting role="php">
     <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" 
     href="&directory.examples;/tutorials/objectoriented/notepad.phpw" parse="text">
      <xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback>
     </xi:include>
    </programlisting>
   </example>
  </para>
 
  <sect2 id="tutorials.objectorientation.advanced.construct">
   <title>O construtor</title>
   <para>
    A estrutura da classe é semelhante ao que nós vimos antes, exceto pela
    adição de algumas propriedades da classe e funções. Primeiro vamos dar uma olhada
    no construtor. O construtor leva um parâmetro opcional que o
    padrão é <literal>null</literal>. Este parâmetro é (caminho de) o
    nome do arquivo que você quer abrir. Se você não passar um parâmetro para o
    cosntrutor, ele simplesmente irá abrir nada.
   </para>
   <para>
    OK, assim  nós primeiro construimos o parent (um GtkWindow) e então criamos alguns
    widgets que iremos usar. Um <classname>GtkVBox</classname> para o nosso layout, um
    <classname>GtkTextBuffer</classname> e um
    <classname>GtkTextView</classname> para mostrar o conteúdo do arquivo e um 
    <classname>GtkStatusBar</classname> para mostrar algumas mensagens. Nós configuramos
    o layout e adicionamos os respectivos widgets para o VBox.
   </para>
   <para>
    Próximo nós definimos as propriedades da classe:
    <programlisting role="php"><![CDATA[
$this->currentFile = $fileName;
$this->buffer = $textBuff;
$this->status = $statusBar;
]]> </programlisting>
    Estas três linhas definem valores para as propriedades de classe. Propriedades
    de classe são uma parte essencial de todas as aplicações orientadas a objeto
    em PHP-GTK 2. Elas são úteis porque você pode precisar acessar um widget em particular
    em uma função na qual ele não foi criado. Quando nós criamos um widget, o escopo
    para o objeto é apenas a função na qual ele foi criado. Por exemplo
    nós criamos a barra de status no construtor da nossa classe, mas nós obviamente
    precisamos acessa-la em outros lugar (quando nós precisarmos colocar algumas mensagens nela). Mas
    já que a variável <literal>$statusBar</literal> pode ser acessada apenas
    no construtor, nós definimos um propriedade de classe chamada
    <literal>status</literal>) para ela. Agora nós podemos acessar a barra de status em qualquer
    função da classe usando <literal>$this->status</literal>.
   </para>
   <para>
    Simplesmente extenda este conceito para os outros widgets também. Basicamente, você
    precisa definir propriedades de classes para os widgets que você acha que vai precisar
    em todo o escopo da classe. Ataulamente, propriedades de classes podem ser usadas eficientemente para
    gardar quaisquer dados que você precise em toda a classe. Um exemplo disso em nossas
    aplicações é a propriedade <literal>currentFile</literal>.
    Isto irá simplesmente guardar o caminho para o arquivo atualmente aberto, ou
    <literal>null</literal> se nenhum estiver. Nós podemos então saber
    o arquivo atualmente aberto em qualquer função da classe. Propriedades de classe tem outros 
    usos também, um dos que eu posso pensar é como marcador. Para a nossa
    aplicação de bloco de notas, você deve querer adiionar um propriedade chamada
    <literal>saved</literal> a qual tem um um valor booleano para indicar
    quando o arquivo atual foi salvo em disco ou não.
   </para>
   <para>
    Note que todas as propriedades de classe foram definidas como
    <literal>protected</literal>. Isto é simplesmente uma boa pratica de orientação a objetos.
    Nós não queremos que sejam publicas, mas nós também queremos que qualquer classe
    que estenda a nossa possa acessa-las.
   </para>
   <para>
    E finalmente, nós definios o titulo da janela, maximizamos ela, adicionamos o layout
    e mostramos todos os widgets. E então nós chamamos a função <literal>loadFile()</literal>
    para mostrar o conteúdo do nosso arquivo no text buffer que
    nós tinhamos criado.
   </para>
  </sect2>

  <sect2 id="tutorials.objectorientation.advanced.buildmenu">
   <title>A função buildMenu()</title>
   <para>
    Note agora como nós chamamos esta função a partir do construtor:
    <programlisting role="php"><![CDATA[
$mainBox->pack_start($this->buildMenu(), false, false);
]]> </programlisting>
    Nós fazemos assim porque nós queremos dividir a nossa classe em vários módulos como
    for possível. Ao invés de todo o nosso layout no construtor em sí,
    é melhor dividir o layout em partes principais e dedicar uma
    função para cada parte. Aqui nós temos uma função para fazer a barra do menu, mas
    não para o text view ou para a barra de status porque eles precisam
    apenas duas linhas para serem construídos!
   </para>
   <para>
    Nesta função, nós apenas criamos a nossa barra de menus, adicionamos um menu file (arquivo)
    com um único item "Quit" (sair). Vamos dar uma olhada nestas linhas:
    <programlisting role="php"><![CDATA[
$quit->connect_simple('activate', array($this, 'quit'));
$quit->connect_simple('enter_notify_event', array($this, 'updateStatus'), 1);
$quit->connect_simple('leave_notify_event', array($this, 'updateStatus'), 0);
]]> </programlisting>
    Aqui nós conectamos <literal>activate</literal>,
    <literal>enter-notify-event</literal> e
    <literal>leave-notify-event</literal> aos
    seus respectivos manipuladores. Olhe o segundo parâmetro das funções
    <literal>connect_simple()</literal>. è uma matriz com dois
    elementos. O primeiro elemento é a variável especial <literal>$this</literal>
    e o segundo elemento é uma string. Se você leu o tutorial 
    <link linkend="tutorials.helloworld">Alô mundo</link>, você deve
    ter visto uma linha como essa:
    <programlisting role="php"><![CDATA[
$wnd->connect_simple('destroy', array('gtk', 'main_quit'));
]]> </programlisting>
    Compare a utilização e você deve notar que quando você quiser
    conectar um sinal para uma função callback a qual seja de uma classe, você deve especificar
    o callback como uma matriz, o primeiro elemento o qual aponta para uma classe,
    e o segundo elemento o qual é o nome do callback. Assim, nós
    conectamos os vários eventos do nosso botão de "quit" para
    <literal>this</literal> <literal>quit()</literal> e
    <literal>updateStatus()</literal>.
   </para>
   <para>
    Algumas vezes é possível passar parâmetros para funções para poder usar
    estes objetos nas funções. Como uma regra, se você tem mais de uma função
    que usa um objeto em particular, é melhor dedicar uma propriedade de classe para ele;
    mas se houver apenas uma única função que precise do objeto, ao invés
    é melhor passar o objeto como parâmetro. Uma ocorrencia comum
    para esta situação é ao conectar sinais para callbacks. de uma olhada
    no tutorial sobre sinais e callbacks para mais sobre isto e sobre como passar
    parâmetros personalizados para os callbacks.
   </para>
   <para>
    Voltando para a função, nós retornamos o widget <literal>superior</literal>
    em nosso menu, a barra de menus, após adicionar a ela o submenu. O
    construtor então recebe este objeto e adiciona-o ao VBox principal.
   </para>
  </sect2>

  <sect2 id="tutorials.objectorientation.advanced.loadfile">
   <title>A função loadFile()</title>
   <para>
    O proposito desta função é carregar o conteúdo do arquivo que será aberto e mostra-lo
    no text view. Primeiro nós conferimos
    se a propriedade de classe <literal>currentFile</literal> não é null, e
    então usamos o metodo <function class="GtkTextBuffer">set_text</function>
    na propriedade de classe <literal>buffer</literal>.
   </para>
  </sect2>

  <sect2 id="tutorials.objectorientation.advanced.updatestatus">
   <title>A função updateStatus()</title>
   <para>
    Esta função serve como callback para os sinais
    <literal>enter-notify-event</literal> e
    <literal>leave-notify-event</literal>. Aqui nós acessamos a barra de status
    via a propriedade de classe <literal>status</literal>  e adicionamos/removemos uma mensagem
    dependendo quando o mouse esta entrando ou saindo do botão de menu "Quit".
   </para>
  </sect2>

  <sect2 id="tutorials.objectorientation.advanced.quit">
   <title>A função quit()</title>
   <para>
    Esta é a mais simples função de todas, apenas uma que sai do loop principal
    do GTK. Você deve imaginar porque nós temos uma função de apenas uma linha chamada "quit"
    quando nós podiamos conectar os sinais diretamente a <literal>main_quit</literal> 
    como isto:
    <programlisting role="php"><![CDATA[
$this->connect_simple('destroy', array('Gtk', 'main_quit'));
]]> </programlisting>
    A razão para isto é, em aplicações, você provavelmente quereria fazer 
    alguma limpesa antes da aplicação terminar, e esta função é a sua change de
    faze-lo. Para a nossa simples aplicação bloco de notas, uma adição que é possível
    aqui é conferir se a marcação <literal>saved</literal> (novamente, uma
    propriedade de classe) e perguntar ao usuário se ele quer salvar o arquivo se não estiver salvo.
   </para>
  </sect2>

  <sect2 id="tutorials.objectorientation.advanced.instantiate">
   <para>
    As ultimas duas linhas:
    <programlisting role="php"><![CDATA[
new Notepad('simple.phpw');
Gtk::main();
]]> </programlisting>
    Cria uma instancia de um objeto da nossa classe ( e portanto abre o arquivo simple.phpw
    localizado no mesmo diretório) e começa o loop principal do GTK. Você pode também
    mudar <literal>Gtk::main()</literal> para o construtor da nossa classe.
   </para>
  </sect2>
 </sect1>

 <sect1 id="tutorials.objectorientation.summary">
  <title>Summary</title>
  <para>
   Espero que este tutorial tenha sido de algum uso em fazer você começar com o
   estilo de programação orientado a objetos no PHP-GTK 2. Antes de nós terminarmos, mais
   algumas dicas seguem.
 </para>
  <para>
   <itemizedlist>
    <listitem>
     Se você esta construindo uma aplicação extremamente grande, você deve querer
     dividir em multiplas classes: uma classe para cada módulo. Para a maioria das aplicações
     entretanto, uma única classe deve ser suficiente.
    </listitem>
    <listitem>
     Se você usa várias classes em sua aplicação, a questão de acessar
     objetos de uma classe em outra aparece. Neste caso, tente criar uma 
     hierarquia, uma classe principal com outras extendendo ela. Se isso não for
     possível, ao invés use varáveis globais (não recomendado).
    </listitem>
    <listitem>
     Se mais de uma função de sua classe precisar acessar um widget, torne-o uma 
     propriedade de classe. Entretanto se apenas uma função precisa dele, passe-o
     invés como um parâmetro.
    </listitem>
    <listitem>
     Sempre tente extender as suas classes a partir da classe widget que irá formar
     a base da sua classe. Também lembre-se que você precisa construir este widget
     explicitamente usando o cmando <literal>parent::__construct();</literal>.
     Você pode acessar os metodos deste widget através da 
     palavra chave <literal>this</literal>.
    </listitem>
    <listitem>
     Mantenha as sua funções tão pequenas quanto possível. Todo o ponto da programação
     orientada a objetos é a modulização. Se uma função esta começando a ficar inchada,
     considere ividi-la. Uma ocorrencia fequente deste caso é quando você
     tentar todo o seu layout (complicado) no construtor em sí.
     Ao invés, divida em funções que criam partes do layout e junte-os
     todos no construtor.
    </listitem>
   </itemizedlist>
  </para>
  <para>
   Não esqueça de dar uma olhada na seção Gtk2_Components no 
   <ulink url="http://pear.php.net/">PEAR</ulink>. 
   Todos os pacotes ali são feitos de código orientado a objetos de alta qualidade. 
   Leia os seus fontes e imite.
  </para>
 </sect1>
 
</chapter>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.