quarta-feira, 19 de fevereiro de 2014

Encapsulamento, Polimorfismo, Herança – Parte 02

Encapsulamento

Encapsulamento vem de encapsular, que em programação orientada a objetos significa separar o programa em partes, o mais isolado possível. A idéia é tornar o software mais flexível, fácil de modificar e de criar novas implementações. O Encapsulamento serve para controlar o acesso aos atributos e métodos de uma classe. É uma forma eficiente de proteger os dados manipulados dentro da classe, além de determinar onde esta classe poderá ser manipulada. Usamos o nível de acesso mais restritivo, private, que faça sentido para um membro particular. Sempre usamos private, a menos que tenhamos um bom motivo para deixá-lo com outro nível de acesso. Não devemos permitir o acesso público aos membros, exceto em caso de ser constantes. Isso porque membros públicos tendem a nos ligar a uma implementação em particular e limita a nossa flexibilidade em mudar o código. O encapsulamento que é dividido em dois níveis:


·       Nível de classe: Quando determinamos o acesso de uma classe inteira que pode ser public ou Package-Private (padrão);

·      Nível de membro: Quando determinamos o acesso de atributos ou métodos de uma classe que podem ser public, private, protected ou Package-Private (padrão).


Então para ter um método encapsulado utilizamos um modificador de acesso que geralmente é public, além do tipo de retorno dele. Para se ter acesso a algum atributo ou método que esteja encapsulado utiliza-se o conceito de get e set. Por definição, com SET é feita uma atribuição a algum atributo, ou seja, define, diz o valor que algum atributo deve ter. E  com GET é possível recuperar esse valor.


Exemplo:

1.            private String atributo1 = new String();  

2.            private String atributo2 = new String();  

3.            public String getAtributo1(){  

4.               return this.atributo1;  

5.            }  

6.            public String getAtributo2(){  

7.               return this.atributo2;  

8.            }  



Exemplo:

1.            public class Pessoa{

2.            private String nome;

3.            private String sobrenome;

4.            private String dataNasc;

5.            private String rg;

6.            private String[] telefones;



7.            public String getNome(){

8.            return nome;

9.            }

10.         public void setNome(String n){

11.         nome = n;

12.         }

13.         public String getSobrenome(){

14.         return sobrenome;

15.         }

16.         public void setSobrenome(String s){

17.         sobrenome = s;

18.         }

19.         public String getDataNasc(){

20.         return dataNasc;

21.         }

22.         public void setDataNasc(String d){

23.         dataNasc = d;

24.         }

25.         public String getRg(){

26.         return rg;

27.         }

28.         public void setRg(String r){

29.         r = rg;

30.         }

31.         public String getTelefones(){

32.         return telefones;

33.         }

34.         public void setTelefones(String[] telefones){

35.         telefones[] = telefones;

36.         }

37.         }


Encapsulamento, Polimorfismo, Herança – Parte 03


Herança

A herança é um mecanismo da Orientação a Objeto que permite criar novas classes a partir de classes já existentes, aproveitando-se das características existentes na classe a ser estendida. Este mecanismo é muito interessante, pois promove um grande reuso e reaproveitamento de código existente.  Com a herança é possível criar classes derivadas, subclasses, a partir de classes bases, superclasses. As subclasses são mais especializadas do que as suas superclasses, mais genéricas. As subclasses herdam todas as características de suas superclasses, como suas variáveis e métodos. A linguagem Java permite o uso de herança simples, mas não permite a implementação de herança múltipla. Para superar essa limitação o Java faz uso de interfaces, o qual pode ser visto como uma “promessa”que certos métodos com características previamente estabelecidas serão implementados, usando inclusive a palavra reservada implements para garantir esta implementação. As interfaces possuem sintaxe similar as classes, no entanto apresentam apenas a especificação das funcionalidades que uma classe deve conter, sem determinar como essa funcionalidade deve ser implementada. Apresentam apenas protótipos dos métodos.
 Por exemplo, Imagine que dentro de uma organização empresarial, o sistema de RH tenha que trabalhar com os diferentes níveis hierárquicos da empresa, desde o funcionário de baixo escalão até o seu presidente. Todos são funcionários da empresa, porém cada um com um cargo diferente. Mesmo a secretária, o pessoal da limpeza, o diretor e o presidente possuem um número de identificação, além de salário e outras características em comum. Essas características em comum podem ser reunidas em um tipo de classe em comum, e cada nível da hierarquia ser tratado como um novo tipo, mas aproveitando-se dos tipos já criados, através da herança. Os subtipos, além de herdarem todas as características de seus supertipos, também podem adicionar mais características, seja na forma de variáveis e/ou métodos adicionais, bem como reescrever métodos já existentes na superclasse, polimorfismo. A herança permite vários níveis na hierarquia de classes, podendo criar tantos subtipos quanto necessário, até se chegar ao nível de especialização desejado. Podemos tratar subtipos como se fossem seus supertipos, por exemplo, o sistema de RH pode tratar uma instância de Presidente como se fosse um objeto do tipo Funcionário, em determinada funcionalidade. Porém não é possível tratar um supertipo como se fosse um subtipo, a não ser que o objeto em questão seja realmente do subtipo desejado e a linguagem suporte este tipo de tratamento, seja por meio de conversão de tipos ou outro mecanismo. Algumas linguagens de programação permitem herança múltipla, ou seja, uma classe pode estender características de várias classes ao mesmo tempo. É o caso do C++. Outras linguagens não permitem herança múltipla, por se tratar de algo perigo se não usada corretamente. É o caso do Java. Na Orientação a Objetos as palavras classe base, supertipo, superclasse, classe pai e classe mãe são sinônimos, bem como as palavras classe derivada, subtipo, subclasse e classe filha também são sinônimos.
O que um aluno, um professor e um funcionário possuem em comum? Todos eles são pessoas e, portanto, compartilham alguns dados comuns. Todos têm nome, idade, endereço, etc. E, o que diferencia um aluno de outra pessoa qualquer? Um aluno possui uma matrícula; Um funcionário possui um código de funcionário, data de admissão, salário, etc.; Um professor possui um código de professor e informações relacionadas à sua formação.
É aqui que a herança se torna uma ferramenta de grande utilidade. Podemos criar uma classe Pessoa, que possui todos os atributos e métodos comuns a todas as pessoas e herdar estes atributos e métodos em classes mais específicas, ou seja, a herança parte do geral para o mais específico. Comece criando uma classe Pessoa, Pessoa.java, como mostrado no código a seguir:
1.            public class Pessoa{
2.            public String nome;   
3.            public int idade;
4.            }

Esta classe possui os atributos nome e idade. Estes atributos são comuns a todas as pessoas. Veja agora como podemos criar uma classe Aluno que herda estes atributos da classe Pessoa e inclui seu próprio atributo, a saber, seu número de matrícula. Eis o código:
1.            public class Aluno extends Pessoa{
2.            public String matricula;
3.            }

Observe que, em Java, a palavra-chave usada para indicar herança é extends. A classe Aluno agora possui três atributos: nome, idade e matricula. Exemplo:
1.            public class Estudos{
2.            public static void main(String args[]){
3.            Aluno aluno = new Aluno();
4.            aluno.nome = "Aluno Esforçado";
5.            aluno.idade = 20;
6.            aluno.matricula = "XXXX99999";

7.            System.out.println("Nome: " + aluno.nome + "\n" +
8.            "Idade: " + aluno.idade + "\n" +
9.            "Matrícula: " + aluno.matricula);
10.         }
11.         }

A herança nos fornece um grande benefício. Ao concentrarmos características comuns em uma classe e derivar as classes mais específicas a partir desta, nós estamos preparados para a adição de novas funcionalidades ao sistema. Se mais adiante uma nova propriedade comum tiver que ser adicionada, não precisaremos efetuar alterações em todas as classes. Basta alterar a superclasse e pronto. As classes derivadas serão automaticamente atualizadas.
1.            public abstract class Animal {
2.            public abstract void fazerBarulho();
3.            }
4.            public class Cachorro extends Animal {
5.            public void fazerBarulho() {
6.            System.out.println("AuAu!");
7.            }
8.            }
9.            public class Gato extends Animal {
10.         public void fazerBarulho() {
11.         System.out.println("Miau!");
12.         }
13.         }
14.         class Veiculo {
15.         public Veiculo() {
16.         System.out.print("Veiculo ");
17.         }
18.         public void checkList() {
19.         System.out.println("Veiculo.checkList");
20.         }
21.         public void adjust() {
22.         System.out.println("Veiculo.adjust");
23.         }
24.         public void cleanup() {
25.         System.out.println("Veiculo.cleanup");
26.         }
27.         }
28.         class Automovel extends Veiculo {
29.         public Automovel() {
30.         System.out.println("Automovel");
31.         }
32.         public void checkList() {
33.         System.out.println("Automovel.checkList");
34.         }
35.         public void adjust() {
36.         System.out.println("Automovel.adjust");
37.         }
38.         public void cleanup() {
39.         System.out.println("Automovel.cleanup");
40.         }
41.         }   
42.         class Bicicleta extends Veiculo {
43.         public Bicicleta() {
44.         System.out.println("Bicicleta");
45.         }
46.         public void checkList() {
47.         System.out.println("Bicicleta.checkList");
48.         }
49.         public void adjust() {
50.         System.out.println("Bicicleta.adjust");
51.         }
52.         public void cleanup() {
53.         System.out.println("Bicicleta.cleanup");
54.         }
}   

Encapsulamento, Polimorfismo, Herança – Parte 04


Polimorfismo

Polimorfismo é o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem invocar métodos que têm a mesma identificação, assinatura, mas comportamentos distintos, especializados para cada classe derivada, usando para tanto uma referência a um objeto do tipo da superclasse. O overload não é um tipo de polimorfismo, pois com overload a assinatura do método obrigatoriamente tem que ter argumentos diferentes, requisito que fere o conceito de Polimorfismo citado acima.

De forma genérica, polimorfismo significa várias formas. No caso da Orientação a Objetos, polimorfismo denota uma situação na qual um objeto pode se comportar de maneiras diferentes ao receber uma mensagem, dependendo do seu tipo de criação.

Por exemplo, a operação move quando aplicada a uma janela de um sistema de interfaces tem um comportamento distinto do que quando aplicada a uma peça de um jogo de xadrez. Um método é uma implementação específica de uma operação para certa classe. Polimorfismo também implica que uma operação de uma mesma classe pode ser implementada por mais de um método. O usuário não precisa saber quantas implementações existem para uma operação, ou explicitar qual método deve ser utilizado: a linguagem de programação deve ser capaz de selecionar o método correto a partir do nome da operação, classe do objeto e argumentos para a operação. Desta forma, novas classes podem ser adicionadas sem necessidade de modificação de código já existente, pois cada classe apenas define os seus métodos e atributos.  Em Java, o polimorfismo se manifesta apenas em chamadas de métodos.

A decisão sobre qual o método que deve ser selecionado, de acordo com o tipo da classe derivada, é tomada em tempo de execução, através do mecanismo de ligação tardia. A ligação tardia ocorre quando o método a ser invocado é definido durante a execução do programa. Através do mecanismo de sobrecarga, dois métodos de uma classe podem ter o mesmo nome, desde que suas assinaturas sejam diferentes, entretanto isso não é polimorfismo. Como dito anteriormente, tal situação não gera conflito, pois o compilador é capaz de detectar qual método deve ser escolhido a partir da análise dos tipos dos argumentos do método. Nesse caso, diz-se que ocorre a ligação prematura para o método correto. Em Java, todas as determinações de métodos a executar ocorrem através de ligação tardia exceto em dois casos:


1.            Métodos declarados como final não podem ser redefinidos e, portanto não são passíveis de invocação polimórfica da parte de seus descendentes; e

2.            Métodos declarados como private são implicitamente finais.


No caso de polimorfismo, é necessário que os métodos tenham exatamente a mesma identificação, sendo utilizado o mecanismo de redefinição de métodos, que é o mesmo que sobrescrita de métodos em classes derivadas.  A redefinição ocorre quando um método cuja assinatura já tenha sido especificada recebe uma nova definição, ou seja, um novo corpo, em uma classe derivada. É importante observar que, quando polimorfismo está sendo utilizado, o comportamento que será adotado por um método só será definido durante a execução. Embora em geral esse seja um mecanismo que facilite o desenvolvimento e a compreensão do código orientado a objetos, há algumas situações onde o resultado da execução pode ser não-intuitivo.



Exemplo:

abstract class Mamífero {
   public abstract double obterCotaDiariaDeLeite();
}

class Elefante extends Mamífero {
   public double obterCotaDiariaDeLeite(){
      return 20.0;
   }
}

class Rato extends Mamifero {
   public double obterCotaDiariaDeLeite() {
      return 0.5;
   }
}

class Aplicativo {
   public static void main(String args[]){
      System.out.println("Polimorfismo\n");
      Mamifero mamifero1 = new Elefante();
      System.out.println("Cota diaria de leite do elefante: " + mamifero1.obterCotaDiariaDeLeite());
      Mamifero mamifero2 = new Rato();
      System.out.println("Cota diaria de leite do rato: " + mamifero2.obterCotaDiariaDeLeite());
   }
}

domingo, 16 de fevereiro de 2014

Linguagem e Técnica de Programação - Aplicativo comercial

Aqui apresento um pequeno aplicativo, voltado  para a área comercial, com o intuito de automatizar trabalhos manuais desnecessários.Será composto pelas seguintes funcionalidades.

- Um menu principal com opção para chamar o cadastro de marcas e o de produtos;
- Um formulário para fazer a  inserção, manutenção e consulta de dados de marcas;
- Um formulário para fazer a  inserção, manutenção e consulta de dados de produtos;

Para que nossa aplicação seja possível de ser desenvolvida, deve-se fazer o uso de um banco de dados, (sugiro o uso do Firebird como padrão, mas qualquer SGBD pode ser utilizado). Será feito na linguagem C#.




 
 DESENVOLVIMENTO

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using FirebirdSql.Data.FirebirdClient;

namespace TRABALHO_UNOPAR
{
    public partial class CADASTROPRODUTOS : Form
    {
        public const string StrConn = "user=SYSDBA;Password=masterkey;Database=c:\\TRABALHOUNOPAR.FDB;Datasource=localhost";
        public CADASTROPRODUTOS()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void CADASTROPRODUTOS_Load(object sender, EventArgs e)
        {
            lblDESCRICAOMARCA.Text = "";

        }

        private void btnSAIR_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnINCLUIR_Click(object sender, EventArgs e)
        {
            FbConnection conexao = new FbConnection(StrConn);
            FbCommand comando = new FbCommand();
            string instrucaoSQL = "insert into TBL_PRODUTOS VALUES (@CODIGO,@DESCRICAO,@MARCA,@QTDE,@VALOR)";
            comando.Connection = conexao;
            comando.CommandType = CommandType.Text;
            comando.CommandText = instrucaoSQL;
            comando.Parameters.Add("@CODIGO", edtCODIGO.Text);
            comando.Parameters.Add("@DESCRICAO", edtDESCRICAO.Text);
            comando.Parameters.Add("@MARCA", edtMARCA.Text);
            comando.Parameters.Add("@QTDE", edtQTDE.Text);
            comando.Parameters.Add("@VALOR", edtPRECO.Text);

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
                conexao.Close();
            }
            catch (Exception excecao)
            {
                MessageBox.Show("Uma exceção foi gerada, apresentando a seguinte mensagem:" + Environment.NewLine + excecao.Message);
            }
            finally
            {
                comando.Dispose();
                conexao.Dispose();
            }

            }

        private void btnCONSULTAR_Click(object sender, EventArgs e)
        {
            FbConnection conexao = new FbConnection(StrConn);
            FbCommand comando = new FbCommand("Select p.id_PRODUTO, p.ds_PRODUTO,p.id_MARCA, m.ds_MARCA, p.qt_ESTOQUE,p.vl_VENDAS FROM TBL_PRODUTOS p INNER JOIN TBL_MARCAS m ON m.id_MARCA = p.id_MARCA",conexao);
            FbDataAdapter adaptador = new FbDataAdapter(comando);
            DataSet ds = new DataSet();

            try
            {
                conexao.Open();
                adaptador.Fill(ds, "Produtos");
                conexao.Close();
                grdPRODUTOS.DataSource = ds;
                grdPRODUTOS.DataMember = "Produtos";

            }
            catch (Exception excecao)
            {
                MessageBox.Show(excecao.Message);

            }
            finally
            {
                comando.Dispose();
                conexao.Dispose();
            }

        }

        private void btnALTERAR_Click(object sender, EventArgs e)
        {
           
            FbConnection conexao = new FbConnection(StrConn);
            FbCommand comando = new FbCommand();
            string instrucaoSQL = "UPDATE  TBL_PRODUTOS SET DS_PRODUTO = @DESCRICAO,ID_MARCA = @MARCA,QT_ESTOQUE = @QTDE,VL_VENDAS = @VALOR WHERE ID_PRODUTO = @CODIGO";
            comando.Connection = conexao;
            comando.CommandType = CommandType.Text;
            comando.CommandText = instrucaoSQL;
            comando.Parameters.Add("@CODIGO", edtCODIGO.Text);
            comando.Parameters.Add("@DESCRICAO", edtDESCRICAO.Text);
            comando.Parameters.Add("@MARCA", edtMARCA.Text);
            comando.Parameters.Add("@QTDE", edtQTDE.Text);
            comando.Parameters.Add("@VALOR", edtPRECO.Text);

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
                conexao.Close();
            }
            catch (Exception excecao)
            {
                MessageBox.Show("Uma exceção foi gerada, apresentando a seguinte mensagem:" + Environment.NewLine + excecao.Message);
            }
            finally
            {
                comando.Dispose();
                conexao.Dispose();
            }

            }

        private void btnEXCLUIR_Click(object sender, EventArgs e)
        {
            FbConnection conexao = new FbConnection(StrConn);
            FbCommand comando = new FbCommand();
            string instrucaoSQL = "DELETE FROM  TBL_PRODUTOS WHERE ID_PRODUTO = @CODIGO";
            comando.Connection = conexao;
            comando.CommandType = CommandType.Text;
            comando.CommandText = instrucaoSQL;
            comando.Parameters.Add("@CODIGO", edtCODIGO.Text);
       

            try
            {
                conexao.Open();
                comando.ExecuteNonQuery();
                conexao.Close();
            }
            catch (Exception excecao)
            {
                MessageBox.Show("Uma exceção foi gerada, apresentando a seguinte mensagem:" + Environment.NewLine + excecao.Message);
            }
            finally
            {
                comando.Dispose();
                conexao.Dispose();
            }
        }

        private void edtCODIGO_TextChanged(object sender, EventArgs e)
        {

        }
        }

           
        }





  






.