Pregunta

En los últimos meses he estado haciendo una transición de Java para Groovy y puedo apreciar muchos de los beneficios que aporta: menos código, los cierres, los constructores, el MOP que al final hace framework como Grails posibles, la facilidad con la burla cuando pruebas de escritura, etc.

Sin embargo, he estado “acusado” de mis compañeros de trabajo que mi código no es lo suficientemente maravilloso. Es decir, hasta ahora he anunciado tipos para mis parámetros y campos, tienden a utilizar la herencia y el polimorfismo en lugar de pato a escribir, etc. Me parece que en estas situaciones no sólo es dinámico vs estática, sino también dinámico vs paradigma orientado a objetos tipo de dilema. En aquellos casos en que todavía tienden a preferir OO. Siento que el paradigma OO tiene un gran valor en su premisa básica en lo que le permite abstraer y relacionar su código construye a determinados conceptos del mundo real.

Por lo tanto, aquí están las preguntas particulares que necesito ayudar con:

  1. ¿Debo declarar tipos para mi parámetros, campos, etc?

  2. ¿Debo declarar bloque de código como cierre cuando método sencillo va a hacer?

  3. Cuando debería utilizar la tipificación de pato en lugar de envío dinámico polimórfico. Por ejemplo, en maravilloso que puedo hacer animal "acción $" () o animal def.; animal.action (), en lugar de animal = new Dog (); animal.action (). Puedo ver el problema por primera vez en el contexto del principio abierto-cerrado, pero cualquier otra razón para preferir el polimorfismo estilo OO?

  4. Cuando debería utilizar las interfaces de maravilloso (si alguna vez)?

Estoy seguro de que hay algunos otros dilemas similares no pude escribir. También creo que estas preguntas son válidas no sólo para maravilloso, pero para cualquier otro lenguaje dinámico. ¿Cuál es su opinión?

¿Fue útil?

Solución

0.1. ¿Debo declarar tipos para mis parámetros, campos, etc?

tiendo declarar tipos de clases que se utilizan como parte de una API pública, cosas que otros desarrolladores se consume mucho, o donde me gustaría un poco de ayuda adicional de autocompletar IntelliJ. De lo contrario, 'Def' cosas.

0.2. ¿Debo declarar bloque de código como cierre cuando método sencillo va a hacer?

utilizo métodos menos que sea algo planeo pasar alrededor como una variable. A pesar de que es el operador método de eliminar la referencia "foo. & Bar", la mayoría de los desarrolladores no saben acerca de esto y están confundidos por que cuando se ejecutan a través de ella. También uso cierres cuando es una pequeña pieza de código que está claro para permanecer en un método más grande en lugar de poner en su propio método para fines descriptivos.

0.3. ¿Cuándo debo utilizar la tipificación de pato en lugar de envío dinámico polimórfica. Por ejemplo, en maravilloso que puedo hacer animal "acción $" () o animal def.; animal.action (), en lugar de animal = new Dog (); animal.action (). Puedo ver el problema por primera vez en el contexto del principio abierto-cerrado, pero cualquier otra razón para preferir el polimorfismo estilo OO?

Yo sólo uso el animal. "Acción $" () forma cuando necesito ese nivel de direccionamiento indirecto debido a que el nombre del método varía en función de la ruta de ejecución del código (con mayor frecuencia durante metaprogramming pesada). Yo uso animal = new Dog (); animal.action () cuando quiero la ayuda del IDE con terminación automática, o que el nivel de la documentación es de gran ayuda para la claridad del código (y no afectada por la verbosidad adicional que podría ser obvia o restrictiva).

0.4. ¿Cuándo debería utilizar las interfaces de maravilloso (si alguna vez)?

Muy rara vez se utilicen. Podía ver su uso principalmente como documentación de los campos esperados para una llamada a la API pública, o posiblemente como una interfaz de marcador para ayudar a distinguir un conjunto de clases de otro desde una perspectiva metaprogramming. Son mucho menos útiles en maravilloso de lo que son en Java.

Otros consejos

Esto no siempre es una opinión popular, pero creo que la más explícita y claramente a su código puede ser, mejor.

No me gusta construcciones que te dejan adivinar exactamente lo que está pasando ...

He trabajado durante un año en Ruby y no le gustó en absoluto. No estoy diciendo que no tiene lugares donde sobresale, sólo digo que realmente me gusta mantener las cosas limpias y explícito y no sentir que Ruby tenía que como un objetivo.

Una cosa que averiguar a ciencia cierta - la cantidad de escribir lo hace no equivale a la velocidad global de desarrollo. Es cierto que una base de código complicada con una gran cantidad de código repetido hace para el desarrollo muy lento, pero la simple reducción de lo que se escribe sin eliminar la duplicación es inútil, y escribiendo más largo, más clara de código, más explícito va a ser generalmente más rápido (sobre el duración del proyecto) que el mismo código escrito en un lenguaje conciso, menos formal.

Si no creer que la tipificación no tiene relación con la velocidad de desarrollo, la próxima vez que suelte un proyecto cuente el número de líneas de código y se dividen por los días-hombre usado (incluyendo la depuración y pruebas). En otras palabras, la cantidad de código que se ha escrito un día. Usted encontrará que el resultado sea un número muy pequeño -. En realidad escribir código es una parte muy pequeña de cualquier proyecto de software

Creo que con maravilloso que debe favorecer la forma más sencilla de hacer algo, y caer de nuevo en las características groovy sólo cuando la situación lo requiere. (Al igual que al escribir macros o la creación de métodos múltiples en Clojure, si usted se encuentra llegando a esas herramientas mucho que debe cuestionarse a sí mismo.) Su enfoque cauteloso parece bien a mí, posiblemente, sus compañeros de trabajo son un poco intoxicado con su nuevo poder . (No sería la primera vez.)

Lo bueno de tener un lenguaje flexible como Groovy es que puede comenzar con la cautela como si favorecen sabiendo que tiene alternativas más potentes a los que recurrir cuando los necesite. Ya sabes, "la cosa más simple que podría funcionar."

prefiriendo Más específicamente tipificación de pato a través de interfaces y sin molestarse con los tipos de parámetros parece que podría ser una buena cosa, esto hará que sea mucho más fácil para el suministro de burla a las pruebas.

Todo se reduce a lo que la gente se sienta cómodo. Me gusta usar declerations tipo y método de las llamadas porque me siento cómodo en Java. El código que escribo tiene que ser mantenido por personas con mucha experiencia a cabo la programación dinámica, así que guardo cerca de código Java normal, a menos que hay una buena razón para usar una característica maravilloso avanzada. Parece que su grupo debe crear estándares de codificación que tratan de explicar cuando se deben utilizar generalmente características de Groovy.

Hay dos tipos dominantes de lenguajes orientados a objetos.

Las lenguas en el Simula 67 de la familia, tales como C ++ y Java, favorecer a las variables de tipo estático, compiladores y enlazadores, y vtables método.

Las lenguas en el Smalltalk de la familia, tales como Ruby, favorecer a las variables de tipo dinámico, interpretación, y de paso de mensajes en lugar de la función de puntero en las tablas.

Ambos son orientado a objetos, pero muy diferentes tomas en el concepto de la orientación a objetos.

YES

-

NO

¿Se da cuenta que no hay una respuesta real a esta pregunta?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top