quinta-feira, 13 de novembro de 2008

Objective C

GNUstep Escrevi recentemente um artigo com um exemplo bem simples de desenvolvimento de uma aplicação para ambiente GNUstep, mas cometi a gafe de não dedicar algum tempo falando da linguagem de programação em questão, Objective C.

Objective C, ou Objective-C, ou ObjC, é uma linguagem de programação reflectiva orientada a objetos criada nos idos da década de 1980 – mais ou menos na mesma época que o C++ – pelos fundadores da Stepstone, mais tarde adquirida pela NeXT. É na verdade uma camada bem fina sobre a linguagem C padrão.

Isso significa que, se você sabe programar em C, conseguirá programar em ObjC sem muito esforço.

Diferenças para C


Sobre a linguagem C, ObjC adiciona os seguintes recursos:
  • Orientação a objetos, adaptada de Smalltalk.
  • Tipo boleano – BOOL. Verdadeiro é YES e falso é NO.
  • Comentário de linha, iniciado por // (na época C não suportava).
  • A diretiva de preprocessador #import, que funciona como #include, mas só inclui o cabeçalho se ele não foi incluído ainda.
  • O tipo id, similar a void * de C/C++.
  • A constante nil, que é um objeto id sem valor: (id)0.


A maior parte dos comandos referentes a orientação a objetos começam com @, como @interface, @implementation, @end, @private, @protected, @public, @protocol, etc.… Entre colchetes é avaliado o ambiente de mensagem, com uma sintaxe muito parecida com a de Smalltalk.

Criando uma classe


Como exemplo, vamos criar a classe Point, com os atributos x e y.

Para tanto, primeiro criamos a interface no arquivo Point.h:
#ifndef _POINT_H
#define _POINT_H

#import <Foundation/Foundation.h>

@interface Point : NSObject
{
int x;
int y;
}

+ (id) newWithX: (int)valuex Y: (int)valuey;
- (id) initWithX: (int)valuex Y: (int)valuey;
- (int) diagonal;
- (int) getX;
- (int) getY;
- (void) setX: (int)value;
- (void) setY: (int)value;

@end

#endif


As diretivas #ifndef, #define e #endif já são velhas conhecidas dos programadores C/C++. O #import já foi explicado, funciona parecido com #include.

O cabeçalho Foundation/Foundation.h inclui a classe NSObject, definida pela API OpenStep, usada aqui como classe pai de nossa classe Point.

O comando @interface inicia a descrição da interface e o comando @end encerra. O pequeno escopo entre chaves define os atributos de instância, protegidos por padrão – para defini-los como públicos a sintaxe seria:
{
@public
int x;
int y;
}


As linhas começadas por um sinal de menos (-) indicam métodos de instância – métodos de classe são iniciados por +. Por exemplo:
- (id) initWithX: (int)valuex Y: (int)valuey;

Significa um método de instância que recebe dois atributos inteiros – valuex e valuey, e retorna um id.

Agora precisamos implementar a interface. Para isso vamos criar o arquivo Point.m:
#include <math.h>
#import "Point.h"

@implementation Point

+ (id) newWithX: (int)valuex Y: (int)valuey {
return [[Point alloc]
initWithX: valuex Y: valuey];
}

- (id) initWithX: (int)valuex Y: (int)valuey {
if ((self = [super init])) {
x = valuex;
y = valuey;
}
return self;
}

- (int) diagonal {
return (int) sqrt((double) ((x * x) + (y * y)));
}

- (int) getX {
return x;
}

- (int) getY {
return y;
}

- (void) setX: (int)value {
x = value;
}

- (void) setY: (int)value {
y = value;
}

@end


O código é muito parecido com C, e até mesmo com C++, cabendo apenas alguns comentários:
  • self é uma palavra reservada que representa a instância, como this de Java e C++.
  • super referencia a classe pai, como em Java.
  • Repare no comando [super init]: aqui é passada uma mensagem para super e o valor retornado é atribuído a self.


Para instanciar um objeto, a sintaxe é:
id point = [Point newWithX: 4 Y: 5];


Ou, com tipagem estática:
Point *point = [Point newWithX: 4 Y: 5];


Para obter o valor de x:
printf("x = %d\n", [point getX]);


E para mudar seu valor:
[point setX: 2];


OpenStep


OpenStep é a API aberta para desenvolvimento de aplicações para NEXTSTEP, resultado de um trabalho colaborativo da NeXT com a SUN Microsystems.

Diversos sistemas e ambientes oferecem suporte a OpenStep, como OS X e GNUstep.

Diversos recursos interessantes são oferecidos nessa API, desde vantagens semelhantes à STL de C++, até conjunto de widgets para construção de janelas, toolkit.

Já vimos uma classe dessa API, NSObject. Outra interessante é NSString, cuja finalidade é a mesma de std::string de C++ e String de Java.

A criação de uma NSString é:
id url = [NSString stringWithCString: "http://kodumaro.blogspot.com/"];


Há ainda um apelido sintático:
id url = @"http://kodumaro.blogspot.com/";


Um forma legal de conhecer mais sobre OpenStep é ler os manuais de referência do GNUstep (toolkit aqui) e do OS X.

[]'s
Cacilhas, La Batalema
blog comments powered by Disqus