Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Mapear objetos em C ( Linux )

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C# Mapear objetos em C ( Linux )

    Este artigo visa passar uma visão geral de como mapear os conceitos da Orientação a Objetos para uma linguagem não orientada a objetos, utilizando como estudo de caso a linguagem C.
    Por: Fábio Felix Dias

    Introdução
    A Orientação a Objetos (OO) é o paradigma de programação mais utilizado no tempo atual para desenvolvimento de sistemas. Permite rapidez, agilidade na produção de software e a reutilização do código, evitando perda de tempo.

    Os conceitos introduzidos pela SIMULA 67 serviram como base para o desenvolvimento de uma linguagem de programação voltada para tal estilo de desenvolvimento. Os conceitos alcançaram maturidade com a Smalltalk, que foi a primeira linguagem de programação realmente e totalmente OO. Mas, os programadores só se interessaram verdadeiramente por esse paradigma com o C++, devido a este ser muito parecido com o C e possuir compiladores bons e baratos e muitas vezes sem custos.

    Baseados nesses conceitos, muitas outras linguagens surgiram, além de formas de modelagem de projetos, padrões etc. Mas, como nos dias de hoje escrever códigos em uma linguagem não orientada a objetos e não perder, pelo menos não completamente, o poder da OO?

    Aqui são elucidados os principais passos para isso. Dessa forma programadores podem utilizar-se do projeto OO e implementá-lo em uma linguagem que não tem suporte a esse tipo de programação. Para isso será utilizado o C por possuir fraca verificação de tipos e por ser flexível o suficiente para proporcionar implementações dos conceitos abordados.

    Transformação de classes em structs
    Para começar vamos transformar classes em structs C. Todos os atributos de uma determinada classe deverão fazer parte dessas estruturas.

    Código:
    typedef struct projeto
    {
    int codigo;
    }Projeto;
    
    typedef struct criar
    {
    char* data[];
    
    }Criar;
    
    typedef struct desenho
    {
    int referencia;
    char* nome[];
    }Desenho;
    
    typedef struct item_desenho
    {
    int codigo;
    int quantidade;
    }Item_desenho;
    Passagem de argumentos para métodos (funções)
    Em orientação objeto os métodos possuem no mínimo um argumento implícito (this, self etc). Nas linguagens não OO esse argumento deve ser explícito.

    Quando o método faz alguma modificação no objeto, este deve ser passado como uma referência para aquele. Quando a modificação não for necessária a passagem pode ser por valor. Para que a programação fique mais uniforme, é melhor que todos os argumentos, pelo menos os objetos definidos pelo usuário, sejam passados por referência, até porque esta é menos custosa do que a outra.

    Ex.:
    Código:
    void set_projeto(Projeto* p)
    void set_codigo_projeto(Projeto* p, int codigo)
    int get_codigo_projeto(Projeto* p)
    Chamadas:
    Código:
    Projeto* p
    
    //a alocação será mostrada mais adiante
    
    set_projeto(p);
    Alocação de memória
    Os objetos alocados dinamicamente são necessários quando sua quantidade não é conhecida em tempo de compilação. Assim acontece, por exemplo, com estruturas de dados como listas, árvores, grafos etc. A memória para eles deve ser solicitada explicitamente através de operadores especiais. Em C, isso acontece através das funções malloc e free, respectivamente.

    Ex.:

    Criação:
    Código:
    Desenho* desenho = malloc(sizeof(Desenho));
    Remoção:
    Código:
    free(desenho);
    Herança
    A herança pode ser implementada de várias formas em uma linguagem que não possui a abordagem orientada a objetos. Podem ser destacadas:

    * Hierarquia de classes horizontalizada: expandir cada classe concreta como uma estrutura independente, reimplementando cada operação herdada em cada uma delas, além de duplicar também os atributos que seriam herdados. Essa abordagem leva a duplicação de atributos e métodos que pode ser retirada através do uso de macros ou de estruturas. Os atributos herdados podem ser colocados em uma estrutura e essa pode ser introduzida nas classes concretas diminuindo a quantidade de linhas. A utilização de espaços de nomes também é bem vinda nessa implementação.
    * Criação de objetos separados: criar um objeto com os atributos que são inerentes e os demais objetos devem possuir uma referencia para aquele. Com esses atributos dentro de um só objeto pode-se criar métodos que os manipulem.
    * Evite a herança: algumas aplicações não precisa de herança e outras nem às possuem. Onde isso acontece as classes podem ser representadas por estruturas simples.


    Ex.:
    Protótipos:

    Código:
    typedef struct objeto{
    char* nome[];
    char* cor[];
    }Objeto;
    
    typedef struct quadrado{
    Objeto * obj;
    double aresta;
    }Quadrado;
    
    typedef struct circulo{
    Objeto * obj;
    double raio;
    }Circulo;
    Resolução de métodos
    Uma característica inerente é o polimorfismo, mas como fazer para C resolver os métodos em tempo de execução já que essa característica não é implementada nessa linguagem, é o foco desta sessão. Para isso, pode-se tratar a resolução de métodos de algumas formas como:

    * Métodos estáticos: se as classes já forem definidas para cada objeto, o método certo pode ser determinado antes da compilação removendo assim a necessidade de resolução. A única dificuldade é a hierarquia das classes ser modificada, mesmo assim não é difícil para o programador determinar qual a classe que deverá chamar um determinado método;
    * Métodos dinâmicos: se o programador necessita aplicar um determinado método a um conjunto heterogêneo de classes, é obvio que a resolução será necessário. O C utiliza ponteiros para métodos o que pode auxiliar na execução dinâmica dos métodos.


    A ideia básica é resolver a maior quantidade possível de métodos em tempo de compilação.

    Associações
    Estas são mantidas da mesma maneira que em linguagens OO com a utilização de ponteiros ou referencias. 1x1, um ponteiro em um dos lados da associação ou em ambos a depender da necessidade de visualização; 1xn, utilização de um ponteiro para uma estrutura de dados, contendo as estruturas que participam n fezes, no lado que participa uma vez da associação. É interessante criar métodos que encapsulem as operações de manipulação de ponteiros para uma maior segurança.

    Concorrência
    A grande maioria das linguagens de programação não possuem suporte nativo ao controle de concorrência, em C não seria diferente. Mesmo assim, pode-se utilizar chamadas ao kernel dos sistemas ou bibliotecas criadas para essa finalidade como a OpenMP, Pthread etc.

    Fonte: vivaoLinux
    Postado Por: RedDeviL
X
Working...
X