Programação orientada a objetos - OOP - Conceitos


Imagine que você tenha que desenvolver um programa para implementar uma loja virtual na internet. Uma abordagem usando a programação orientada a objetos - OOP, nos leva a que o programa deverá conter os seguintes objetos: itens vendidos/comprados, a cesta de compra, o cupom de desconto e o caixa. Cada um destes objetos irão  interagir uns com os outros afim de fazer o programa funcionar. Ex: Quando o caixa efetua a totalização do cupom ele deverá verificar o preço de cada item vendido.

A definição de um programa em termos de objetos é uma maneira mais profunda de construir um software. Ao pensar em termos de objetos você será forçado a ver tudo a um nível conceitual do que um objeto pode fazer e qual o comportamento dos objetos. Esta visão a nível  conceitual dos objetos é uma ruptura na antiga forma de ver como a coisa é feita ou seja uma visão de comportamento e não de implementação. Ao invés de modelar o seu programa como um conjunto separado de rotinas e dados você irá modelar o seu programa em termos de objetos.

A esta altura podemos definir um objeto como um construção de software que encapsula estado e comportamento. De uma forma mais explicita podemos também dizer que um objeto é uma instância de uma classe.  Para uma linguagem de programação orientada a objetos tudo são objetos; do tipo mais básico até a instância de uma classe complexa.

Como os objetos do mundo real, os conceitos da OOP agrupam objetos pelos seus comportamentos e atributos comuns, assim, uma classe define todas as características comuns para um tipo de objeto, ou seja, uma classe define todos os atributos e comportamentos expostos pelo objeto e define também a quais mensagens o objeto vai responder/receber.

Pensando nisto podemos dizer que uma classe define os atributos e comportamentos comuns compartilhados por um tipo de objeto. Objetos de um certo tipo ou classificação compartilham os mesmos comportamentos e atributos. Uma classe atua como um modelo sendo que a partir dela você cria uma instância de um objeto. Os atributos são a característica visível da classe. Um objeto pode expor um atributo através de uma ligação direta para alguma variável  ou pelo retorno de um valor através de um método.

O comportamento é uma ação realizada por um objeto quando envia uma mensagem ou responde a uma mudança de estado. É algo que o objeto faz,e você pode entender isto em temos de chamada de métodos e funções.

Vejamos como exemplo o objeto item de venda que representa um produto:

Um item de venda possui os seguintes atributos: descrição, código , preço, quantidade e desconto. Além disto um item tem que saber como calcular o seu desconto.

Usando os conceitos da OOP você poderia dizer que todos os objetos item são instâncias da classe item.

Uma classe item poder ter a seguinte implementação:

Public Class Item

Private preco As Double
Private desconto As Double
Private quantcodigoade As Integer
Private descricao As String
Private codigo As String

Public Sub New(ByVal codigo As String, ByVal descricao As String, ByVal quantidade As Integer, ByVal preco As Double)

Me.codigo = codigo
Me.descricao = descricao
If quantidade >= 0 Then
    Me.quantidade = quantidade
Else
    Me.quantidade = 0
End If
Me.preco = preco
End Sub

Public Function getTotalAjustado() As Double

Dim total As Double = preco * quantidade
Dim total_desconto As Double = total * desconto
Dim total_ajustado As Double = total - total_desconto

Return total_ajustado

End Function

Public Sub setDesconto(ByVal desconto As Double)
If desconto <= 1 Then
   Me.desconto = desconto
Else
   Me.desconto = 0
End If
End Sub

Public Function getDesconto() As Double
    Return desconto
End Function

Public Function getQuantidade() As Integer
   Return quantidade
End Function

Public Sub setQuantidade(ByVal quantidade As Integer)
If quantidade >= 0 Then
    Me.quantidade = quantidade
End If
End Sub

Public Function getCodigo() As String
   Return codigo
End Function

Public Function getDescricao() As String
   Return descricao
End Function
End Class

Para implementar esta classe crie um novo projeto do tipo console e no menu Project selecione a opção Add Class informando o nome item.vb ao arquivo de classe.

Vamos dar uma espiada nos elementos usados nesta implementação:

1-) O método definido com a assinatura.(Uma assinatura pode ser vista como os parâmetros de entrada que o método utiliza)

Public Sub New(ByVal codigo As String, ByVal descricao As String, ByVal quantidade As Integer, ByVal preco As Double)

possui um nome especial chamado construtor. Um construtor é usado para inicializar um objeto durante a sua criação.

2-) Os métodos setDesconto(), getDescricao() e getTotalAJustado() são comportamento da classe item que retornam ou definem atributos. Quando um caixa quer totalizar o carrinho de compras ele simplesmente toma cada item e envia ao objeto a mensagem getTotalAjustado().

3-) Preco, desconto, quantidade, descricao e codigo são todas variáveis internas da classe item estes valores representam o estado do objeto. O estado de um objeto pode variar durante o tempo. São conhecidos também como atributos da classe item.

4-) getTotalAjustado() e getDesconto() representam comportamentos e são chamados acessores desde que eles permitem que você acesse os dados internos de um objeto. O acesso pode ser feito de forma direta como em getDesconto ou o objeto pode realizar um processamento antes de retornar o valor como em getTotalAjustado()

Ao executar o programa ele irá usar a classe item para criar , ou instanciar, os objetos que constituem a aplicação. Cada nova instância é uma cópia da última, porém uma vez criada, a instancia contém o seu próprio comportamento e estado. Desta forma se criarmos dois objetos item a partir da mesma classe item um objeto pode ter um desconto de 10% enquanto outro poderá não ter desconto algum ou alguns item podem ter um preço menor e assim por diante.

A seguir temos um exemplo de como usar a classe implementada , criar objetos e usar os métodos da classe item:

Module Module1
Sub main()

' Criando novos itens através de instanciação de objetos da classe item
Dim leite As Item = New Item(“padaria-011”,“1 litro de Leite”,2,2.50)
Dim manteiga As Item = New Item(“padaria-032”,“ Manteiga”,4,0.68)
Dim pao As Item = New Item(“padaria-023”,“Pao”,1,2.55)
Dim cafe As Item = New Item(“padaria-21”,“Pacote Cafe”,1,4.51)

' aplicando desconto ao objeto leite criado
leite.setDesconto(0.15)

'obtendo preços ajustados para cada objeto
Dim leite_preco As Double = leite.getTotalAjustado()
Dim manteiga_preco As Double = manteiga.getTotalAjustado()
Dim pao_preco As Double = pao.getTotalAjustado()
Dim cafe_preco As Double = cafe.getTotalAjustado()

' imprimindo a descrição e o preço
Console.Writeline(“Obrigado e Volte Sempre”)
Console.Writeline("-----------------------------------------")
Console.Writeline(leite.getDescricao() + “ R$” + leite_preco.ToString)
Console.Writeline(manteiga.getDescricao() + “ R$” + manteiga_preco.ToString)
Console.Writeline(pao.getDescricao() + “ R$” + pao_preco.ToString)
Console.Writeline(cafe.getDescricao() + “ R$” + cafe_preco.ToString)

' calcula e imprime o total
Dim total As Double = leite_preco+ manteiga_preco+ pao_preco+ cafe_preco
Console.Writeline("-----------------------------------------")
Console.Writeline(“Preco Total\t R$” + total.ToString)
Console.Readline()

End Sub

End Module

No código acima primeiro o programa cria quatro instâncias de objetos item : leite, manteiga, pao e cafe; cada um com atributos e comportamento distintos. (Em um programa real estes itens seriam criados pela seleção do usuário).  A seguir o programa aplica o desconto ao objeto leite e então imprime o resultado após efetuar a chamada ao totalAJustado().

A OOP não é a panacéia universal, é apenas uma evolução na arte de desenvolvimento de software, por isto, se você estiver usando os conceitos da OOP pela primeira vez deve tomar os seguintes cuidados:

1-) Não é por que você esta usando uma linguagem orientada a objetos que o seu código vai estar orientado a objetos. Os conceitos da OOP estão além da ferramenta usada , e você pode escrever um código não orientado a objetos usando uma linguagem orientada a objetos como o VB.NET , C# ou Java. A verdadeira programação orientada a objetos o desafia a ver seus problemas, na área de desenvolvimento de software, como um grupo de objetos e a usar os conceitos de herança, encapsulamento e polimorfismo corretamente aplicados à solução do seu problema.

2-) Você precisa aprender a reusar código sem culpa. Dois problemas principais se apresentam como dificuldades a serem superadas para atingir este objetivo:

  1. Programadores gostam de criar código novo(isso os excita, pois da a sensação de que eles têm o poder...);
  2. Existe um sentimento de que ao usar um código pronto o programador não estaria confiando no seu próprio código (o meu é sempre o melhor...);

Se você pensar no tempo que estará economizando ao usar um código que já esta funcionando bem e foi testado , chegará a conclusão que você pode usar este tempo que irá sobrar para otimizar o código já existente ao invés de tentar reinventar a roda...

3-) A OOP não é a cura para todos os males na área de desenvolvimento de software. Embora ela ofereça muitos benefícios, haverá momentos nos quais você não poderá usar OOP. Usar OOP não garante o sucesso do seu projeto. O sucesso vem com planejamento cuidadoso, análise bem feita e codificação robusta.

4-) Aprenda a documentar o seu código/projeto de forma que qualquer desenvolvedor possa compreender. O que não pode ser compreendido não poderá ser reutilizado.

Pegue o código do exemplo usado no artigo aqui : appVenda.zip

Até o próximo artigo .NET...


José Carlos Macoratti