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