2010-10-11 11 views
5

Por lo tanto, a mi entender (uno de) los mayores alicientes de Obj-C es el tiempo de ejecución dinámico de transmisión de mensajes.¿Ventajas dinámicas de Objective-C en el desarrollo de Cocoa?

¿Cómo es esta y otras características en general beneficiosas para el desarrollo de Cocoa? ¿Por qué se utilizó Obj-C para Cocoa dev y no C++/C?

Básicamente, estoy tratando de entender cómo estas características de lenguaje son realmente beneficiosas en términos de cuando realmente se resuelve un problema en particular en términos de aplicación OSX o iOS.

+0

Permítanme aclarar: si se implementara Cocoa en C++ o Java, ¿las características del marco serían sustancialmente diferentes? o simplemente no es posible? – Maverick

Respuesta

7

Las piezas principales de los marcos de Cocoa son difíciles (no imposibles, por supuesto) en idiomas menos dinámicos. La codificación de valores clave (que hace uso del despacho dinámico y la clase de tiempo de ejecución y la modificación de la jerarquía) es muy difícil de hacer en los lenguajes en tiempo de compilación (llamadas a métodos). La síntesis de los captadores/ajustadores de atributos de Core Data es un ejemplo similar de la mensajería dinámica de Objective-C (y el tiempo de ejecución dinámico) que facilita las cosas.

La mensajería dinámica de Objective-C se diseñó específicamente para resolver el problema de dependencia en proyectos grandes. Mientras que un lenguaje en tiempo de compilación como C++ requiere que los módulos dependientes se vuelvan a compilar juntos, la mensajería en tiempo de ejecución de Objective-C significa que usted no debe siempre tener que volver a compilar todo. En el momento de la decisión de NeXT de utilizar Objective-C más (el, en ese momento, C++ inmaduro), ese fue un factor importante en la cordura del desarrollador. Todavía hace que los sistemas grandes sean más fáciles de administrar (aunque, de nuevo, ciertamente no es imposible en C++ o Java o ..., mucho más difícil).

+2

La vida útil del puente Cocoa-Java y la prevalencia de KVO/KVC son completamente ortogonales ... – bbum

+0

@bbum, gracias por el conocimiento interno. Había escuchado (aunque nunca oficialmente) que cosas como KVO eran demasiado difíciles en el puente de Java. ¿Alguna posibilidad de que nos ilumines sobre los motivos de su desaprobación? –

0

Mis dos centavos:

  1. herencia simple: reduce el acoplamiento de las clases, sin embargo, algunos (me incluyo) sólo piensa que es un handicap.
  2. Tiene protocolos: C++ no.
  3. Sistema de mensajería: no es una ventaja, pero es diferente del uso de sintaxis de punto en C++.
  4. Conjunto súper estricto de C: C++ es casi todo un conjunto súper de C.
  5. Puede usar Objective-C++ que le da el poder de C++ con Objective-C.
+0

En C++ normalmente usaría herencia múltiple para implementar una interfaz (protocolo aka). – Ferruccio

0

He estado usando C++ y Objective-C++ extensivamente. Mi opinión es que el sistema de mensajería resuelve muchos problemas. Muchos patrones de diseño/hacks en C++ son triviales en Objective-C.

El único problema es que el sistema de mensajes (corrígeme si me equivoco) es inseguro porque los mensajes se pasan como texto. También parece mucho más fácil invertir la ingeniería de un programa objetivo-c.

+2

Los selectores incluyen un nombre textual (la parte 'initWithFoo: bar: baz:'), pero los argumentos se pasan igual que a una función C (porque la implementación del método * es * una función C). No estoy seguro de lo que quiere decir con "el sistema de mensajes ... es inseguro". Tiene razón en que las clases de Objective-C son muy fáciles de aplicar ingeniería inversa; todo lo que necesitas es volcado de clase. –

+0

¿Algún ejemplo de patrones de diseño/hacks que son triviales en Obj-C sobre C++? – Maverick

+0

Los mensajes no se pasan como texto. El envío de mensajes consiste en buscar punteros para codificar en las tablas de métodos, presionar los parámetros en la pila y luego llamar a un puntero de función. – NSResponder

-3

La respuesta a tu pregunta no es técnica, sino histórica.

Steve Jobs abandona Apple y funda NExT basado en Objective C un nuevo lenguaje dinámico optimizado orientado a objetos - un gigante mejora a C, luego vuelve a Apple y Apple compra NExT y utiliza su núcleo para diseñar MAC OS X. MAC Los frameworks OS X e iOS están construidos en Objective-C.

Ahora, para los detalles técnicos es una cuestión diferente.

La tipificación dinámica, por ejemplo, presenta un arcoiris de potencial programático, pero requiere una gran cantidad de depuración desde el tiempo de compilación hasta el tiempo de ejecución, es decir, como el lenguaje es flexible, permite ejecutar aplicaciones que no son necesariamente concisas y/o coherente.

Por otro lado, Java resuelve todos los problemas de la búsqueda de Objective-C y le proporciona un lenguaje no dinámico con introspección, lo que le permite todo el poder del tipado dinámico y mantener un conjunto de reglas muy rígidas que lo alivia % de tu tiempo de depuración.

C y C++ son lenguajes malas del pasado
de Objective-C es un buen lenguaje del pasado
Java/C# son lenguas modernas

Se trata de ser un descenso a los infiernos que venir de una amplia Java/C# programando y teniendo que lidiar de nuevo con compiladores más descuidados para trabajar con ObjC, pero bueno, esa es mi penalización por querer desarrollar para el iPhone.

+3

Esto es una diatriba sin sentido contra Objective-C, no una respuesta a la pregunta hecha. ¿Qué significa "ya que el lenguaje es flexible, deja que te vayas con la ejecución de aplicaciones que no necesariamente son concisas y/o coherentes", se supone que significa de todos modos? Tal vez deberías pasar un poco más de tiempo con el lenguaje en práctica antes de juzgarlo. –

+0

No, no es absurdo ni despotrica. Si ves mi publicación como una agresión hacia ObjC, perdiste mi punto por millas, y lo lamento. Sin embargo, eso no significa que no haya varios defectos de diseño en ObjC cuando se mira la perspectiva actual y el conocimiento de los lenguajes de cómputo y compiladores. Lo que dije no es una mera opinión, algo menos que una extrañada, es un hecho experimentado y eso es independiente de que sea un foro de ObjC con programadores de ObjC. –

Cuestiones relacionadas