¿Cuál es un buen caso de uso para scala? [cerrado]

8

En un proyecto actual, hemos configurado la compilación para poder mezclar Java y Scala. Me gustaría usar más Scala en nuestra base de código para hacer que el código sea más legible y conciso. En el proceso también aprende el idioma entregando características reales.

Así que planeo usar Scala para algunas clases para mostrar sus beneficios y convencer a otros desarrolladores de que también consideren usar Scala.

Para un servidor web basado en el descanso o un programa en general, qué tipo de estructuras de código se prestan al estilo de programación funcional de Scala.

Usman Ismail
fuente
77
-1: Estoy a favor de aprender nuevos idiomas ( especialmente los idiomas que son más funcionales en estos días) ... ¿pero busco una razón para mezclar un idioma y paradigma diferente en el código de producción? Eso es un no no. Vaya con un proyecto personal, o una aplicación / utilidad / herramienta separada que la administración apruebe ... como máximo.
Steven Evers
1
El proyecto está en etapa Pre-alfa y tenemos el mandato de experimentar.
Usman Ismail el
2
@SnOrfus: "Eso es un no no": lo veo como una buena forma de trabajar con código heredado (en lugar de esperar la próxima revisión compatible hacia atrás del idioma en el que está escrito el código heredado).
Giorgio
2
Pedir una lista de cosas (como clases y casos de uso) generalmente no es una buena opción para este sitio. Sin embargo, creo que tienes una buena pregunta allí. Es posible que desee intentar reformularlo.
Karl Bielefeldt
1
Si la aplicación utiliza la concurrencia y la comunicación en gran medida, es posible que desee ver en akka.io . De lo contrario, intente escribir un ejemplo en el que haga un uso intensivo de colecciones con transformaciones complejas como filtrado, plegado, mapeo. Para esto, Scala puede ser mucho más conciso que Java.
Giorgio

Respuestas:

4

Un ejemplo típico si desea ilustrar la concisión del código funcional podría usar colecciones y sus operaciones. Por ejemplo, considere una clase Customery un método para crear una lista ordenada de nombres de clientes a partir de una lista de clientes.

Aquí está la implementación de Java:

class Customer
{
    String name;

    ... // Other attributes.
}

List<String> sortedCustomerNames(List<Customer> customers)
{
    List<String> names = new ArrayList<String>();

    for (Customer customer : customers)
        names.add(customer.name);

    Collections.sort(names);

    return names;
}

Versión Scala:

class Customer(val name: String, /* ... other attributes */)

def sortedCustomerNames(customers: List[Customer]): List[String] =
  customers.map(c => c.name).sorted

NOTA

La concisión en términos de pulsaciones de teclas no siempre es una buena medida de la calidad del código y la facilidad de mantenimiento.

Además, en general, no recomendaría cambiar de Java a Scala solo porque Scala es más reciente. Si la mayoría de los miembros del equipo están más familiarizados con Java, el equipo será mucho más productivo con Java que con Scala (o cualquier otro lenguaje de programación que no conozcan bien).

He estado aprendiendo Scala en mi tiempo libre durante aproximadamente dos años, y solo recientemente (después de asistir a un curso en línea) tuve la sensación de que puedo ser más productivo en Scala que en Java. Antes de llegar a este punto, no habría considerado usar Scala para la producción.

Giorgio
fuente
1
Conciseness in terms of keystrokes is not always a good measure of code quality and maintainabilityEspecialmente cuando se codifica en Perl.
Yannis
Este es un buen ejemplo de lo que estaba buscando, no quiero cambiar todo a scala a la vez, pero pequeñas clases de utilidad que hacen cosas obvias serían un buen lugar para comenzar. thx
Usman Ismail
1
@Usman Ismail: Otra cosa que puedes ver es las colecciones Scala. Recientemente me impresionó mucho lo que se puede hacer con Streamlos s: puede realizar búsquedas complejas de amplitud primero en un espacio de solución hasta que encuentre una solución (como encontrar una ruta de un determinado objeto a otro, con ciertas restricciones). No sé si esto es relevante para ti.
Giorgio
3

Para todos, donde sea posible o para nada, solo use Java. De esta manera esto funcionará de manera sensata. Estuve haciendo tales experimentos hace mucho tiempo, pero en tiempos posteriores reescribes todo en uno o dos idiomas (para mantener algunas cosas si eso no se puede hacer en otro idioma) solo por claridad.

Si puede declarar la clase más corta en 2 líneas de código, eso no es una ventaja, no debe usar el lenguaje para esta "característica". Por ejemplo, también puede escribir un código funcional hermoso en líneas xxx y pasar el tiempo yyy y tal vez al mismo tiempo puede escribirlo en estilo OOP en xxx + 150 líneas en el tiempo aaa-2 horas con un beneficio de rendimiento (quién sabe). Lo que quiero decir es que no es posible decir "esta parte será mejor en Scala" y "esta parte en Java". En el desarrollo no debe descubrir características, en mi opinión, solo debe desarrollar sin mezclar y pensar en la lógica general en lugar de la implementación en el lenguaje X o Y, por eso, en mi opinión, para mayor claridad y productividad, debe elegir el lenguaje para el proyecto en lugar de para la función .

cnd
fuente
No estaría de acuerdo un poco allí porque ahora hay 150 líneas de código menos para probar y tener posibles errores.
Usman Ismail
2
Las líneas de código no tienen ningún sentido. si el código perl podría ser 5 veces más pequeño que python, no significa que sea más fácil de probar y que contenga errores potenciales menores. Sí, hay algunos proyectos con perl y python mixtos, pero realmente no lo veo como una característica genial.
cnd
Su punto es válido, sin embargo, eche un vistazo al Proyecto Lombok, como un ejemplo de cómo puede reducir con elegancia la verbosidad de Java. Me preguntaba si había un beneficio similar con las características funcionales de Scala. Scala está diseñado para mezclarse con Java a diferencia de otros lenguajes funcionales como erlang, que probablemente sería una mejor opción si fuéramos completamente funcionales.
Usman Ismail el
1
Todavía no entiendo esa mezcla. Si Scala es tan bueno para ti, entonces úsalo en todas partes en tu proyecto. Eso será sensato y lo entiendo, pero usarlo para algunas funciones en algunos casos es incorrecto en mi opinión. ¿Hay alguna razón para no solo cambiar el proyecto a Scala?
cnd
@ Ash: ¿Quizás necesiten interactuar con el código heredado? En este caso, el código principal estará en Scala y el código heredado (y posiblemente algunas interfaces o envoltorios) en Java.
Giorgio
2

Sospecho que esto es una cuestión de cuán buenos son los programadores del equipo y cuánto están dispuestos a aprender cosas nuevas.

Scala es mucho más conciso y expresivo, pero igualmente más complejo. A cualquier programador que pueda hacer un buen uso de las abstracciones de alto nivel que ofrece, le gustará y será más productivo y nunca querrá volver al nivel simplificado de Java. Pero un programador que no es bueno en abstracciones de alto nivel o simplemente no quiere aprender nunca lo entenderá.

Además, no creo que deba usar ningún caso diseñado específicamente para Scala. Simplemente comience a escribir el prototipo en él y verá si es más productivo o no. Debería ser más productivo que valga la pena cambiar todo.

Y definitivamente no mezclaría los idiomas excepto por el uso de bibliotecas escritas en el otro. Comience a crear prototipos en Scala, vea qué tan bien funciona y elija uno u otro.

Jan Hudec
fuente
-2

En mi experiencia (ciertamente limitada), el caso de uso que más he visto es usarlo para tener una sensación de superioridad y engreimiento sobre sus colegas que realmente envían cosas, y / u ocultar sus limitaciones al culpar a los "anticuados e poco elegantes" lenguaje que estás "obligado" a usar en lugar del nuevo atractivo;)

ggambett
fuente
1
-1: La programación funcional es mucho más antigua que Java.
Giorgio
2
¡Hola, ese es más o menos el mismo argumento que usé cuando apareció Java por primera vez! Pero tenía 17 años en ese momento ...
Yannis
2
Por cierto, las técnicas de programación funcional tienen que ver con enviar cosas (más rápidamente), no con alardear (ver, por ejemplo, paulgraham.com/avg.html ).
Giorgio
-3? Vamos, puedes hacerlo mejor. @Giorgio, no mencioné Java en absoluto, en mi opinión también apesta :)
ggambett
@ggambett: Usted se refirió a Java indirectamente: la pregunta se refiere a la introducción de Scala (y su estilo funcional) en un entorno que utiliza Java . Su respuesta compara un "lenguaje anticuado ... que se ve obligado a usar" (¿Java?) Con el "nuevo atractivo" (Scala: ¿programación funcional?) Cuyo caso de uso más común es "tener una sensación de superioridad ... sobre tus colegas ". ¿O cuál fue el significado exacto de su respuesta?
Giorgio el