Arquivo da categoria ‘Java’

Trabalhe como um desenvolvedor

Publicado: 23 de fevereiro de 2014 em Abap, C#, C/C++, Java, Python

can-stock-photo_csp11667034Em computação, um programador, desenvolvedor, coder ou engenheiro de software refere-se a alguém que faz programação de computadores e escreve software.

Um programador pode ser alguém que desenvolve ou faz manutenção de softwares em um grande sistema ou alguém que desenvolve software para uso em computadores pessoais.

Os desenvolvedores profissionais gastam menos de 10 por cento do seu tempo de trabalho escrevendo código, consomem cerca de 60 por cento do tempo de trabalho em um projeto,  na análise de problemas, concebendo soluções, documentando as decisões, depurando, mantendo ou melhorando o  código fonte.

Os 30 por cento restantes do tempo de um desenvolvedor é tomado por reuniões ou simplesmente desperdiçado (Às vezes, não há nenhuma diferença entre reuniões e tempo perdido.)

Se você estiver escrevendo um programa que é maior do que algumas linhas, então não é o bastante apenas sentar e começar a codificação. Você precisa dar três passos para tornar o seu programa o melhor possível.

Os 3 Ds –  Documentação, Design e Depuração

  1. Documentação: Certificar-se de que outras pessoas podem ler o seu programa.
  2. Design: Ter certeza que seu programa resolve o problema certo e está organizado para que seja eficiente e potencialmente reutilizável.
  3. Depuração: Certificar-se de que seu programa não tenha nenhum erro e que ele responda adequadamente quanto a entrada de dados errados.

Documentação

Documentação torna possível ler, usar e manter um programa:

  • Na programação, a documentação é toda a escrita associada ao seu programa que não seja um código.
  • Em uma linguagem de programação, legibilidade é uma virtude nobre.
  • Isso significa que seu código é parte da documentação também.
  • Escolher bons nomes faz parte da documentação!
  • LEMBRE-SE, programação, começa e termina com a documentação.
  • Comece por escrever o problema que o seu programa se destina a resolver.
  • Antes mesmo de começar a escrever o seu programa, é uma boa ideia escrever notas sobre o objetivo do programa.
  • Finja que você precisa explicá-lo para outra pessoa, e se você tem alguém para ler a notas, melhor.
  • Termine, certificando-se de que a documentação ainda corresponde ao programa.

Se você não escrever a documentação, você vai achar que é difícil usar ou manter o seu programa depois de passado seis meses (mesmo se você é a única pessoa que usa o programa).

Design

Projetar é realmente um atalho para duas partes interligadas de programação: análise e design.

O que você realmente quer?

Análise é o processo de determinar o problema que você está tentando resolver. É semelhante ao processo que um arquiteto faz você passar para remodelar a sua cozinha: “O que você realmente quer?”. Por exemplo, você pode querer escrever um programa para automatizar seus dados de backup. Essa é uma descrição geral, mas você precisa de uma lista mais específica das tarefas que você deseja que o programa realize, como:

  • Quantas vezes você quer fazer os backups?
  • Você quer fazer backup de todos os dados ou apenas dados alterados desde o último backup?
  • Quanto tempo você quer manter os backups?

Se você está remodelando sua cozinha, então este é o ponto onde o arquiteto elabora um projeto. O projeto não é a própria cozinha; é o plano que deve ser seguido para a construção da nova cozinha. se você está escrevendo um programa, você começa a construir o contorno do programa, que é semelhante a uma planta. Na verdade, as pessoas que se concentram na análise e concepção de programas são frequentemente chamados de arquitetos de software.

A Pseudo codificação de seus pensamentos

Uma maneira de projetar seu programa é criando um esboço do tipo, usando o que é chamado de pseudo-código. Você escreve um esboço do que o seu programa vai fazer, utilizando as estruturas que você vai precisar usar quando você escrever o programa (como definições de classe e função, as declarações), mas você não deve se preocupar com os detalhes de sintaxe necessárias para escrever código de trabalho.

Pseudo-código tende a assemelhar-se a programas reais, por isso leva menos esforço para converter pseudo-código em código funcionando. quando o processo de pseudo-codificação é concluída, os detalhes são fáceis de escrever.

Depuração

Um bug é um erro em um pedaço do software que faz com que ele funcione de forma inadequada ou retorne resultados incorretos.

Ensine a Velhos Bugs  Novos Truques:

O uso da palavra bug (pau em português) já era comum antes do software ser inventado, por exemplo, Thomas Edison usou em 1878 para descrever problemas com suas invenções. Algumas pessoas vão dizer-lhe, porém, que o termo deriva de um incidente no qual foi encontrado um inseto real que estava causando falhas dentro de um computador no início de 1947.

Embora um bug seja mais velho do que escrever programas, depuração tem sido uma parte inerente da escrita de programas desde que as pessoas começaram a escrever softwares. Um dos primeiros cientistas da computação, Maurice Wilkes, é conhecido por ter dito: “Eu me lembro do momento exato em que eu percebi que uma grande parte da minha vida a partir de então ia ser passar a encontrar erros em meus próprios programas.”.

Escrever um programa complexo é algo como a concepção de um edifício. O arquiteto restringe inclusão do tempo, dinheiro, bom gosto, e os limites estruturais dos materiais. Programação também requer um equilíbrio entre necessidades múltiplas, muitas vezes incluindo o tempo, o dinheiro, a solicitações de recursos de vários grupos de pessoas, e da disponibilidade de quantidades suficientes de cafeína.

Um exemplo de um bom trabalho é com bom humor, o pythonista Tim Peters contribuiu com  19 diretrizes para um bom código Python. Considerado a melhor destilação da filosofia da programação Python:

Bonito é melhor que feio.
Explícito é melhor que implícito.
Simples é melhor que complexo.
Complexo é melhor que complicado.
Plano é melhor que aninhado.
Esparso é melhor que denso.
Legibilidade conta.
Casos especiais não são especiais o suficiente para quebrar as regras.
Embora praticidade vença a pureza.
Erros nunca devem passar em silêncio.
A menos que explicitamente silenciados.
Diante da ambiguidade, recuse a tentação de adivinhar.
Deve haver um – e preferencialmente só um – modo óbvio para fazer isso.
Apesar de que o caminho pode não ser óbvio à primeira vista, a menos que você seja holandês.
Agora é melhor do que nunca.
Embora nunca é muitas vezes melhor do que agora.
Se a implementação é difícil de explicar, é uma má ideia.
Se a implementação é fácil de explicar, pode ser uma boa ideia.
Namespaces são uma grande ideia – vamos fazer mais desses!

-Tim Peters

Versão original: http://www.python.org/doc/humor/#zen

Interfaces – Java, C++ e C#

Publicado: 18 de fevereiro de 2014 em C#, C/C++, Java

Os objetos definem sua interação com o mundo exterior através dos métodos que eles expõem. Métodos formam a interface do objeto com o mundo exterior; os botões na parte frontal do seu aparelho de televisão, por exemplo, são a interface entre você e a fiação elétrica do outro lado do seu invólucro de plástico. Você aperta o botão “Power” para ligar e desligar a televisão.

Na sua forma mais comum, uma interface é um conjunto de métodos relacionados com corpos vazios

A implementação de uma interface permite que uma classe se torne mais formal sobre o comportamento que promete proporcionar. Interfaces formam um contrato entre a classe e o mundo exterior, e este contrato é imposto em tempo de compilação.

Se sua classe reivindica implementar uma interface, todos os métodos definidos por essa interface deve aparecer em seu código-fonte antes da classe ser compilada com sucesso.

Uma Interface obriga a classe na qual foi implementada a cumprir o que nela foi declarado. Caso não cumpra o determinado pela interface obterá o seguinte erro de compilação:

Java: The type [Classe] must implement the inherited abstract method [Metodo da interface] [Classe.java]

C++: Error 1 error C2259: ‘Classe’ : cannot instantiate abstract class.

C#: Error 1 ‘namespace.classe’ does not implement interface member ‘namespace.classe.metodo(tipo).

Conceito de interfaces

  • Não pode ser instanciada (não podemos criar objetos com new).
  • Só pode possuir assinaturas de métodos de instância, públicos e abstratos (sem corpo).
  • Não pode possuir métodos concretos (com corpo), nem métodos estáticos.
  • Não pode conter variáveis de instância ou de classe (Static);
  • Pode conter declarações de constantes.
  • Pode ser criada como sub interface de outra interface já existente.

Uso Comum de Interface

Na linguagem de programação C++ pode se utilizar uma interface abstrata como o exemplo abaixo, mas este uso não é muito comum, pois a convenção de classes C++ já contempla que a interface seja separada da implementação na criação da própria classe, utilizando arquivos diferentes (.h e .cpp). Além da linguagem C++ permitir múltiplas heranças tornando raro a necessidade do uso de interfaces abstratas.

Java e C# utilizam a interface pois não permitem múltiplas heranças, então a interface se torna necessária para criar um efeito deste tipo, por exemplo, imagine que temos a classe Casa e queremos que esta classe herde as classes Portas e Janelas, isto não será possível em Java e C#, mas é possível em C++.

Para garantir que teremos os métodos paras portas e janelas na classe Casa, precisamos utilizar a interface Portas e a Interface Janelas, ainda não garantindo como em C++ os tipos de portas e janelas já que as interfaces são abstratas e não métodos concretos, Mas este recurso permite que a classe Casa tenha obrigatoriamente, portas e janelas de qualquer tipo.

Este também é o motivo de uso de uma interface abstrata em C++, quando precisar utilizar métodos abstratos para uma classe dizendo que você permite portas e janelas de qualquer tipo. Nota-se assim que C++ é uma linguagem mais flexível em termos de recursos na criação de objetos.

Exemplos:

Neste exemplo uma pequena empresa fictícia de desenvolvimento de jogos esta escrevendo um novo jogo, um desenvolvedor defini a logica do jogo e cria as interfaces para as classes primitivas. Cria uma interface chamada: Ação, que defini todas as ações do personagem. Enquanto ele desenvolve outras interfaces do jogo, outros desenvolvedores escrevem as classes para os personagem, implementando a interface na classe primitiva do personagem. O programador que criou a interface garante que as classes terão todas as ações definidas por ele obrigatoriamente na classe: Personagem Primitivo, do qual será herdado outros personagens.

Java

Arquivo #1 – Principal

package org.desenvolvimentoaberto;

public class Principal  {

  public static void main(String[] args)
  {
     PersonagemPrimitivo Cidadao = new PersonagemPrimitivo();
     Cidadao.nome = "Jim James";
     Cidadao.classe = "Trabalhador";
     Cidadao.andar (false);
     Cidadao.correr(true);
     Cidadao.largar(false);
     Cidadao.pegar (true);
     Cidadao.atacar(true);

     System.out.println("Status ------>>>> ");
     System.out.println("O personagem:" + Cidadao.nome);
     System.out.println("Classe: " + Cidadao.classe);
   
    Cidadao.mostraPersonagem();

 }
}

Arquivo #2 – Interface

package org.desenvolvimentoaberto;

public interface Acao
 {

    void pegar(boolean pega);
    void largar (boolean larga);
    void andar (boolean anda);
    void correr (boolean corre);
    void atacar (boolean ataca);
 }

Arquvio #3 – Classe Personagem Primitivo

package org.desenvolvimentoaberto;

public class PersonagemPrimitivo implements Acao
 {
    private boolean pega  = false;
    private boolean larga = false;
    private boolean anda  = false;
    private boolean corre = false;
    private boolean ataca = false;
    public String nome;
    public String classe;

    public void pegar (boolean pega)
    {
      this.pega = pega;
    }

    public void largar (boolean larga)
    {
      this.larga = larga;
    }

    public void andar (boolean anda)
    {
      this.anda = anda;
    }

    public void correr (boolean corre)
    {
      this.corre = corre;
    }

    public void atacar (boolean ataca)
    {
      this.ataca = ataca;
    }

    public void mostraPersonagem()
    {
       System.out.println("Esta andando:  " + anda);
       System.out.println("Esta correndo: " + corre);
       System.out.println("Esta pegando:  " + pega);
       System.out.println("Esta largando: " + larga);
       System.out.println("Esta atacando: " + ataca);
    }
 }

C++

Arquivo #1 – Principal

#include "stdafx.h"
#include <iostream>
#include <string>
#include "personagemprimitivo.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
 {
    PersonagemPrimitivo Cidadao;

    Cidadao.nome = "Jim James";
    Cidadao.classe = "Trabalhador";
    Cidadao.andar(false);
    Cidadao.correr(true);
    Cidadao.largar(false);

    Cidadao.pegar(true);
    Cidadao.atacar(true);

    cout << "Status ------>>>> " << endl;
    cout << "O personagem:" + Cidadao.nome << endl;
    cout << "Classe: " + Cidadao.classe << endl;
  
    Cidadao.mostraPersonagem();
  
    system("pause");
    return 0;
 }

Arquivo #2 – Interface

#include "stdafx.h"

__interface  Acao
{
 public:

   virtual void pegar(bool pega);

   virtual void largar(bool larga);

   virtual void andar(bool anda);
 
   virtual void correr(bool corre);

   virtual void atacar(bool ataca);

 };

Arquvio #3 – Classe Personagem Primitivo

#include "stdafx.h"
#include <iostream>
#include "acao.h"

using namespace std;

class PersonagemPrimitivo : public Acao {

private:

   bool pega = false;
   bool larga = false;
   bool anda = false;
   bool corre = false;
   bool ataca = false;

public:  string nome;  string classe;

  void pegar(bool pega)
  {
     this->pega = pega;
  }

  void largar(bool larga)
  {
     this->larga = larga;
  }

  void andar(bool anda)
  {
     this->anda = anda;
  }

  void correr(bool corre)
  {
     this->corre = corre;
  }

  void atacar(bool ataca)
  {
     this->ataca = ataca;
  }

void mostraPersonagem()  {

      cout << "Esta andando:  " << anda  << endl;
      cout << "Esta correndo: " << corre << endl;
      cout << "Esta pegando:  " << pega  << endl;
      cout << "Esta largando: " << larga << endl;
      cout << "Esta atacando: " << ataca << endl;
  }
 };

C#

Arquivo #1 – Principal

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto {

 class Program   {

   static void Main(string[] args)     {
   
      PersonagemPrimitivo Cidadao = new PersonagemPrimitivo();

      Cidadao.nome = "Jim James";
      Cidadao.classe = "Trabalhador";
      Cidadao.andar (false);
      Cidadao.correr(true);
      Cidadao.largar(false);
      Cidadao.pegar (true);
      Cidadao.atacar(true);

      Console.WriteLine("Status ------>>>> ");
      Console.WriteLine("O personagem:" + Cidadao.nome);
      Console.WriteLine("Classe: " + Cidadao.classe);
      Cidadao.mostraPersonagem();
      Console.ReadKey();

     }
  }
}

Arquivo #2 – Interface

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto
 {

   interface Acao   {

      void pegar(Boolean pega);

      void largar(Boolean larga);

      void andar(Boolean anda);

      void correr(Boolean corre);

      void atacar(Boolean ataca);
    }
 }

Arquvio #3 – Classe Personagem Primitivo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto
 {
     class PersonagemPrimitivo : Acao
     {
         private Boolean pega = false;
         private Boolean larga = false;
         private Boolean anda = false;
         private Boolean corre = false;
         private Boolean ataca = false;

         public String nome;
         public String classe;

         public void pegar(Boolean pega)
         {
             this.pega = pega;
         }

         public void largar(Boolean larga)
         {
             this.larga = larga;
         }

         public void andar(Boolean anda)
         {
             this.anda = anda;
         }

         public void correr(Boolean corre)
         {
             this.corre = corre;
         }

         public void atacar(Boolean ataca)
         {
             this.ataca = ataca;
         }

         public void mostraPersonagem()
        {
            Console.WriteLine("Esta andando:  " + anda);
            Console.WriteLine("Esta correndo: " + corre);
            Console.WriteLine("Esta pegando:  " + pega);
            Console.WriteLine("Esta largando: " + larga);
            Console.WriteLine("Esta atacando: " + ataca);
        }
    }
}

O que é um BOM programa?

Publicado: 18 de fevereiro de 2014 em Abap, C#, C/C++, Java, Python

Utilize Melhores praticas

Melhores práticas é uma expressão derivada do inglês best practices que denomina as técnicas identificadas como as melhores em termos de eficácia, eficiência e reconhecimento de valor para os envolvidos e afetados direta e ou indiretamente na realização de determinadas tarefas, atividades, procedimentos, ou até mesmo, na realização de um conjunto de tarefas, atividades, procedimentos devidamente agrupados ou integrados por um objetivo comum.

Best Pratices:

Sap: https://help.sap.com/bestpractices

Oracle: http://www.oracle.com/us/support/best-practices/overview/index.html?ssSourceSiteId=otnru

Microsoft: http://msdn.microsoft.com/en-us/library/ms184412(v=vs.110).aspx

Python: http://www.python.org/dev/peps/pep-0008/

Leia os White Papers de suas Ferramentas

Um White Paper ou, em português, “Livro branco” ou “Relatório Branco”, é um documento oficial publicado por um governo ou uma organização internacional, a fim de servir de informe ou guia sobre algum problema e como enfrentá-lo. Os “White Paper” são utilizados para educar os leitores e ajudar as pessoas a tomar decisões. São usados na política e nos negócios. Também podem ser um informe governamental que descreve uma política, geralmente, a longo prazo.

White Papers:

Sap: http://scn.sap.com/docs/DOC-17149

Java: http://www.oracle.com/technetwork/java/javase/documentation/whitepapers-jsp-139357.html

Microsoft: http://technet.microsoft.com/en-us/library/cc736902(v=ws.10).aspx

Python: http://www.deitel.com/Default.aspx?tabid=768

Design Pattern

Em engenharia de software, design pattern é uma solução reutilizável geral para um problema que comumente ocorre dentro de um determinado contexto em design de software. Um design pattern não é um projeto acabado que pode ser transformado diretamente em fonte ou código de máquina. É uma descrição ou modelo de como resolver um problema que pode ser utilizado em diversas situações diferentes. Os padrões são formalizadas as melhores práticas que o programador deve implementar na aplicação.

Design Pattern:

Sap: http://wiki.scn.sap.com/wiki/display/ABAP/ABAP+Objects+Design+Patterns+-+Singleton

Oracle: http://www.oracle.com/webfolder/ux/applications/DPG/OBIEE/patterns/index.html

Microsoft: http://msdn.microsoft.com/library/cc467894.aspx

Python: http://www.python.org/workshops/1997-10/proceedings/savikko.html

Um bom programa

Correto / sem erros.

Fácil de entender.

Fácil de modificar / ampliar.

Bom desempenho (velocidade).

Consistência

Escrever código de forma consistente torna mais fácil escrever e entender.

Guia de “estilo” Programação :

  • Definir regras sobre como fazer as coisas .
  • Diretrizes de estilo “padrão” tem sido amplamente aceita.

Variáveis​​:

substantivos (Primeira letra minúscula, palavras subsequentes maiúscula).

ex: x, forma, altaPontuação, arquivoNome.

Métodos:

verbos (Primeira letra minúsculas palavras subsequentes maiúsculas).

ex: getSize (), desenhe (), desenheComCor ()

Classes:

substantivos (Primeira letra maiúscula )

ex: Forma, PaginaDaWeb, EnderecoEmail.

Melhor Design de Classe

  • Uma boa classe  é fácil de entender e usar.
  • Escreva campos e métodos privados por padrão.
  • Só escreva métodos público, se você precisar.
  • Se você precisar de acesso a um campo, escreva um Metodo:   public int GetBar () {return bar;}

Depuração (Debugging)

O processo de encontrar e corrigir um erro em um programa

Uma habilidade fundamental na programação

Bom Desenvolvimento em 6 Passos

Passo 1: Não cometer erros

  • Não introduzir erros em primeiro lugar.
  • Reutilização: encontrar o código existente que faz o que você quer.
  • Projeto: pense antes de escrever um código.
  • Melhores Práticas: procedimentos recomendados / técnicas para evitar problemas comuns.

Desing Pseudocódigo

Um alto nível, descrição compreensível do que o programa supostamente faz.

Não se preocupe com os detalhes, se preocupe com a estrutura.

Desing

  • Design visual de objetos, ou como o programa funciona.
  • Não se preocupe com notação específica, basta fazer algo que faça sentido para você.
  • Racunhar em um pedaço de papel é útil.

desenho

Passo 2: Encontre erros no início

Mais fácil corrigir os erros quanto mais cedo você encontrá-los.

  • Teste o seu projeto.
  • Use ferramentas para detectar possíveis erros.
  • Teste a sua implementação.
  • Confira seu trabalho.

Teste: Entradas importantes

Confira todos os “caminhos” através do programa.

Pense em um exemplo para cada um “caminho”.

Warnings (Compilador)

Ferramentas: Avisos (Advertências).

  • Advertências: pode não ser um erro, mas trate como se fosse.
  • Sugestão: sempre corrigir todos os avisos.
  • Verificações extras: encontrar bugs e ferramentas relacionadas.
  • O teste de unidade: Ferramentas facilitam o teste de unidade.

Passo 3: reproduzir o erro

  • Descobrir como reproduzir o erro.
  • Criar um caso de teste mínimo.
  • Volte para a versão de trabalho, e introduza mudanças uma de cada vez até que o erro desapareça.
  • Elimine o material extra que não é usado.

Passo 4: Gerar Hipótese

  • O que está acontecendo de errado?
  • O que pode estar causando o erro?
  • Questionar suas premissas: “possivelmente não pode ser  X”.
  • E se é, devido a alguma outra coisa?

Passo 5: coletar informações

  • Se x é o problema, como você pode verificar?
  • Precisa de informações sobre o que está acontecendo dentro do programa.

Passo 6: Examinar dados

  • Examine seus dados A sua hipótese está correta?
  • Corrigir o erro, ou gerar uma nova hipótese.

API – TreeSet, Set, SortedList – Java +, C++, C#

Publicado: 17 de fevereiro de 2014 em C#, C/C++, Java

O que é API?

Application Programming Interface (ou Interface de Programação de Aplicativos) é um conjunto de rotinas e padrões estabelecidos por um software para a utilização das suas funcionalidades por aplicativos que não pretendem envolver-se em detalhes da implementação do software, mas apenas usar seus serviços.

De modo geral, a API é composta por uma série de funções acessíveis somente por programação, e que permitem utilizar características do software menos evidentes ao utilizador tradicional.

Por exemplo, programas de desenho geométrico possuem uma API específica para criar automaticamente gráficos geométricos de acordo com padrões definidos pelo utilizador.

Introdução a API

Uma linguagem de programação é um método padronizado para comunicar instruções para um determinado hardware. As grandes empresas de tecnologia desenvolvem hardware e também desenvolvem linguagens de programação para que seu hardware possa ser controlado de um modo mais fácil e amigável do que linguagem de maquina.

Como a evolução do hardware as linguagens de programação também foram evoluindo, empresas começaram a disputar tecnologia de desenvolvimento de novos hardwares e esta historia é recheada de brigas por suas respectivas patentes, um exemplo de grandes disputas judiciais entre empresas que escrevem linguagens de programação foi a Oracle x Google, a  Oracle detentora das patentes do Java  e a Google criadora do sistema operacional Android, que usa Java (API) como parte do seu sistema operacional e base para a programação de softwares da plataforma Android.

  • A maioria os softwares voltados para desenvolvedores possuem sua própria API.
  • As APIs são usualmente específicas para uma determinada tecnologia.
  •  Um framework pode ser baseado em várias bibliotecas de aplicação e  várias APIs.
  • Uma API também pode ser uma implementação de um protocolo.
  • Uma API pode ser desenvolvida para um grupo restrito de utilizadores, ou ela pode ser liberada para o público.
  •  A prática de publicação de APIs permitiu comunidades na web criar uma arquitetura aberta para a partilha de conteúdos e dados entre as comunidades e aplicações.
  • A Microsoft tem mostrado um forte compromisso com uma API compatível com versões anteriores, especialmente dentro de sua biblioteca API do Windows (Win32).
  • A Microsoft tornou as APIs Microsoft Windows publicas.
  • A Apple lança suas APIs Carbon e Cocoa, para que softwares possam ser escrito para suas plataformas.
  • A Sony faz de suas API oficiais para PlayStation disponível apenas para desenvolvedores PlayStation licenciados.

Tipos de APIs – Coleções

Existem vários tipos de APIs, neste post especificamente vamos utilizar APIs chamadas de Containers ou Collections, estas APIs fornecem varias funções para se criar uma coleção de objetos e manipula-los de forma enumerada. A Coleção mais famosa no mundo da orientação a objeto é pertencente a biblioteca para C++ chamada STANDARD TEMPLATE LIBRARY, as coleção pertencentes ao JCF (Java Collection Framework) ou Generic Collections (.NET Framework) foram baseadas na STL para C++.

Diferenças entre APIs

Aqui vamos programar com uma API Java que possui sua equivalência na linguagem C++, mas não possui equivalência na linguagem .NET C#, para usar esta API em desenvolvimento Windows é necessário usar a própria API Java(Oracle), usando a linguagem J#, que permite usar Java na plataforma .NET. Para C# usaremos uma API compatível.

.NET J#: http://msdn.microsoft.com/en-us/library/aa986696(v=vs.80).aspx

Utilizando API

TreeSet  – Java

Uma classe que representa um conjunto classificado de elementos. Os elementos são classificados usando o comparador fornecido através de construtor ou usando os métodos de interface comparáveis ​​implementadas pelos elementos.

Pacote: java.util

set  – C++

O conjunto de classe container STL é usado para o armazenamento e recuperação de dados de uma coleção em que os valores dos elementos contidos são únicos e servem como os valores de chave de acordo com a qual os dados são automaticamente ordenados. O valor de um elemento em um conjunto não pode ser alterado diretamente. Em vez disso, você deve excluir valores antigos e inserir elementos com novos valores.

Include: <set>

SortedList – C#

Representa uma coleção de pares de chave / valor que são classificados por chaves e são acessíveis por chave e por índice.

Namespace: System.Collections

Exemplo:

Neste exemplo utilizaremos três APIs diferentes em linguagens diferentes para criar o mesmo programa, uma lista ordenada de bandas de rock dos anos 60, fica como nota, que a linguagem C# não possui uma API equivalente então vamos utilizar uma outra API compatível,  Para usar a API equivalente em .NET é necessário utilizar a linguagem J# que utiliza as patentes da Oracle.

Java

package org.desenvolvimentoaberto;

import java.util.TreeSet;

  public class Arvore {

  public static void main(String[] args) {

  TreeSet<String> paradas = new TreeSet<>();

  paradas.add("Beatles");
  paradas.add("Rolling Stones");
  paradas.add("The Doors");
  paradas.add("Jefferson Airplane");
  paradas.add("The Who");

  System.out.println("TOP " +  paradas.size() + " Anos 60");
  System.out.println();

  System.out.println("Primeiro Lugar: " + paradas.first());

  System.out.println("Ultimo Lugar: " + paradas.last());
  System.out.println();

  System.out.println("Cai uma posição: " + paradas.last());

  paradas.remove(paradas.last());  paradas.add("Beach Boys");

  System.out.println("Sobe " + paradas.size() + " posições: " + paradas.first());
  System.out.println();

  System.out.println("Paradas Anos 60:");

  for (String s : paradas)
  {
     System.out.println(s);
  }
 }
}

C++

#include "stdafx.h"
#include <iostream>
#include <string>
#include <set>

using namespace std;

int _tmain(int argc, _TCHAR* argv[]) {

  set <string> paradas;
  set <string>::iterator primeiroI;
  set <string>::iterator ultimoI;
  set <int>::size_type quantidadeI;

  paradas.insert("Beatles");
  paradas.insert("Rolling Stones");
  paradas.insert("The Doors");
  paradas.insert("Jefferson Airplane");
  paradas.insert("The Who");

  primeiroI = paradas.begin();
  ultimoI = paradas.end();
  ultimoI--;
  quantidadeI = paradas.size();

  cout << "TOP " << quantidadeI << " Anos 60" << endl;  cout << endl;
  cout << "Primeiro Lugar: " << *primeiroI << endl;
  cout << "Ultimo Lugar: " <<  *ultimoI << endl;

  cout << endl;

  ultimoI = paradas.end();
  ultimoI--;

  cout << "Cai uma posicao: " << *ultimoI << endl;

  paradas.erase(*ultimoI);
  paradas.insert("Beach Boys");

  primeiroI = paradas.begin();
  quantidadeI = paradas.size();

  cout << "Sobe " << quantidadeI << " posicoes: " << *primeiroI << endl;
  cout << endl;

  cout << "Paradas Anos 60:" << endl;

  for (auto i : paradas)
  {
   cout << i << endl;
  }

  system("pause");
  return 0;
 }

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;

namespace DesenvolvimentoAberto {

class Program
{
  static void Main(string[] args)
  {
    SortedList paradas = new SortedList();

    paradas.Add("Beatles","");
    paradas.Add("Rolling Stones","");
    paradas.Add("The Doors","");
    paradas.Add("Jefferson Airplane","");
    paradas.Add("The Who","");

    Console.WriteLine("TOP " +  paradas.Count + " Anos 60");
    Console.WriteLine();

    Console.WriteLine("Primeiro Lugar: " + paradas.GetKey(0));
    Console.WriteLine("Ultimo Lugar: " + paradas.GetKey(paradas.Count -1));
    Console.WriteLine();

    Console.WriteLine("Cai uma posição: " + paradas.GetKey(paradas.Count - 1));

    paradas.Remove(paradas.GetKey(paradas.Count - 1));

    paradas.Add("Beach Boys","");

    Console.WriteLine("Sobe " + paradas.Count + " posições: " +  paradas.GetKey(0));
    Console.WriteLine();

    Console.WriteLine("Paradas Anos 60:");

    for (int i = 0; i < paradas.Count; i++)
    {
       Console.WriteLine(paradas.GetKey(i));
    }

    Console.ReadKey();
   }
  }
}

Classes – Inheritance, Override e This – Java

Publicado: 16 de fevereiro de 2014 em Java

Inheritance (herança)

Programação orientada a objetos permite que classes possam herdar estados e comportamentos comuns usados de outras classes. Neste exemplo, bicicleta torna-se agora a superclasse de MountainBike. Na linguagem de programação Java, cada classe é permitido ter uma superclasse direta, e cada superclasse tem o potencial para um número ilimitado de subclasses.

Override

Métodos Override (substituição), em programação orientada a objeto, é um recurso de linguagem que permite que uma subclasse ou classe filha possa fornecer uma implementação específica de um método que já é fornecido por uma de suas superclasses ou classes pai.

A implementação Override das subclasses substitui a implementação na superclasse, fornecendo um método que tem o mesmo nome, mesmos parâmetros ou assinatura, e mesmo tipo de retorno como o método na classe pai.

This

É usado para fazer auto-referência ao próprio contexto em que se encontra e sempre será a própria classe ou o objeto já instanciado.

Dentro de um método de instância ou um construtor, this é uma referência para o objeto atual – o objeto cujo método ou construtor é chamado. Você pode se referir a qualquer membro do objeto atual de dentro de um método de instância ou um construtor usando this.

Exemplo:

Neste exemplo damos a classe MountainBike todos os mesmos campos e métodos da classe bicicleta, e ainda permite que seu código se concentre exclusivamente sobre as características que a tornam única. Isso faz do código de suas subclasses fáceis de ler. Usamos metodos Override neste exemplo de duas maneiras, para substituir um metodo da subclasse e adicionar mais um construtor com parametros. O comando this referencia os campos da própria classe.

No entanto, você deve tomar cuidado para documentar corretamente o estado e o comportamento que cada superclasse define, uma vez que o código não irá aparecer no arquivo de origem de cada subclasse.

Java

Classe #1 – Principal

package org.desenvolvimentoaberto;

public class Principal {

public static void main(String[] args) {
   // Metodo com Construtor Default
   Bicicleta bike1 = new Bicicleta();
   bike1.modelo = "ZR069";
   bike1.quadro = "Ferro";
   bike1.rodas  = "Ferro";
   bike1.freios = "Pastilhas";
   bike1.bicicleta();

   System.out.println();

   // Construtor Override
   Bicicleta bike2 = new Bicicleta("XA 200", "Aluminio", "Pastilhas", "Aluminio");
   bike2.bicicleta();

   System.out.println();

   // Herança - Montain Bike
   BicicletaMontanha bike3 = new BicicletaMontanha();
   bike3.modelo        = "Attack 500";
   bike3.quadro        = "Fibra de Carbono";
   bike3.rodas         = "Aluminio";
   bike3.freios        = "Disco";
   bike3.amortecedores = "R3000";
   bike3.garrafa       = "Aluminio 500ml";
   bike3.marchas       = "18 Velocidades";
   bike3.gps           = "Discovery 2.5";

   // Metodo Override
   bike3.bicicleta();
  }

}

Classe #2 – Bicicleta

package org.desenvolvimentoaberto;
public class Bicicleta {

  public String modelo;
  public String quadro;
  public String freios;
  public String rodas;

  // Construtor Default
  public Bicicleta()
  {}

  // Construtor Override
  public Bicicleta (String modelo, String quadro, String freios, String rodas)
  {
   this.modelo = modelo;
   this.quadro = quadro;
   this.rodas = rodas;
   this.freios = freios;
  }

public void bicicleta ()
  {
   System.out.println(" Bicicleta:" + modelo );
   System.out.println(" Quadro:" + quadro );
   System.out.println(" Rodas:" + rodas );
   System.out.println(" Freios:" + freios );
  }

}

Classe #3 – BicicletaMontanha (Sub Classe)

package org.desenvolvimentoaberto;
public class BicicletaMontanha extends Bicicleta {

  public String marchas;
  public String amortecedores;
  public String garrafa;
  public String gps;

  //Metodo Override
  public void bicicleta ()
  {
      System.out.println(" Bicicleta:" + modelo );
      System.out.println(" Quadro:" + quadro );
      System.out.println(" Rodas:" + rodas );
      System.out.println(" Freios:" + freios );
      System.out.println(" Marchas:" + marchas );
      System.out.println(" Amortecedores:" + freios );
      System.out.println(" Garrafa:" + garrafa );
      System.out.println(" Gps:" + gps );
    }

BicicletaMontanha()
  {
  }
}

Packages – Java

Publicado: 15 de fevereiro de 2014 em Java

Uma Package (pacote) é um agrupamento de tipos relacionados que fornecem proteção de acesso e gerenciamento de espaço de nome(namespaces). Note-se que os tipos refere-se a classes, interfaces, enumerações e tipos de anotações.

Os pacotes servem para organizar as classes semelhantes e em algum momento, todo programador precisa usar uma classe pública que está contida dentro de um pacote. Se a classe está em um pacote diferente, então o programa deve dizer ao compilador onde encontrá-lo. Há três maneiras de fazer referência a uma classe em outro pacote: use o seu nome completo, importe a classe, importe o pacote.

Melhores Praticas:

  • Cada classe pertence a um pacote.
  • Classes no mesmo pacote devem servir a um propósito semelhante.
  • Pacotes são apenas diretórios. As classes em outros pacotes precisam ser importados.

Combinar funcionalidade semelhantes:

  • org.desenvolvimentoaberto.bibliotecas.Livraria
  • org.desenvolvimentoaberto.bibliotecas.Livros

Separar nomes semelhantes:

  • shopping.Lista
  • pacotes.Lista

Pacotes Especiais:

  • Todas as classes  ” podem ver” as classes no mesmo pacote (sem importação necessário).
  • Todas as classes de “podem ver” classes em java.lang.
  • Exemplo : java.lang.String; java.lang.System

Criando uma Package:

  1. Crie um novo projeto Java chamado: DevAberto.
  2. Na janela Package Explorer, navegue até nosso projeto e expanda até encontrar a pasta scr.
  3. Clique com o botão direito e clique em nova package.
  4. Nomeie a package de org.desenvolvimentoaberto.
  5. Clique com o botão direito em nossa package e escolha nova classe.
  6. Nomeie a classe de Menssagem e copie o codigo da classe Menssagem abaixo.
  7. Em nosso projeto na pasta scr, botão direito nova classe.
  8. Na opção package na Janela da classe clique em Browse e escolha (default package).
  9. Nomeie a classe de Principal e clique no checkbox public static void main(String[] args e clique em Finish.
  10. Nossa classe Menssagem não esta visivel dentro da classe Principal.
  11. No editor antes da instrução “public class Principal”, de um enter.
  12. Escreva a seguinte instrução: import org.desenvolvimentoaberto.Menssagem;
  13. Agora a classe Menssagem esta visivel da classe Principal.
  14. Escreva o codigo da classe Principal abaixo e rode o programa.

Exemplo:

Neste exemplo vamos criar um simples pacote e usa-lo de um outro pacote, mostrando os três modos de como referenciar pacotes:

Java

Classe Principal – Pacote #1

import org.desenvolvimentoaberto.Menssagem;

public class Principal
 {

public static void main(String[] args)
  {
      // Você pode chamar as packages de 3 modos diferentes:
      // Modo #1: chamando pelo nome completo da package e classe

      org.desenvolvimentoaberto.Menssagem menssagem = new org.desenvolvimentoaberto.Menssagem();
      menssagem.Menssagem("Meu novo pacote java - modo #1");
      // Modo #2: usando a instrução import e importando a classe especifica
      // import org.desenvolvimentoaberto.Menssagem;
      // Modo #3 importando toda a package e assim todas as classes
      // import org.desenvolvimentoaberto.*;

      Menssagem msg = new Menssagem();
      msg.Menssagem("Meu novo pacote java - modo #2");
  }
}

Classe Menssagem – Pacote #2

package org.desenvolvimentoaberto;

public class Menssagem
{
    public void Menssagem (String menssagem )
    {
       System.out.println( menssagem);
    }
    public Menssagem()
    {
    }
}

Condição – Case e Switch – Java, C++, C# e Abap

Publicado: 14 de fevereiro de 2014 em Abap, C#, C/C++, Java

A instrução CASE como o IF também é um comando clássico e existe em muitas linguagens de programação, seja ela compilada ou interpretada. O comando Case predominou por muitos anos e nos tempos atuais ganhou uma nova cara e um novo nome apesar de permanecer com a mesma estrutura, o SWITCH. Comando CASE ainda é usado nos dias atuais por varias linguagens de programação e linguagens de scripts entre elas o ABAP, PL/SQL, TRANSACT-SQL e outras.

A instrução CASE e SWITCH é como uma série de instruções IF, apenas usando a palavra-chave WHEN (Quando) ou CASE (Caso). A instrução é avaliada a partir de cima para baixo. Se a condição for verdadeira, então correspondente a cláusula é executado e execução salta para o fim do caso (avaliação curto-circuito).

Ou seja ao contrário de if-then e declarações if-then-else, a instrução switch pode ter um número de possíveis caminhos de execução. Um switch funciona com o byte, short, char, e tipos primitivos de dados int. Ele também funciona com tipos enumerados, a classe String, e algumas classes especiais que envolvem certos tipos primitivos: Character, Byte, Short, e Integer.

Exemplo:

Neste simples exemplo podemos ver como mostrar na tela o dia da semana usando um numero de 1 a 7.

Java

public class Caso {

public static void main(String[] args)
 {
      int dia = 5;
     switch (dia)
   {
       case 1:
      System.out.println("Segunda");
    break;
          case 2:
       System.out.println("Terça");
    break;
           case 3:
       System.out.println("Quarta");
    break;
           case 4:
       System.out.println("Quinta");
    break;
          case 5:
       System.out.println("Sexta");
    break;
          case 6:
       System.out.println("Sabado");
    break;

    default:
       System.out.println("Domingo");
    break;
  }

}

}

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication55
 {
     class Program
     {
         static void Main(string[] args)
         {
              int dia = 5;
     switch (dia)
   {
       case 1:
      Console.WriteLine("Segunda");
    break;
          case 2:
       Console.WriteLine("Terça");
    break;
           case 3:
       Console.WriteLine("Quarta");
    break;
           case 4:
       Console.WriteLine("Quinta");
    break;
          case 5:
       Console.WriteLine("Sexta");
    break;
          case 6:
       Console.WriteLine("Sabado");
    break;

   default:
   Console.WriteLine("Domingo");
   break;
  }

   Console.ReadKey();
         }
     }
 }

C++

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
 {
  int dia = 5;

switch (dia)
  {
  case 1:
   cout << "Segunda" << endl;
   break;

case 2:
   cout << "Terça" << endl;
   break;

case 3:
   cout << "Quarta" << endl;
   break;

case 4:
   cout << "Quinta" << endl;
   break;

case 5:
   cout << "Sexta" << endl;
   break;

case 6:
   cout << "Sabado" << endl;
   break;

default:
   cout << "Domingo" << endl;
   break;
  }
  system("pause");
  return 0;
 }

ABAP

*&---------------------------------------------------------------------*
*& Report  ZCASO
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Caso
*&---------------------------------------------------------------------*
REPORT  ZCASO.

DATA dia TYPE i.

dia = 5.

CASE dia.

WHEN 1.
               WRITE : / 'Segunda'.

WHEN  2.
               WRITE : / 'Terça'.

WHEN  3.
               WRITE : / 'Quarta'.

WHEN  4.
               WRITE : / 'Quinta'.

WHEN  5.
               WRITE : / 'Sexta'.

WHEN  6.
               WRITE : / 'Sabado'.

WHEN OTHERS.
               WRITE : / 'Domingo'.
ENDCASE.

Classes – Escopos – Java, C++ e C#

Publicado: 14 de fevereiro de 2014 em C#, C/C++, Java

Escopo refere-se à vida e acessibilidade de uma variável. Quão grande é o alcance depende de onde uma variável é declarada. Por exemplo, se uma variável é declarada na parte superior de uma classe, ela será acessível a todos os métodos de classe. Se for declarada num método, em seguida, só pode ser utilizada em tal método.

O escopo de uma variável é a parte do programa que pode acessar uma variável. Quando você tenta acessar uma variável que não está no escopo, você normalmente tém um erro do compilador. Aqui estão algumas das regras de escopo:

  1. Variáveis ​​de classe (campos estáticos) estão no escopo em todos os lugares na classe.
  2. Se uma variável de classe é declarada “pública”, está no escopo em todas as classes.
  3. As variáveis ​​de instância (campos não-estáticos) estão no escopo em métodos não estáticos chamados em um objeto apropriado.
  4. As variáveis ​​e parâmetros locais estão no escopo apenas dentro do método que os declarou.

Exemplo:

Neste exemplo veremos o alcance do escopo das variáveis estáticas, publicas e privadas em sua classe. Na classe principal vemos o resultado do escopo utilizado na classe planeta.

As variáveis privadas podem ser utilizadas somente dentro da classe planeta, a variável publica pode ser utilizada por todas as classes ou neste caso pelo objeto, a variável estática é utilizada globalmente e não precisa ser instanciada, todos os objeto que você criar, ou seja outros planetas irão compartilhar os dados desta variável, as variáveis locais criadas dentro do construtor só podem ser utilizadas dentro do método em que foi criada.

Criamos o objeto da classe planeta chamado Marte, experimente criar outros objetos com nome de planetas e imprima seus valores.

Java

Classe #1 – Principal

public class principal {

public static void main(String[] args)
  {
      Planetas marte = new Planetas(3.0, 1.5, 6.419e23);

      marte.apelido = "Marte";

      System.out.println("Quantidade de planetas: " + Planetas.numeroDePlanetas);
      System.out.println("Nome do Planeta: " + marte.apelido);
      System.out.println("As outras variaveis da classe não podem ser alcançadas devido ao escopo");
      System.out.println("mas podem ser utlizadas dentro da classe");
  }
 }
 

Classe #2 – Planetas

public class Planetas {

 // Variavel da classe é compartilhada por todos
 public static long numeroDePlanetas;

 // Variavel de intancias
 private double x, y;
 private double massa;
 public String apelido;

      // Construtor
      //  x e y são  variaveis instanciadas,
      //  mas newX and newY são variaveis locais
      //  O construtor incrementa o valor
    public  Planetas(double novoX, double novoY, double novaMassa)
    {
       x = novoX;
       y = novoY;

       massa = novaMassa;
       numeroDePlanetas++;
    }
}

C#

Classe #1 – Principal

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication53  {
      class Program
      {
          static void Main(string[] args)
          {
              Planetas marte = new Planetas(3.0, 1.5, 6.419e23);

              marte.apelido = "Marte";

              Console.WriteLine("Quantidade de planetas: " + Planetas.numeroDePlanetas);
              Console.WriteLine("Nome do Planeta: " + marte.apelido);
              Console.WriteLine("As outras variaveis da classe não podem ser alcançadas devido ao escopo");
              Console.WriteLine("mas podem ser utlizadas dentro da classe");

              Console.ReadKey();
          }
      }
  }

Classe #2 – Planetas

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication53 {

public class Planetas {

         // Variavel da classe é compartilhada por todos
          public static long numeroDePlanetas;

         // Variavel de intancias
          private double x, y;
          private double massa;
          public String apelido;

          // Construtor
          //  x e y são  variaveis instanciadas,
          //  mas newX and newY são variaveis locais
          //  O construtor incrementa o valor

          public Planetas(double novoX, double novoY, double novaMassa)
          {
              x = novoX;
              y = novoY;

              massa = novaMassa;
              numeroDePlanetas++;
          }
    }
} 

C++

Classe #1 – Principal

#include "stdafx.h"
#include <iostream>
#include <string>
#include "planetas.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])  {

   Planetas marte(3.0, 1.5, 6.419e23);

   marte.apelido = "Marte";

   cout << "Quantidade de planetas: " << marte.numeroDePlanetas << endl;
   cout << "Nome do Planeta: " << marte.apelido << endl;
   cout << "As outras variaveis da classe não podem ser alcançadas devido ao escopo" << endl;
   cout << "mas podem ser utlizadas dentro da classe" << endl;

   system("pause");

   return 0;
}

Classe #2 – Planetas

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

class Planetas {

private:
    // Variavel de intancias
     double x, y;
     double massa;

public:

     // Variavel de intancias
     string apelido;

     // Variavel da classe é compartilhada por todos
     static int numeroDePlanetas;

     // Construtor
     //  x e y são  variaveis instanciadas,
     //  mas newX and newY são variaveis locais
     //  O construtor incrementa o valor

  Planetas(double novoX, double novoY, double novaMassa)
  {
    x = novoX;
    y = novoY;

    massa = novaMassa;
    numeroDePlanetas++;
   }
};

  int Planetas::numeroDePlanetas;

Encapsulamento que em programação orientada a objetos significa separar o programa em partes, o mais isoladas possível. A idéia é tornar o software mais flexível, fácil de modificar e de criar novas implementações. Objetos restringem a visibilidade de seus recursos (atributos e métodos) aos outros usuários. Todo objeto tem uma interface, que determina como os outros objetos podem interagir com ele. A implementação do objeto é encapsulada, isso é, invisível ou visível  fora do próprio objeto.

Public – deixa visível a classe ou membro para todas as outras classes, subclasses e pacotes do projeto Java, ou namespaces do projeto C#.

Private – deixa visível o atributo apenas para a classe em que este atributo se encontra.

Protected – deixa visível o atributo para todas as outras classes e subclasses que pertencem ao mesmo pacote ou namespace.  O protected é um intermediário entre public e private.

Publico VS Private

  • Publico todas as classes podem usar os métodos e campos.
  • Privado apenas a classe  podem usar os métodos e campos.

Por que Controlar o Acesso?

  • Proteger informação privada.
  • Esclarecer como outros programadores devem usar sua classe.
  • Manter a implementação separado da interface.

Exemplo: imagine o seguinte cenário,  temos uma classe que é responsável por transações de cartões de credito geralmente este tipo de classe pertence a companhia de cartões de credito e foi desenvolvida por um outro programador e esta dentro de uma DLL ou OS, acontece que o desenvolvedor terceirizado cometeu um deslize deixando visível a propriedade numero do cartão. Um desenvolvedor malicioso pode facilmente capturar o numero do cartão referenciando o objeto.

Neste exemplo você deve brincar com o código fonte a fim de resolver o problema de controle de acesso , use CTRL+espaço após a classe para ver a visibilidade de acesso dos métodos e campos.

Java

Classe #1 – Principal

public class Malicioso {

// Assim que setar private esta void não podera ser escrita
// Você não tera mais acesso as propriedades da classe

  static void metodoMalicioso(CartaoCredito cartao)
  {
     cartao.gastos = 0;
     System.out.println("Seu numero de cartão: " + cartao.numeroCartao);
  }

  public static void main(String[] args)
  {
      // Uma transação hipotetica
      CartaoCredito transacao = new CartaoCredito();
      transacao.cobranca("3453 3636 0001 1267", 350.00);

      // Metodo malicioso Injeta um gasto valor de 0 e imprime o numero do cartão
      metodoMalicioso(transacao);
  }

}

Classe #2 – Cartão de Credito

public class CartaoCredito {

  // Esta declaração esta errada
  // Deste modo é possive capturar o numero do cartão
  // A classe expos o numero para que seja acessivel de outra classe
  // para não expor os numero use private
  // private String numeroCartao;
  // private double gastos;

   public String numeroCartao;
   double gastos;

   // Em java mesmo não declarando publico a propriedade ainda é acessivel
   //  public para a void ser vista por outras classes

   public  void cobranca (String nCartao,double valor)
   {
      numeroCartao = nCartao;
      gastos = gastos + valor;
   }

}

C#

Classe #1 – Principal

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Malicioso {

class Program
{

   // Assim que setar private esta void não podera ser escrita
   // Você não tera mais acesso as propriedades da classe

   static void metodoMalicioso(CartaoCredito cartao)
   {
      cartao.gastos = 0;
      Console.WriteLine("Seu numero de cartão: " + cartao.numeroCartao);
   }

   static void Main(string[] args)
   {
      // Uma transação hipotética
      CartaoCredito transacao = new CartaoCredito();
      transacao.cobranca("3453 3636 0001 1267", 350.00);

     // Metodo malicioso Injeta um gasto valor de 0 e imprime o numero do cartão
     metodoMalicioso(transacao);
     Console.ReadKey();
   }
  }
}

Classe #2 – Cartão de Credito

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Malicioso
 {

     public class CartaoCredito
     {
         // Esta declaração esta errada
         // Deste modo é possive capturar o numero do cartão
         // A classe expos o numero para que seja acessivel de outra classe
         // para não expor os numero use private
         // private String numeroCartao;
         // private double gastos;

         public String numeroCartao;
         public double gastos;

         //  public para a void ser vista por outras classes
         public void cobranca(String nCartao, double valor)
         {
             numeroCartao = nCartao;
             gastos = gastos + valor;
         }
     }
}

Classes – Static e Construtores – Java e C#

Publicado: 9 de fevereiro de 2014 em C#, Java

Construtores

Construtores são métodos especiais chamados pelo sistema no momento da criação de um objeto. Eles não possuem valor de retorno, porque você não pode chamar um construtor para um objeto, você só usa o construtor no momento da inicialização do objeto. Construtores representam uma oportunidade de inicializar seus dados de forma organizada. Construtores são obrigatórios em uma classe, mas não é preciso declara-los, caso não declare um construtor por default a declaração é: Classe().

Static

Declaração de  um tipo de Classe, método, propriedade ou variável que pertence exclusivamente a sua própria classe, classes estáticas não podem ser instanciadas.

Exemplo:

Neste cenário queremos saber quantos objetos de uma determinada classe foram instanciados, para isto criamos um contador no construtor do objeto e a cada objeto criado o contador aumenta nos mostrando no final a quantidade exata de novos objetos de uma classe. Visto que nosso contador pertence a classe e não a cada instancia de cada classe, neste caso para usar o contador não precisamos instanciar a classe graças a declaração static.

Java

Classe #1  – Principal


public class Principal {

public static void main(String[] args)
 {
      System.out.println("Quantidade de objetos:" + Construtor.quantidade);
      Construtor c1 = new Construtor();

      System.out.println("Quantidade de objetos:" + Construtor.quantidade);
      Construtor c2 = new Construtor();

      System.out.println("Quantidade de objetos:" + Construtor.quantidade);
      Construtor c3 = new Construtor();

      System.out.println("Quantidade de objetos:" + Construtor.quantidade);

}

}

Classe # 2 – Construtor


class Construtor {

static int quantidade;

Construtor() {
   quantidade = quantidade + 1;
 }

}

C#

Classe #1  – Principal

class Program     {
  static void Main(string[] args)  {

     Console.WriteLine("Quantidade de objetos:" + Construtor.quantidade);
     Construtor c1 = new Construtor();

     Console.WriteLine("Quantidade de objetos:" + Construtor.quantidade);
     Construtor c2 = new Construtor();

     Console.WriteLine("Quantidade de objetos:" + Construtor.quantidade);
     Construtor c3 = new Construtor();

     Console.WriteLine("Quantidade de objetos:" + Construtor.quantidade);

     Console.ReadKey();
    }
}

Classe # 2 – Construtor

class Construtor {

   public static  int quantidade;

   public  Construtor() {
      quantidade = quantidade+1;
   }

}