Mapear objetos em C
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.
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.
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.:
Protótipos:
Chamadas:
Ex.:
Criação:
Remoção:
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.
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;
{
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.:
Protótipos:
void set_projeto(Projeto* p)
void set_codigo_projeto(Projeto* p, int codigo)
int get_codigo_projeto(Projeto* p)
void set_codigo_projeto(Projeto* p, int codigo)
int get_codigo_projeto(Projeto* p)
Chamadas:
Projeto* p
//a alocação será mostrada mais adiante
set_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:
Desenho* desenho = malloc(sizeof(Desenho));
Remoção:
free(desenho);
Quer usar OO em C ?
Pq sera que tem C++ entao neh ?
Jah ouviu a expressao "cada macaco no seu galho" ?