54
Programação orientada a objetos em C puro: o caso do htop Hisham Muhammad [email protected] @hisham_hm FISL 16, 2015

Programação orientada a objetos em C puro: o caso do htop

  • Upload
    vungoc

  • View
    219

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programação orientada a objetos em C puro: o caso do htop

Programaçãoorientada a objetos

em C puro:o caso do htopHisham Muhammad

[email protected]@hisham_hm

FISL 16, 2015

Page 2: Programação orientada a objetos em C puro: o caso do htop

Quem sou eu

Hisham Muhammad - [email protected]

GoboLinux htop LuaRocksgobolinux.org hisham.hm/htop luarocks.org

Page 3: Programação orientada a objetos em C puro: o caso do htop

O htop

http://hisham.hm/htop/

Page 4: Programação orientada a objetos em C puro: o caso do htop

Por que C?

portabilidadede hardware? de sistema? de distro?

desempenhodesempenho CPU — footprint de RAM

controlesobre a execução — sobre a memória

Page 5: Programação orientada a objetos em C puro: o caso do htop

Qual C?

K&R C (1978)

ANSI C (1989)

ISO C99 (1999)

ISO C11 (2011)

Page 6: Programação orientada a objetos em C puro: o caso do htop

Qual C?

K&R C (1978)

ANSI C (1989)

ISO C99 (1999)

ISO C11 (2011)

Page 7: Programação orientada a objetos em C puro: o caso do htop

Por que não C++?

"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off."

Bjarne Stroustrup, criador de C++

Page 8: Programação orientada a objetos em C puro: o caso do htop

Dependências do htop

build:Autotools

(Automake, Autoconf...)

runtime:NCurses

Page 9: Programação orientada a objetos em C puro: o caso do htop

Abordagem de desenvolvimento

código simples

o mais alto-nível possível

pagar o preçosomente das features

que usarmos

Page 10: Programação orientada a objetos em C puro: o caso do htop

github.com/hishamhm/htop

Page 11: Programação orientada a objetos em C puro: o caso do htop

Programação orientada a objetos

Objetos

Classes

Herança

Subtipagem

Métodos virtuais

Estruturas de dados

Page 12: Programação orientada a objetos em C puro: o caso do htop

Peraí, isso é "Java"?

Não, apenas algumas convenções:

Uma classe por arquivo

Nomenclatura "CamelCase"

VectorHashtable

indexOfObject

AvailableColumnsPanel

setDefaultBarthis

Page 13: Programação orientada a objetos em C puro: o caso do htop

Objetos

objetos = atributos + métodos

Page 14: Programação orientada a objetos em C puro: o caso do htop

Objetos

objetos = atributos + métodos

em C:

atributos = struct

métodos = funções

Page 15: Programação orientada a objetos em C puro: o caso do htop

Construtor e destrutor

MyObject* MyObject_new(int foo) {

MyObject* this = malloc(sizeof(MyObject));

this->foo = foo;

return this;

}

MyObject_delete(MyObject* this) {

free(this);

}

Page 16: Programação orientada a objetos em C puro: o caso do htop

Métodos

int MyObject_sumValue(MyObject* this, int value) {

this->foo += value;

return this->foo;

}

Page 17: Programação orientada a objetos em C puro: o caso do htop

Objetos e métodos no htop

Em quase todo lugar:PainéisElementos dos painéisProcessosLista de processosMedidoresCabeçalhoBarras de funções

Page 18: Programação orientada a objetos em C puro: o caso do htop

Visibilidade

public vs. private (vs. ...)

Page 19: Programação orientada a objetos em C puro: o caso do htop

Visibilidade

public vs. private (vs. ...)

em C:

métodos privados = funções static

Page 20: Programação orientada a objetos em C puro: o caso do htop

Métodos públicos e privados

void MyObject_publicMethod(MyObject* this) {

...

}

static void MyObject_privateMethod(MyObject* this) {

...

}

Se...

Page 21: Programação orientada a objetos em C puro: o caso do htop

Métodos públicos e privados

void MyObject_publicMethod(MyObject* this) {

...

}

static void MyObject_privateMethod(MyObject* this) {

...

}

Se temos uma classe por arquivo

Page 22: Programação orientada a objetos em C puro: o caso do htop

Subtipagem (!= herança!)

relação "X is a Y"

Page 23: Programação orientada a objetos em C puro: o caso do htop

Subtipagem (!= herança!)

relação "X is a Y"

em C:

"Onde os casts são válidos?"

Page 24: Programação orientada a objetos em C puro: o caso do htop

Subtipagem em C

typedef struct Pug_ {

Dog super;

char c;

} Pug;

Pug* p = ...;

printf("%c", p->c);

printf("%d", p->super.a);

Dog* x = (Dog*) &p;

printf("%d", x->a);

a

bsuper

c

typedef struct Dog_ {

int a;

double b;

} Dog;

Dog* d = ...;

printf("%d", d->a);

Page 25: Programação orientada a objetos em C puro: o caso do htop

Subtipagem em C

typedef struct Dog_ {

int a;

double b;

} Dog;

Dog* d = ...;

printf("%d", d->a);

typedef struct Pug_ {

Dog super;

char c;

} Pug;

Pug* p = ...;

printf("%c", p->c);

printf("%d", p->super.a);

Dog* x = (Dog*) &p;

printf("%d", x->a);

a

b

a

b

c

Pug is a Dog

Page 26: Programação orientada a objetos em C puro: o caso do htop

Subtipagem em C

a

b

super

c

typedef struct Dog_ {

int a;

double b;

} Dog;

Dog* d = ...;

printf("%d", d->a);

typedef struct Pug_ {

Dog* super;

char c;

} Pug;

Pug* p = ...;

printf("%c", p->c);

printf("%d", p->super->a);

Dog* x = (Dog*) &p;

printf("%d", x->a);

Pug is not a Dog!

Page 27: Programação orientada a objetos em C puro: o caso do htop

Subtipagem em C

a

b

super

c

typedef struct Dog_ {

int a;

double b;

} Dog;

Dog* d = ...;

printf("%d", d->a);

typedef struct Pug_ {

Dog* super;

char c;

} Pug;

Pug* p = ...;

printf("%c", p->c);

printf("%d", p->super->a);

Dog* x = (Dog*) &p;

printf("%d", x->a);

Pug is not a Dog!?

Page 28: Programação orientada a objetos em C puro: o caso do htop

Subtipagem no htop

Process is an ObjectMeter is an ObjectPanel is an Object

MainPanel is a PanelMetersPanel is a Paneletc.

um Panel apresenta uma lista de Objects

Page 29: Programação orientada a objetos em C puro: o caso do htop

Herança

Quais classesreaproveitam código de quais

Page 30: Programação orientada a objetos em C puro: o caso do htop

Herança

Quais classesreaproveitam código de quais

em C:

como organizamos nossosponteiros para funções

Page 31: Programação orientada a objetos em C puro: o caso do htop

Métodos virtuais

Em C++ temos...class Pessoa { void ola() { printf("Bom dia"); } virtual void bye() { printf("Adeus"); }};

class Barulhento: Pessoa { void ola() { printf("BOM DIA!"); } virtual void bye() { printf("FALOU!"); }};

...

Barulhento joaozinho;Pessoa* p = &joaozinho;p->ola(); p->bye();

Page 32: Programação orientada a objetos em C puro: o caso do htop

Métodos virtuais

Em C...void Pessoa_ola() { printf("Bom dia");void Pessoa_bye() { printf("Adeus"); }

void Barulhento_ola() { printf("BOM DIA!"); }void Barulhento_bye() { printf("FALOU!"); }

...

Barulhento* joaozinho = Barulhento_new();Pessoa* p = joaozinho;Pessoa_ola(); p->klass->bye();

Page 33: Programação orientada a objetos em C puro: o caso do htop

VTables

Tabela de ponteiros de função

Em C, criamos uma struct contendoos ponteiros dos métodos virtuais

e os "atributos de classe"

C++ e Java não fazem mágica

Page 34: Programação orientada a objetos em C puro: o caso do htop

Métodos virtuais no htop

Classes que derivam de Object redefinemdeletedisplay

Classe Panel usa o método display

Na prática, uma minoria das funções!

Page 35: Programação orientada a objetos em C puro: o caso do htop

Estruturas de dados

Linguagens OO tipicamenteoferecem coleções padrão

Page 36: Programação orientada a objetos em C puro: o caso do htop

Estruturas de dados

Linguagens OO tipicamenteoferecem coleções padrão

em C:

Coleções (vetores, hashtables)podem nos ajudar muito na

gerência de memória

Page 37: Programação orientada a objetos em C puro: o caso do htop

C e as segmentation faults

ponteiro não inicializado

ponteiro contém valor velho

ponteiro contém valor inválido

Page 38: Programação orientada a objetos em C puro: o caso do htop

C e as segmentation faults

ponteiro não inicializadoerro na inicialização do objeto

ponteiro contém valor velho

ponteiro contém valor inválido

Page 39: Programação orientada a objetos em C puro: o caso do htop

C e as segmentation faults

ponteiro não inicializadoerro na inicialização do objeto

ponteiro contém valor velhoproblema no gerência do tempo de vida

ponteiro contém valor inválido

Page 40: Programação orientada a objetos em C puro: o caso do htop

C e as segmentation faults

ponteiro não inicializadoerro na inicialização do objeto

ponteiro contém valor velhoproblema no gerência do tempo de vida

ponteiro contém valor inválidoerro em aritmética de ponteiros / limites

Page 41: Programação orientada a objetos em C puro: o caso do htop

Separation of concerns

Classes implementandoestruturas de dados de alto nível:

Vector, Hashtable, Stack...

Isolar código que faz "coisas complicadas"com ponteiros nessas classes

O resto do código fica simples:Vector_insert(v, 3, data);

Page 42: Programação orientada a objetos em C puro: o caso do htop

Ownership

Gerência de tempo de vida dos objetos

Cada objeto tem um dono

Geralmente é:ou quem o criouou uma coleção

Page 43: Programação orientada a objetos em C puro: o caso do htop

Coleções com ownership

Vector* Vector_new(ObjectClass* type, bool owner, int size)

Se o Vector é "owner",ele chama o método delete do Object

ao remover um elemento

(o destrutor certo é chamadograças à herança!)

Page 44: Programação orientada a objetos em C puro: o caso do htop

Estruturas de dados no htop

Vectorcada painel tem umo ScreenManager controla um Vector de Panels

HashtableprocessTableusersTable

Page 45: Programação orientada a objetos em C puro: o caso do htop

Ownership no htop

Código simétrico:Quase todos os malloc() e free() do programa

ficam em construtores e destrutores

Granularidade no controle:Quase todas as chamadas explícitas a

destrutores são para destruir alguma coleção, e não objetos individuais

Page 46: Programação orientada a objetos em C puro: o caso do htop

Um pouquinho de introspecção

RTTI (Run Time Type Information)

Page 47: Programação orientada a objetos em C puro: o caso do htop

Um pouquinho de introspecção

RTTI (Run Time Type Information)

em C:

Como nossas VTables são explícitas, podemos usá-las para identificar as classes

em tempo de execução

Útil para debugging (das coleções!)

Page 48: Programação orientada a objetos em C puro: o caso do htop

Comentários finais

Programação C precisa ser disciplinada

Page 49: Programação orientada a objetos em C puro: o caso do htop

Comentários finais

Programação C precisa ser disciplinada

OO é uma disciplina de programação

Page 50: Programação orientada a objetos em C puro: o caso do htop

Comentários finais

Programação C precisa ser disciplinada

OO é uma disciplina de programação

OO em C funciona bem e é eficiente

Page 51: Programação orientada a objetos em C puro: o caso do htop

Comentários finais

Programação C precisa ser disciplinada

OO é uma disciplina de programação

OO em C funciona bem e é eficiente

Algumas poucas macros escondem as partes mais feias e/ou repetitivas

Page 52: Programação orientada a objetos em C puro: o caso do htop

Comentários finais

Programação C precisa ser disciplinada

OO é uma disciplina de programação

OO em C funciona bem e é eficiente

Algumas poucas macros escondem as partes mais feias e/ou repetitivas

Use C se fizer sentido para os seus requisitos

Page 53: Programação orientada a objetos em C puro: o caso do htop

Reuso!

http://hisham.hm/dit/

Page 54: Programação orientada a objetos em C puro: o caso do htop

Obrigado!

Perguntas?

htop e mais em:http://hisham.hm/ @hisham_hm

Avalie essa apresentação usando o Makadu!APK do aplicativo Android:

http://www.makadu.net/makadu.apk

Estes slides são licenciados pela Creative Commons CC BY 4.0:https://creativecommons.org/licenses/by/4.0/