2010-04-29 10 views

Respuesta

12

También puede escribir código orientado a objetos en C. No obtiene todos los objetos C++ y es feo, y tiene que pasar manualmente este puntero (He visto self utilizado para esto, con el fin de hacerlo compatible con C++), pero funciona. Por lo tanto, técnicamente, no necesita un estado global en lenguajes procesales puros por las mismas razones por las que no lo necesita en lenguajes orientados a objetos. Solo tiene que pasar el estado explícitamente, en lugar de implícitamente como en los lenguajes OO.

+4

No es feo si lo haces bien. +1 porque de lo contrario estás en el lugar. –

+0

Estoy de acuerdo; la emulación de OO es una forma de evitar el problema del estado global; pero ¿qué tal un programa escrito en un estilo puramente de procedimiento? – gn22

+0

http://www.jetcafe.org/jim/highlowc.html –

2

Por supuesto. Simplemente declare un struct en algún lugar, asigne memoria, pase el puntero a la memoria asignada a una función de inicialización y listo. Simplemente pase el puntero a todas las funciones que requieren el uso de la estructura.

Aunque la pregunta que surge es donde se almacena el puntero a los datos que no desea ser global, y luego usted puede terminar con un puntero mundial ;-)

0

Puede tener variables en la pila o en montón que existirá durante toda la vida del programa.

Pasar punteros de estructura de estilo de objeto a cada función es una buena manera de tener el estilo de codificación OO C.

(sugeriría a echar un vistazo en las fuentes de Linux)

3

Todo OO es un estado mental y un montón de apoyo compilador.

Puede lograr casi lo mismo mediante la disciplina, las convenciones de codificación y el paso de estructuras en la mayoría de los idiomas.

Por ejemplo, solía tener funciones/procedimientos prefijados con su identidad de módulo, tomando el primer parámetro como la estructura de módulo relacionada.

// System.h 

typedef struct _System 
{ 
    struct _System *owner; 
    LinkedList *elements; 
} System; 

// System.c 

int System_FindName (System * system, char *name) 
{ 
.. 
} 

etc ..

yo realmente serio no les gusta tener que volver a codificar como esto sin embargo. Estoy muy feliz de no haber tenido que escribir y depurar una lista vinculada durante al menos 18 años. En aquel entonces era difícil sin internet y estaba allí sentado en la esquina de una habitación fría y bien iluminada con fósforos verdes que ardían en la retina ...

+1

En una charla reciente, Alan Kay mencionó un programa de 1953, que utiliza casi todo lo que reconoceríamos hoy como un "objeto". Obviamente, dado que los lenguajes OO no se inventaron hasta 1962, esto no fue escrito en un lenguaje OO. De hecho, dado que los primeros * lenguajes de programación * no se crearon hasta 1957 (ignorando Plankalkül), esto no estaba escrito en ningún lenguaje de programación * en absoluto *, estaba escrito en ensamblador o incluso en código de máquina. Realmente * puedes * escribir OO en cualquier idioma. –

+0

+1 de otro superviviente de fósforos verdes e incautación de iluminación fluorescente. –

6

Como ejemplo, observe cómo funciona el archivo de E/S en el La biblioteca estándar C funciona con el puntero a FILE objetos que son (en gran medida) opacos. O mire cómo las API de OS se ocupan de los identificadores y de cómo encapsular la información. Un programa crea objetos, utiliza API que actúan sobre esos objetos y cierra/elimina los objetos, todo usando C. C.

0

Puede intentar, por ejemplo, crear con dia (la herramienta de diagramación), una clase simple (para ejemplo, un cuadrado).
http://projects.gnome.org/dia/
http://dia-installer.de/index_en.html

A continuación, puede transformar esa clase en código C utilizando dia2code:
http://dia2code.sourceforge.net/

En concreto, dice que ha creado la plaza de clase dentro del diagrama de square.dia.A continuación, se escribe:

$ dia2code -t c square.dia 

... y verá que es posible convertir cualquier programación orientada a objetos en un programa de C sin variables globales. Explore los archivos creados square.c y square.h

NOTA: en Windows, necesitará una solución para hacer que dia2code funcione. Antes de usar dia2code, cambie square.dia a square.zip, descomprímalo y cambie el nombre del resultado como square.dia

0

Simple. Siempre que un procedimiento acceda a una variable global, en su lugar presente esta variable como un argumento para el procedimiento, ya sea por valor o por referencia o por puntero, o por lo que sea que proporcione su lenguaje de programación. Después de eso, ya no hay necesidad de que la variable sea global.

3

Una variable global no es más que un argumento de procedimiento implícito. Hazlo explícito y la variable global desaparece.

Nota: el hecho de que ya no utiliza una variable de mundial no quiere decir que ya no utiliza mundial estado! Lo que hicimos anteriormente fue solo una transformación puramente sintáctica, la semántica del programa no ha cambiado en absoluto. Es igual de no composable, no modular, no seguro para hilos, no paralelizable como lo era antes.

+2

+1 para hacer la distinción importante entre sintaxis (variable global) y semántica (estado global). –