2010-08-31 10 views
11

En Java y C++ la jerarquía de objetos del programa de diseño es bastante obvia. Pero a partir de Scala me resultó difícil decidir qué clases definir para emplear mejor las instalaciones sintácticas de azúcar de Scala (una idea incluso sobre cómo debería diseñar para un mejor rendimiento). ¿Alguna buena lectura sobre esta pregunta?¿Puede sugerir alguna buena introducción al diseño de filosofía y programas de Scala?

+0

Diría que cualquier jerarquía de clases que sea "obvia" en Java o C++ debería ser igual en Scala. Sin embargo, eso no es realmente una cuestión de su notación, que no es tan radicalmente diferente de ninguno de ellos. –

Respuesta

7

He leído 4 libros en Scala, pero no he encontrado lo que estás pidiendo. Supongo que ya leyó "Programación en Scala" de Odersky (Artima). Si no, este es un enlace a la versión en línea:

http://www.docstoc.com/docs/8692868/Programming-In-Scala

Este libro da muchos ejemplos de cómo construir modelos orientados a objetos en Scala, pero todos los ejemplos son muy pequeñas en número de clases. No conozco ningún libro que le enseñará cómo estructurar sistemas a gran escala utilizando Scala.

  • imperativo de la orientación a objetos tiene existido desde Smalltalk, así que sabe mucho acerca de este paradigma.
  • funcional orientación a objetos por otro parte, es un concepto bastante nuevo, por lo que en unos pocos años espero libros describir sistemas FOO gran escala para aparece. De todos modos, creo que el libro PiS le da una imagen bastante buena cómo se puede armar las bloques de construcción básicos de un sistema, como patrón de la fábrica, la forma de sustituir el patrón Estrategia con la función literales y así sucesivamente.

Una cosa que Viktor Klang una vez me (y algo que realmente están de acuerdo) dijo es que una diferencia entre C++/Java y Scala OO es que se define mucho más clases (más pequeños) cuando se utiliza Scala. ¿Por qué? ¡Porque tú puedes! El azúcar sintáctico para el case class da como resultado una penalización muy pequeña para definir una clase, tanto en tipeo como en legibilidad del código. Y como saben, muchas clases pequeñas generalmente significan mejores OO (menos errores) pero peor rendimiento.

Otra cosa que he notado es que utilizo mucho más el patrón de fábrica cuando trato con objetos inmutables, ya que todos los "cambios" de una instancia dan como resultado la creación de una nueva instancia. Gracias a Dios por el método copy() en el case class. Este método hace que los métodos de fábrica sean mucho más cortos.

No sé si esto lo ayudó en absoluto, pero creo que este tema también es muy interesante, y también espero más literatura sobre este tema. ¡Salud!

1

No creo que haya muchos tutoriales para esto.Yo te sugeriría que se quede con la forma en que lo hace ahora, sino mirar a través de código Scala "idiomática", así y de prestar especial atención en los siguientes casos:

  • clases de casos de uso o caso, los objetos en lugar de las enumeraciones u "objetos de valor"
  • uso de objetos para embarazos únicos
  • si necesita un comportamiento "dependiendo del contexto" o funcionalidad de la dependencia de inyección similar, el uso implícitos
  • la hora de diseñar una jerarquía de tipos o si se puede factorizar las cosas de una clase concreta, use rasgos cuando sea posible
  • Granulos finos las jerarquías de herencia están bien. Tenga en cuenta que usted tiene de coincidencia de patrones
  • conocer el patrón "Pimp mi biblioteca"

y pedir a todas las preguntas que usted siente que necesita para entender un cierto punto. La comunidad de Scala es muy amable y servicial. Sugeriría la lista de correo de Scala, Scala IRC o scala-forum.org

4

Esto sigue siendo un asunto en evolución. Por ejemplo, el recién lanzado Scala 2.8.0 trajo soporte de la tipo constructor de inferencia, que habilitó un patrón de clases de tipo en Scala. La biblioteca Scala en sí misma acaba de comenzar a usar este patrón. Ayer me enteré de un nuevo módulo de Lift en el que intentarán evitar la herencia a favor de las clases de tipos.

Scala 2.8.0 también introdujo implícitos de prioridad más baja, además de los parámetros predeterminados y nombrados, los cuales se pueden usar, por separado o juntos, para producir diseños muy diferentes de lo que era posible antes.

Y si vamos back in time, observamos que otras características importantes no son tan viejo ya sea:

  • Extractor métodos de clases de casos objeto compañeros fueron introducidas febrero de 2008 (antes de eso, la única manera de hacerlo la extracción en las clases de casos se realizó mediante la coincidencia de patrones).
  • Lazy valora y Los tipos estructurales donde introdujeron julio de 2007.
  • Abstract tipos soporte para constructores de tipo se introdujo en mayo de 2007.
  • Extractores para las clases no de casos se introdujo en Enero de 2007.
  • Parece que parámetros implícitos solo se introdujeron en marzo de 2006, cuando reemplazaron el modo vistas fueron implementadas.

Todo eso significa que todos estamos aprendiendo a diseñar el software de Scala. Asegúrese de confiar en los diseños probados de paradigmas funcionales y orientados a objetos, para ver cómo se usan las nuevas características en Scala en otros lenguajes, como Haskell y las clases de tipo o Python y los parámetros predeterminados (opcionales) y nombrados.

Algunas personas no les gusta este aspecto de Scala, otros lo aman. Pero otros idiomas lo comparten. C# agrega funciones tan rápido como Scala. Java es más lento, pero pasa por cambios también.Agregó genéricos en 2004, y la próxima versión debería traer algunos cambios para apoyar mejor la programación concurrente y paralela.

+0

¡Encantado de escuchar su punto de vista en este asunto, este es realmente un momento emocionante en el tiempo! Solo hay una cosa que me preocupa, la parte de reemplazar la herencia con clases de tipos. Al utilizar la herencia como un método "estándar" para construir sistemas Scala, nos basamos en un patrón que los programadores hoy conocen bien. Avanzar hacia las clases de tipo haría que el paso de Java a Scala sea más difícil, o? –

+0

@olle La herencia es bien conocida y ampliamente utilizada indebidamente. No es solo que yo diga eso: todos los gurús de OO tienen fuertes recomendaciones sobre cómo usar la herencia. Usar clases de tipo no es muy diferente de usar interfaces, y nadie tuvo el menor problema con ellas. –

+0

Probablemente esté en lo cierto al decir que OO está siendo mal usado y todo. Pero no estoy convencido de que las clases de tipos no agreguen más leña al fuego "Scala es demasiado difícil". –

Cuestiones relacionadas