Arquivo de fevereiro, 2014

SAP – Tipos Complexos – Structures – Abap

Publicado: 20 de fevereiro de 2014 em Abap

Tipos de dados complexos podem ser definidos para criar variáveis ​​estruturadas (também chamados de estruturas). Declarações TYPES com as adições dos comandos BEGIN OF e  END OF, criam tipos de variáveis estruturadas. Componentes de uma estrutura são referenciados usando um hífen, as estruturas podem ser aninhadas e podem ser copiadas da estrutura da variável A para a estrutura da variável B.

Sintaxe:

TYPES:
BEGIN OF nome_da_estrutura,
nome do campo TYPE type,
nome do campo TYPE type, […]
END OF nome_da_estrutura.

Exemplo:

Neste exemplo criamos uma simples estrutura de endereço:

Abap

*&---------------------------------------------------------------------*
*& Report  ZESTRUTURAS
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Estruturas
*&---------------------------------------------------------------------*

REPORT  ZESTRUTURAS.

* Declarando uma estrutura

TYPES:
BEGIN OF endereco_struct,
         endereco1 TYPE c LENGTH 60,
         endereco2 TYPE c LENGTH 60,
         bairro    TYPE c LENGTH 50,
         cidade    TYPE c LENGTH 60,
         estado    TYPE c LENGTH 2,
         cep       TYPE n LENGTH 9,
END OF   endereco_struct.

* Declarando variaveis para a estrutura
DATA postal TYPE endereco_struct.

postal-endereco1 = 'Avenida São João, 500'.
postal-endereco2 = 'Avenida Ipiranga, 458'.
postal-bairro    = 'Centro'.
postal-cidade    = 'São Paulo.'.
postal-estado    = 'SP'.
postal-cep       = 01035100.

WRITE : /  postal-endereco1, / postal-endereco2, / postal-bairro, / postal-cep,
        /  postal-cidade, / postal-estado.

Data, Hora, Timestamp – Abap

Publicado: 19 de fevereiro de 2014 em Abap

Sistemas de processamento de transações online (OLTP), tais como os que compõem o SAP Business Suite mantem os dados sensíveis ao tempo, por isso é importante você entender como trabalhar com os tipos de data e hora embutido fornecidos em ABAP.

O ABAP fornece dois tipos built-in para trabalhar com datas e horários:

  • d – data – formato AAAAMMDD.
  • t – tempo formato   HHMMSS.

Em adição a estes tipos embutido, o ABAP Dictionary possui os tipos TIMESTAMP e TIMESTAMPL e compatível  com o formato UTC.

TIMESTAMP é uma sequência de caracteres ou informação codificada para identificar quando um determinado evento ocorreu, geralmente dando data e hora do dia, às vezes a precisão de uma pequena fração de segundo.

Timestamps são normalmente utilizados para eventos de registro de log ou uma sequência de eventos (SOE), caso em que cada evento no log ou SOE é marcado com um timestamp. Em sistemas de arquivos, timestamp pode significar a data / hora armazenada de criação ou modificação de um arquivo.

Abap possui campos do sistema uteis para manipulação de data e hora.

Campos do Sistema:

  • sy-datlo –  Data no fuso horário do usuário atual.
  • sy-datum  – Data local do sistema de ABAP. Indicador.
  • sy-dayst –  para horário de verão. Durante o Verão, “X”, caso contrário “”.
  • sy-fdayw – calendário Fábrica dia da semana. “1” para segunda-feira, …, “5” para sexta-feira.
  • sy-timlo – Tempo no fuso horário do usuário atual.
  • sy-tzone – Diferença de tempo a partir do momento de referência UTC em segundos, ignorando o verão.
  • sy-uzeit – Hora local do sistema de ABAP.
  • sy-zonlo – fuso horário do usuário.

Exemplo:

Neste exemplo trabalhamos com os campos built-in do sistema , com timestamp e seus diferencias, como manipular o horário de verão, dia da semana e outros.

Abap

*&---------------------------------------------------------------------*
*& Report  ZDATAEHORA
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Data, Hora e Timestamp
*&---------------------------------------------------------------------*

REPORT  ZDATAEHORA.

DATA : datasistema  TYPE d,
       horasistema  TYPE t,
       datausuario  TYPE d,
       horausuario  TYPE t,
       datastamp    TYPE timestamp,
       datastampL   TYPE timestampl,
       horarioverao TYPE abap_bool,
       diasemana    TYPE d.

* Trabalhando com Data e Hora

datasistema = sy-datum.
horasistema = sy-uzeit.

datausuario = sy-datlo.
horausuario = sy-timlo.

diasemana = sy-fdayw.

PERFORM diaextenso.

Write : / 'Data de sistema:', datasistema DD/MM/YYYY,
        / 'Hora do sistema:', horasistema USING EDIT MASK '__:__',
        / ,
        / 'Data do usuario:', datausuario DD/MM/YYYY,
        / 'Hora do usuario:', horausuario USING EDIT MASK '__:__', /.

* Trabalhando com TimeStamp

GET TIME STAMP FIELD datastamp.
GET TIME STAMP FIELD datastampL.

WRITE: / 'Time Stamp      :', datastamp TIME ZONE sy-zonlo,
       / 'Time Stamp Longo:', datastampL TIME ZONE sy-zonlo, /.

* Convertendo TIMESTAMP

CONVERT TIME STAMP datastamp TIME ZONE sy-zonlo
INTO DATE datausuario TIME horausuario
DAYLIGHT SAVING TIME horarioverao.

WRITE: / 'Data de hoje: ', datausuario DD/MM/YYYY,
       /(60) horausuario USING EDIT MASK 'A hora atual é: __:__:__', /.

IF horarioverao EQ abap_true.
   WRITE : / 'Estamos em horario de verão'.
ELSE.
   WRITE : / 'Não estamos em horario de verão'.
ENDIF.

FORM diaextenso.
  CASE sy-fdayw.
    WHEN  1.
      WRITE : / 'Segunda-feira'.
    WHEN  2.
      WRITE : / 'Terça-feira'.
    WHEN  3.
      WRITE : / 'Quarta-feira'.
    WHEN  4.
      WRITE : / 'Quinta-feira'.
    WHEN  5.
      WRITE : / 'Sexta-feira'.
    WHEN  6.
      WRITE : / 'Sabado'.
    WHEN  7.
      WRITE : / 'Domingo'.
  ENDCASE.
ENDFORM.

Tipo Booleano – abap_bool – Abap

Publicado: 19 de fevereiro de 2014 em Abap

abap_bool  é um tipo de dado primitivo que possui dois valores, que podem ser considerados como  verdadeiro ou falso. Não existe realmente um tipo boolean em ABAP, mas existe um workaround no sistema R/3 que simula campos booleanos. O que acontece é que no dicionário ABAP existe uma constante para abap_true com o valor do caractere char “X’ e para abap_false um valor nulo, deste modo o compilador ABAP consegue simular tipos booleanos.

Definição:

O tipo abap_bool é definido como:
types: abap_bool type c length 1.

Você pode confirmar a constante abap_true no dicionário ABAP (SE11) como:

Constants: abap_true type abap_bool value ‘X’

Exemplo:

Neste exemplo mostramos o conteúdo do campo abap_bool e todos os seu valores e o utilizamos como campos booleanos:

Abap

*&---------------------------------------------------------------------*
*& Report  ZBOOLEAN
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Campos Booleanos
*&---------------------------------------------------------------------*

REPORT  ZBOOLEAN.

DATA valida TYPE abap_bool.

WRITE : / 'Valor Boolean default:', valida.

valida = abap_false.

WRITE : / 'Valor Boolean falso: ', valida.

valida = abap_true.

WRITE : / 'Valor Boolean verdadeiro: ', valida.

IF valida EQ abap_true.
  WRITE: / 'Estou validando um campo boolean verdadeiro'.
ENDIF.

valida = abap_false.

IF valida EQ abap_false.
  WRITE : / 'Estou validando um campo boolean falso'.
ENDIF.

A declaração TRANSLATE converte caracteres em maiúsculas ou minúsculas, ou usa regras de substituição para converter todas as ocorrências de um caractere para outro  caractere.

Sintaxe:

TRANSLATE <c> TO UPPER CASE.
TRANSLATE <c> TO LOWER CASE.
TRANSLATE <c> USING <r>.

O comando PACK serve para retirar os 0 (zeros) a esquerda de uma variável, trocando por espaços em branco.

Sintaxe: PACK variável TO variável.

A declaração CONDENSE exclui espaços redundantes de uma string.

Sintaxe: CONDENSE variável.

STRLEN retorna o comprimento de uma string até o último caractere que não é um espaço.

Sintaxe: COMPUTE  n  = STRLEN( c ).

SUBSTRING é um instrução usada em varias linguagens de programação, o método extrai os caracteres de uma cadeia, entre dois índices especificados, e retorna o novo sub string. Em ABAP a palavra chave SUBSTRING não é necessária, usa se direto a variável literal.

Sintaxe: LITERAL+posição_inicial(posição_final).

Exemplo:

Neste exemplo usamos vários métodos para a manipulação de strings:

Abap

*&---------------------------------------------------------------------*
*& Report  ZTRADUCAO
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Manipulação de Strin
*& Translate, Pack, Condense, Compute Strlen, Substring
*&---------------------------------------------------------------------*

REPORT  ZTRADUCAO.

DATA : variavel TYPE c LENGTH 50,
       numeros  TYPE c LENGTH 30 VALUE '0000446577',
       tamanho  TYPE i.

variavel = 'desenvolvimento aberto'.

TRANSLATE variavel TO UPPER CASE.
WRITE : / 'Caixa Alta: ',variavel.

TRANSLATE variavel TO LOWER CASE.
WRITE : / 'Caixa Baixa:',variavel.

variavel = 'Abab-BaAa X bababa Y bdba Z bAbaB'.
WRITE : / , / 'Troca: ', variavel.

* troca B-A, b-a, A-b, a-b
TRANSLATE variavel USING 'BAbaABab'.
WRITE : / 'Troca: ', variavel.

* Retira os zeros de uma variavel
WRITE : / , / 'Numeros: ', numeros.
PACK numeros TO numeros.

* Retira os espaços em branco que ficou no lugar do zeros
CONDENSE numeros.
COMPUTE tamanho =  STRLEN( numeros ).
WRITE : / 'Numeros: ', numeros, 'Contém:',tamanho,'caracteres'.

* Recorta pedaço de uma variavel
*AbertoDesenvolvimento
*012345678901234567890 = 21 caracteres
variavel = 'AbertoDesenvolvimento'.

WRITE : / , / 'Substring de ', variavel, ':'.
WRITE:  /  variavel+6(15) , variavel+0(6).

Manipulando Strings – Find e Replace – Abap

Publicado: 19 de fevereiro de 2014 em Abap

A declaração FIND é usada para encontrar ocorrências de um padrão dentro de uma string. Ela também pode ser usado para localizar o padrão de sequência dentro de uma tabela interna.

A declaração REPLACE substitui uma string por uma outra e possui os mesmos parâmetros da declaração FIND, apenas acrescentando o comando WITH.

Sintaxe:

REPLACE s1 WITH s2 INTO c [LENGTH l].

e

FIND s1 IN s2.

FIND [FIRST OCCURRENCE OF ou ALL OCCURENCES OF] s1 IN s2.

FIND s1 IN s2 [IGNORING CASE ou RESPECTING CASE].

Resultado da operação de localização são armazenados na constante sy-SUBRC:

  • sy-SUBRC definido como 0, se for encontrado.
  • sy-SUBRC definido para 4 se não for encontrado.

Exemplo:

Neste exemplo procuramos a palavra “Amora” dentro de outro campo string, contamos o numero de ocorrências e usamos parâmetros de caso sensitivo e insensitivo.

*&---------------------------------------------------------------------*
*& Report  ZENCONTRAR
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Encontrar Strings
*&---------------------------------------------------------------------*

REPORT  ZENCONTRAR.

DATA : desc   TYPE c LENGTH 30,
       campo1 TYPE c LENGTH 50,
       campo2 TYPE c LENGTH 50,
       campo3 TYPE c LENGTH 100,
       x      TYPE i.

campo1 = 'Amora'.
campo2 = 'amora'.
campo3 = 'Você deve encontrar a string Amora dentro deste campo Amora, Amora, Amora'.

WRITE : / campo3.

desc = 'Valor default da constante:'.
WRITE : / 'A Constante sy-subrc determina o resultado do comando Find encontrou=0 não encontrou =4',
        / desc, 'sy-subrc = ', sy-subrc.

desc = 'Primeira ocorrencia '.
FIND FIRST OCCURRENCE OF campo1 IN campo3 MATCH COUNT x.
PERFORM resultadoFind USING campo1 x.

desc = 'Todas as ocorrencias'.
FIND ALL OCCURRENCES OF  campo1 IN campo3 MATCH COUNT x.
PERFORM resultadoFind USING campo1 x.

desc = 'Ignora Case'.
FIND campo2 IN campo3 IGNORING CASE MATCH COUNT x.
PERFORM resultadoFind USING campo2 x.

desc = 'Respeita Case'.
FIND campo2 IN campo3 RESPECTING CASE MATCH COUNT x.
PERFORM resultadoFind USING campo2 x.

REPLACE ALL OCCURRENCES OF campo1 IN campo3 With 'Banana'.
WRITE : / 'O campo3 foi modificado para:',
        / campo3.

FORM resultadoFind USING VALUE(X1) VALUE(X2).
   IF sy-subrc EQ 0.
      WRITE : / sy-subrc, X1, desc, ' encontrou', X2, 'strings'.
   ELSE.
      WRITE : / sy-subrc, X1, desc, ' não encontrou', X2, 'strings'.
   ENDIF.
ENDFORM.

Manipulando Strings – Concatenate e Split – Abap

Publicado: 19 de fevereiro de 2014 em Abap

A declaração CONCATENATE combina duas ou mais strings separadas em uma unica string. Esta declaração concatena dois ou mais campos de caracteres e atribui o resultado a um unico campo. O sistema ignora espaços no final das strings individuais. A instrução SEPARATED BY permite que você especifique um campo de caracteres, que é colocado entre os campos individuais.

A instrução SPLIT dividi uma cadeia de caracteres em duas ou mais strings menores.

Sintaxe:

CONCATENATE campo1 … campo(n) INTO campoX SEPARATED BY campoY

e

SPLIT campo AT [variável de separação] INTO campo2 campo3 [campo4 …].

Mais informações: http://help.sap.com/saphelp_nw04s/helpdata/en/9f/db998835c111d1829f0000e829fbfe/content.htm

Exemplo:

Neste exemplo concatenamos duas mensagens em uma única mensagem separado por uma campo string.

Abap

*&---------------------------------------------------------------------*
*& Report  ZMANIPULACAOSTRING
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Manipulação de Strings
*&---------------------------------------------------------------------*
REPORT  ZMANIPULACAOSTRING.

Data : parte1 TYPE c LENGTH 50,
       parte2 TYPE c LENGTH 50,
       juncao TYPE c LENGTH 100, " deve ter tamanho suficiente para concatenar as strings
       separa TYPE c LENGTH 14.

parte1 = 'Primeiro pedaço da menssagem'.
parte2 = 'Segundo pedaço da menssagem'.
separa = ' <separador> '.

CONCATENATE parte1 parte2 INTO juncao SEPARATED BY separa.

WRITE: / 'A variavel contém as seguintes menssagens concatenadas pelo separador :', separa,
       / juncao.

parte1 = ''.
parte2 = ''.

SPLIT juncao AT separa INTO parte1 parte2.

WRITE : / 'A variavel foi separada novamente pela string separadora',
        / parte1,
        / parte2.

Message – Abap

Publicado: 19 de fevereiro de 2014 em Abap

Usado para eviar menssagens ao usuario do programa.

Sintaxe:

MESSAGE ‘menssagem de texto’ TYPE ‘[tipo]’.

Tipos de Menssagem

  • I – informação Exibir mensagem. Programa continua depois do usuário descartar a mensagem. Caixa de diálogo Modal
  • S – mensagem de Sucesso Exibir mensagem. Programa continua sem interrupção. Barra de status ou caixa de diálogo modal. *
  • W – aviso Exibir mensagem. Comportamento depende do contexto. Barra de status ou caixa de diálogo modal. *
  • – erro Exibir mensagem. Comportamento depende do contexto. Barra de status ou caixa de diálogo modal. *
  • A – terminação. Programa rescindido. Caixa de diálogo Modal.
  • X – curto despejo. Erro de tempo desencadeada com despejo Dump para a tela.

* Depende das configurações do SAP GUI.

Mais informações: http://help.sap.com/saphelp_46c/helpdata/en/85/daf6d14bac11d1890e0000e8322f96/content.htm

Exemplo:

Neste exemplo apenas imprimimos na tela algumas mensagens ao usuário.

Abap

*&---------------------------------------------------------------------*

*& Report  ZMENSSAGEM

*&

*&---------------------------------------------------------------------*

*& Desenvolvimento Aberto

*& Menssagens

*&---------------------------------------------------------------------*

REPORT  ZMENSSAGEM.

MESSAGE 'Menssagem de Sucesso' TYPE 'S'.

MESSAGE 'Menssagem de tipo Informação' TYPE 'I'.

MESSAGE 'Menssagem de tipo de termino do programa' TYPE 'A'.

Form e Perform – Abap

Publicado: 18 de fevereiro de 2014 em Abap

Similar às funções em outras linguagens de programação. Fornece encapsulamento de funcionalidade. Permite a passagem de parâmetro usando métodos diferentes.

A declaração FORM define uma sub-rotina e sua interface. Convenções de nomenclatura se aplicam ao nome da sub-rotina. As funções da sub-rotina são implementadas entre as declarações FORM e ENDFORM. As adições definem os parâmetros formais da sub-rotina e declaram a propagação das exceções de classe até a instrução que a invocou.

Você pode usar o comando PERFORM para chamar uma sub-rotina ABAP (FORM) a partir de qualquer programa, sujeito à verificação normal de autorização ABAP em tempo de execução. Você pode usar essas chamadas a sub-rotinas para a realização de cálculos, para a obtenção de dados a partir do banco de dados, formatação de dados, e assim por diante.

Métodos de Parâmetros

Apesar de uma sub-rotina poder operar em dados globais, este é um design pobre e nunca deve ser feito. O risco de erros de manutenção é muito maior.

Escolha o método mais conservador de passagem de parâmetros com base em objetivos de design:

  • Chamada por valor tem a vantagem de proporcionar segurança do objeto de dados. Mudanças na variável na sub-rotina não afetará o principal objeto de dados.
  • Chamada por valor e chamada por valor e resultado têm a desvantagem de sobrecarga associada ao fazer cópias de objetos de dados. Evite para grandes objetos de dados.

Sintaxe:

Escreve uma sub-rotina basica:

FORM minhasubrotina.

[instruções]

ENDFORM.

Chama uma sub-rotina basica:

PERFORM minhasubrotina.

Mais informações sobre sub rotinas: http://help.sap.com/abapdocu_702/en/abapform.htm

Exemplo:

Neste exemplo criamos três sub-rotinas, a primeira com uma sintaxe básica, a segunda enviando parâmetros e a terceira usando uma troca de valores dentro da sub-rotina.

Abap

*&---------------------------------------------------------------------*
*& Report  ZSUBROTINA *&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Sub Rotinas
*&---------------------------------------------------------------------*

REPORT  ZSUBROTINA.

* Declara variavel
DATA :  menssagem TYPE c LENGTH 100,
        num1      TYPE i,
        num2      TYPE i,
        resultado TYPE i.

* Alimenta variáveis
 menssagem = 'Enviando Menssagem Com Parametro'.
 num1 = 10.
 num2 = 2.
 resultado = 0.

* Chama Sub Rotina

PERFORM basico.
PERFORM msg USING menssagem.

* Troca valores depois da execução da Sub Rotina
PERFORM multiplica USING num1 num2 CHANGING resultado.
 WRITE : / 'Depois da Sub Rotina',
         / 'Reultado =' UNDER 'Resultado =', resultado.

* Cria Sub Rotina

* Sub Rotina Comum
FORM basico.
   WRITE : / 'Menssagem de uma Sub Rotina Basica'.
ENDFORM.

* Utiliza Parametros
FORM msg  USING messagem TYPE any.
   WRITE : / menssagem.
ENDFORM.

FORM multiplica USING    VALUE(x1) TYPE any
                          VALUE(x2) TYPE any
            CHANGING      VALUE(x)  TYPE any.
   x = x1 * x2.
   WRITE : / 'Multiplica X pelos parametros e troca pelo resultado',
           / ' Dentro da Sub Rotina :',
           / ' X = ', x , ' Resultado = ', resultado.
ENDFORM.

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.