Programacion en capas ERa: Recomendación LibroProgramación

Horst von Brand vonbrand en inf.utfsm.cl
Mar Mar 9 18:37:33 CLST 2004


mmoossen en inf.utfsm.cl dijo:
> Quoting Horst von Brand <vonbrand en inf.utfsm.cl>:
> > C es el ejemplo clasico de lenguaje procedural, C++ es una extension OO
> > (bastante mal lograda) a C.

> Yo tengo entendido que una forma muy eficiente de escribir codigo C
> "puro" basado en objetos (distinto a OO, ya que no hay herencia),

Todo puede arreglarse...

>                                                                   es
> utilizando estructuras con campos que son punteros a funciones que tienen
> como primer parametro generalmente una variable de la susodicha
> estructura,

Un puntero a la estructura, mas bien.

>             el famoso "objeto" this, con lo cual se tienen en las
> estructuras los datos y los métodos que manipulan esos datos :-) creo que
> gran parte del kernel de linux esta escrito así... o me equivoco, doc?

Yep. Tiene algunas otras gracias:

- Puedes cambiar (!) la funcion invocada sobre la marcha

- Se puede arreglar facilmente el llamar "otras" funciones alrededor del
  metodo (p.ej. alguna funcion padre, etc)

- Se pueden manejar "metodos por omision": Si no hay metodo, llame a...

Tiene sus problemas. Pero funciona. En todo caso, al interior del nucleo
las mas de las veces son objetos instanciados con operaciones diferentes. O
sea, tienes algo como (de include/linux/fs.h):

   struct file_operations {
        struct module *owner;
        loff_t (*llseek) (struct file *, loff_t, int);
        ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
        ssize_t (*aio_read) (struct kiocb *, char __user *, size_t, loff_t);
        ssize_t (*write) (struct file *, const char __user *, size_t,
                          loff_t *);
        ssize_t (*aio_write) (struct kiocb *, const char __user *, size_t,
                              loff_t);
        /* etc */
   };

Y cada tipo de archivo tiene asociada una estructura de estas (llenada con
las funciones correctas del caso). Cada vez que se quiere hacer un write
llamas a la funcion write parte de esta estructura que corresponde a ese
archivo. Un archivo (struct file) es a su vez una estructura que contiene
un puntero a la struct file_operations propia a ese tipo de archivo.
Enredado y todo, uno se acostumbra; y es la manera en que tipicamente C++
internamente implementa funciones virtuales.
-- 
Dr. Horst H. von Brand                   User #22616 counter.li.org
Departamento de Informatica                     Fono: +56 32 654431
Universidad Tecnica Federico Santa Maria              +56 32 654239
Casilla 110-V, Valparaiso, Chile                Fax:  +56 32 797513


Más información sobre la lista de distribución Linux