¿Qué problemas pueden surgir al emular conceptos de otros idiomas?

12

He leído muchas veces en la web que si su lenguaje no admite algún concepto, por ejemplo, orientación a objetos o quizás llamadas a funciones, y se considera una buena práctica en este otro contexto, debe hacerlo.

El único problema que puedo ver ahora es que otros programadores pueden encontrar su código demasiado diferente de lo habitual, lo que les dificulta programar. ¿Qué otros problemas crees que pueden surgir de esto?

Julio Rodrigues
fuente
3
La gente se burlará de ti, por un lado :-)
Karl Bielefeldt
Una vez traduje un analizador de funciones anidado de D a Java, pero admito que no es el código más limpio que he escrito (una gran función con una interfaz y varias clases que lo implementan definido dentro)
ratchet freak

Respuestas:

23

Uno de los problemas es que puede que te encuentres escribiendo mucho código para expresar algo de la misma manera que lo harás en otro idioma, mientras que hay una forma más directa en el idioma que usas.

Por ejemplo, en una respuesta sobre Stack Overflow , he explicado cómo los contratos de código, concepto utilizado en .NET Framework, pueden emularse parcialmente en PHP, que no los admite. Terminé escribiendo mucho código por nada, ya que lo mismo era factible con matrices simples.

En términos más generales, cada idioma tiene su propia cultura, sus mejores prácticas, su propio estilo.

  • Si empiezo a escribir código C # como si fuera C, sería feo.

  • Si aprendo a Haskell como desarrollador de Java que se vio obligado a usar Haskell, pero no quiero entender sus puntos fuertes y solo quiero clonar los conceptos de Java, el código que escribiría sufrirá.

  • etc.

No hay nada malo en tratar de mejorar el lenguaje (por ejemplo, mejorar C # mediante la introducción de unidades de medida como en F #), pero si lo está haciendo demasiado, tal vez debería elegir un idioma diferente que realmente se ajuste a sus necesidades.

Arseni Mourzenko
fuente
+1 Buena respuesta, y gracias por los términos de búsqueda adicionales al agregar unidades de medida a C # como en F #.
2
Como alguien que una vez renunció a su trabajo por verse obligado a usar Java, mis 2 centavos: uno no puede ser forzado a usar Haskell, uno se enamora de él y luego lo absorbe hasta el punto de no retorno. Haskell es como un hermoso agujero negro en el que solo quieres caer, y a diferencia de uno real, aún vives para contarlo :)
Cetin Sert
tal vez debería elegir otro idioma ... excepto cuando no tiene otra opción, como JavaScript del lado del cliente. (Aun así, no tener otra opción no es excusa para implementar la emulación OOP basada en la clase en un lenguaje prototipo. Es mucho más eficiente aprender cómo funciona el lenguaje).
Kojiro,
@kojiro: u otro trabajo. Tuve el mismo problema cuando me vi obligado a usar PHP, y constantemente intentaba modificar el lenguaje, incluso escribir mi propio compilador. Una solución menos loca fue cambiar mi trabajo y comenzar a trabajar solo en proyectos que no usan PHP.
Arseni Mourzenko
1
@Cetin Sert: de acuerdo, Haskell es un excelente lenguaje. Pero si alguien no quiere aprenderlo y no comprende la programación funcional, sería difícil apreciar a Haskell.
Arseni Mourzenko
10

La disminución de la legibilidad es un problema en sí mismo: disminuye drásticamente el grupo de personas que potencialmente podrían mantener su proyecto sin una amplia capacitación de su parte.

Adicionalmente,

  • La implementación del paradigma extranjero puede costar más que los ahorros potenciales de su uso.
  • Su adaptación de la funcionalidad externa puede ser defectuosa, lo que aumenta los costos de mantenimiento
  • Su adaptación de la funcionalidad externa puede llevar su pila de tecnología a los límites más allá de los requeridos por su implementación nativa.
dasblinkenlight
fuente
2
Una vez tuve que emular el despacho dinámico de C ++ (tablas virtuales, etc.) en vanilla C, y me encontré exactamente con este problema: los programadores de C que no entendieron el despacho dinámico no pudieron contribuir o mantener el proyecto.
tormenta el
4

No es tan buena idea como aparece en el papel.

Ejemplo 1: si tienes la edad suficiente, puedes recordar los días en que C era el niño nuevo en la ciudad. A los programadores de Pascal y Ada no les gustaban las llaves abiertas y cerradas de C. Ellos #definieron beginy endpara abrir la llave y cerrar la llave, ¡y listo! CAda! El desafortunado resultado fue feo desde la perspectiva de Ada o C.

Ejemplo 2, personal: una de las cosas que realmente me gustó del Common Lisp Object System es su método anterior, posterior y en torno. Pueden ser muy útiles en múltiples lugares. Así que emulé este concepto en C ++ en algunos lugares seleccionados. La única forma de emular estas construcciones en C ++ es exigir al desarrollador de una clase derivada que llame al método de la clase padre del mismo nombre en el lugar correcto del código. Esto puso un requisito para los desarrolladores que derivaron de mis clases que era un poco extraño para la programación en C ++, y tal vez en contra de la programación de C ++. No importa cuán bien documentado esté este requisito, las personas simplemente no siguieron las pautas porque no se ajustaba exactamente al paradigma de C ++.

David Hammen
fuente
2

¿Qué problemas pueden surgir al emular conceptos de otros idiomas?

Abstracciones con fugas.

Jim G.
fuente
Sería bueno incluir algunos detalles más en su respuesta. El artículo relata un caso en el que una abstracción no logra capturar una optimización de rendimiento significativa, pero yo diría que surgen problemas más grandes debido al comportamiento inconsistente del caso de esquina y las garantías inconsistentes; un ejemplo de esto último sería el intento de C # de emular outparámetros en un marco que realmente no los admite; C # supone que cada función siempre escribirá en todos sus outparámetros, pero los métodos que no son C # llamados por los métodos C # no ofrecen tal garantía.
supercat
1

Puede ser prohibitivamente difícil. Imagine intentar implementar LINQ desde C # en su aplicación Java. ¿O qué tal simplemente agregar cierres léxicos a un idioma? Tendría que escribir un nuevo compilador, que le da un nuevo lenguaje.

O, para los casos en los que no tiene que implementar su propio idioma, simplemente imagine tratar de implementar métodos de recopilación utilizando funciones de orden superior (como map) en un lenguaje que no tenga bloques de código o funciones lambda o cierres o funciones como primero objetos de clase Cada función de orden superior debe declararse como una interfaz e implementarse explícitamente, y todos los estados que se habrían capturado en un cierre deben almacenarse explícitamente en la clase implementadora. Es un tipeo adicional y mucho más difícil de leer, que a menudo no vale la pena.

psr
fuente