2010-07-24 9 views
17

Recientemente, terminé de leer K & R con sus ejercicios, casi todos, y ejemplos. Estaba planeando pasar a "C++ acelerado" que me encontré con Axel Schreiner's book OOP con ANSI-C.¿Debo aprender a implementar OOP en C? ¿Hay proyectos que usan OOP en C?

Estoy intrigado y quiero aprenderlo. Pero antes de invertir tiempo en ello, quiero saber el valor de implementar OOP en C. Para poder decidir cuánto tiempo debo dedicarle.

  1. Implementando OOP en C, ¿realmente se usa? ¿O es solo para ejercicio mental?
  2. ¿Hay algún proyecto de C existente que use OOP?
  3. ¿Cuándo es una buena idea usar OOP en C?
  4. ¿Debo invertir mi tiempo en ello?

Creo que es apropiado que mencione mi experiencia aquí para que ustedes puedan guiarme de una mejor manera. Terminé la teoría C, C++, Java y OOP hace aproximadamente un año, también obtuve un trabajo. Pero entonces, el blog Joel's y SO me hizo darme cuenta de que me faltan muchas cosas. Así que recogí los libros nuevamente y comencé a estudiarlos adecuadamente.

K & R, C++ acelerado, Algoritmo en C++ y algunos otros libros son mi intento de mejorar mis habilidades. No soy nuevo en OOP.
¿Qué sugerirías?

Gracias por su tiempo.

+1

Hay algunos realmente grandes respuestas aquí que estoy totalmente de acuerdo con! –

Respuesta

14

OO se usa en C tantas veces como sea necesario. En general, no estoy de acuerdo con la opinión de que uno no puede hacer OOP en C, tan pronto como proporcione el conjunto de funciones que operan en un tipo dado que tiene OOP. Tome por ejemplo, decide crear una estructura de datos. Si proporciona funciones para crear, agregar, eliminar y encontrar elementos de la estructura de datos, es OO. En general, otros lenguajes proporcionan azúcar sintáctica al implicar automáticamente una variable de instancia y un alcance en varias propiedades de esa instancia automáticamente.

  1. En cuanto a "es realmente usado", la respuesta es sí. No es para ejercicio mental, es un paradigma válido en C.
  2. El mejor ejemplo que se me ocurre es GObject, utilizado por GLib, GTK + y muchos proyectos no relacionados con GNOME. GObject proporciona una forma de crear objetos en C. Sin embargo, no es necesario utilizar soporte de terceros para tener OO en C. Muchos proyectos existentes lo tienen, aunque puede no estar presente en la interfaz (algo grandioso en mi opinión), y utilizado internamente para diversos fines (limpieza, protección de datos, todas las justificaciones OO habituales).
  3. Es una buena idea usar OOP en C cada vez que encuentre la necesidad de agrupar comportamientos y/o datos. Cuando puede justificar el pequeño gasto sintáctico adicional al usar su interfaz de objetos, y el tiempo invertido en no completar su solución. No te desvíes del camino.
  4. No debe perder tiempo aprendiendo OO porque cree que es superior, más bien debería complementar sus futuras soluciones, y debe agregarlo a su kit de herramientas. Úselo cuando parezca lo correcto. Familiarícese con cómo se hace OO en C, la mejor manera sería hacer algo de C++, o examinar cualquier proyecto bueno que use un pequeño O-estilo C. Te parecerá natural después de eso.
4

He tenido experiencia con varios proyectos avanzados de C que hacen al menos algo de OOP. El más conocido es el kernel de Linux.

El kernel es completamente C (excepto para piezas específicas de la plataforma en ensamblaje para interfaces de hardware).

El núcleo hace un uso intensivo de estructuras con punteros a funciones en muchos lugares. Lo primero que viene a la mente son los sistemas de archivos. Los controladores completan la estructura file_operations (y muchas otras) con devoluciones de llamadas a sus implementaciones específicas.

El núcleo también hace un gran uso de las declaraciones goto que en algunos contextos pueden considerarse como declaraciones de arrojo rudimentarias que llevan una etiqueta al final de la función para hacer una limpieza y salir. (Aunque también usan goto para mucho más que el manejo de errores, y también solo se usa para "excepciones" dentro de una función, no para pasarlas al exterior.)

+0

+1 por mencionar kernel de Linux, un gran ejemplo, que olvidé mencionar. –

3

Hay personas que dicen que puede escribir un objeto código orientado en cualquier idioma, y ​​también hay personas que dicen que puede escribir código horriblemente desestructurado en cualquier idioma.

El idioma real "OO" le proporciona un puñado de mecanismos para implementar el diseño de OO: los lenguajes tienen conceptos incorporados para objeto y/o clases, para encapsular código con datos, para herencia, etc. C básicamente no tiene nada de esto, pero no hay nada que te impida hacer la programación OO en C, dadas algunas técnicas y autodisciplina (como tu libro seguramente te dice).

¿Pero quieres tú?

Mi opinión es esta: si solo está aprendiendo a hacer programación OO, podría tener más sentido aprender esto mientras es "sostenido por la mano" por un lenguaje que ya incorpora profundamente los conceptos. Un lenguaje bien estructurado, simple e interactivo sería bueno para esto: Dada una opción libre, recomendaría Ruby, Python o Groovy. Dado un lenguaje con OO "magia" incorporada, se vuelve muy obvio cuando estás haciendo OO cosas y cuando estás siendo estructurado, disciplinado y bien organizado. También puede haber cosas que aprender al pasar de C a otro idioma: las similitudes, las diferencias.

Algunas personas recomendarían aprender C++ como la progresión natural de OO desde C. No apoyo esto de todo corazón, porque considero que C++ es un feo complemento de las capacidades de OO en un lenguaje que ya era más "práctico" que elegante. Al pasar de la programación C "estándar" a la programación OO, creo que un programador debería considerar alejarse de la manipulación directa de punteros, por ejemplo, y ciertamente me resultaría oneroso tener que administrar la memoria para mis datos. Los lenguajes OO modernos automatizan esto para que un programador tenga más células cerebrales sobrantes para tareas de mayor nivel. El atractivo de C++, por supuesto, es la velocidad bruta. Debido a que puede caer al mismo nivel casi metálico que C, por lo general es el "más rápido" de los lenguajes OO.

Todo lo dicho: si tienes un proyecto grande donde el idioma requerido es C y quieres usar y practicar técnicas de OO, entonces ¡adelante! Si no es así, puede beneficiarse de aprender OO en un entorno que fomenta y apoya esto, y tal vez más tarde volver a C con su conocimiento de OO. Las técnicas que se enseñan en el libro tendrán sentido para usted en ese momento, y estará en una mejor posición para decidir si realmente desea hacer esto en C o en un idioma de OO "real".

+2

Si está administrando su propia memoria en C++, seguramente lo está haciendo mal. Para eso es RAII. – Puppy

+0

Debo admitir que perdí la pista de C++ hace unos 10 años. Tengo "Accelerated C++" de Koenig y Moo en mi estante, y la mitad trata de cómo limpiar tus objetos una vez que terminas con ellos. Esto parece ser anterior al 'estándar :: std :: auto_ptr' de la Biblioteca Estándar, porque el resaltado del texto parecía ser sobre cómo construir sus propios indicadores inteligentes.Pero, ¿estos punteros inteligentes estandarizados eliminan todo o la mayoría de las posibilidades de disparar con el pie con la fuga de objetos? –

+1

+1 para mostrar qué tan feo es C++ :) –

6

¿Implementando OOP en C, realmente se usa? ¿O es solo para ejercicio mental?

Sí, es realmente utilizado, pero no es sorprendente que no sea tan común como OOP en los idiomas que fueron diseñados para ello.

¿Hay algún proyecto de C que utilice OOP?

puedo recordar el uso de un par:

Cuando se trata de una buena idea utilizar programación orientada a objetos en C?

Algunos problemas están muy bien modelados por OOP. Las GUI, por ejemplo, a menudo se diseñan con herencia entre tipos de ventanas, usando polimorfismo para anular y especializar el comportamiento.

Debe usar OOP cada vez que su problema tenga una hermosa solución OOP. ¡Con la nota al pie que no debe pegar 100 líneas de código OOP en un proyecto de 15000 líneas, simplemente porque es "kewl"! :)

¿Debo invertir mi tiempo en ello?

Eso realmente depende de lo que planeas hacer con él. Nunca recomendaría no aprender nada; es genial exponerse a cómo, por qué y cuándo usarlo. Es genial ver un lenguaje que no fue diseñado para OOP support OOP. Usted lee el libro, por lo que asumo que tiene cierta afinidad con C e interés en OOP. Dale una oportunidad, tal vez juntar algunas aplicaciones de GUI en GTK +. Por otro lado, si está buscando convertirse en el próximo desarrollador web maestro de patrones de diseño, probablemente no sea el mejor enfoque, puede considerar otros idiomas que estén más enfocados hacia esa área.

¿Qué sugeriría usted?

Le sugiero que utilice las mejores herramientas a su disposición que se ajustan a los problemas que está tratando de resolver. Decide qué problema vas a resolver. Una aplicación de escritorio GUI, un servidor web, un juego, una utilidad de línea de cmd ... una vez que decida sobre su problema, podrá decidir mejor qué tecnología se adapta para desarrollar una solución. Descubrí que no puedes dominar nada con "juguetes", por lo que debes estar haciendo algo real.

0

Puede serlo, pero sin las llamadas de función de tiempo de destrucción proporcionadas por otros lenguajes OOP, no es tan útil. Además, si necesita OOP, siempre hay C++, donde su código es prácticamente portátil al instante.

+4

Pero C++ sux .... –

+0

@Matt Joiner: Solo si no sabes cómo usarlo. – Puppy

+1

No es solo sux si sabes cómo usarlo. Si no lo hace, en lugar de eso lo admira. Además, si chupas, entonces piensas que es sux. Pero ese no soy yo;) –