Cita:
Iniciado por detective_jd Hey agleiva pensé un poco en tus palabras, me gustaría saber para vos que debe tener un framework para que digas "esto es genial"
Hablando puntualmente del ORM, fijate
aca la simplicidad, claridad y flexibilidad que le da LINQ a NHibernate (que es la version .NET/C# de Hibernate). En java no existe tal cosa, ni puede existir debido a muchas limitaciones del lenguaje en sí:
- Los generics de java no existen en runtime, por lo tanto no se puede hacer algo que dependa o necesite información del tipo T al momento de ejecutarse.
- java no tiene una forma eficiente de hacer introspección de las expresiones en runtime (lo que hace System.Linq.Expressions en C#), por lo tanto no puede "traducir" las expresiones on-the-fly para generar, por ejemplo, SQL. Nótese que la generación de SQL en particular la realiza Hibernate, pero LINQ es un concepto más amplio y no solamente se usa para esto: existe LINQ to XML, LINQ to Excel, LINQ to Objects, etc, etc.
- java no tiene Extension Methods, con lo cual la apariencia de "fluent API" no es tan fácil de lograr en java con la flexibilidad que tiene LINQ, que principalmente se compone de extensiones de IQueryable<T>.
- java no tiene properties, con lo cual el código es menos estético y mas molesto de leer (Edad en C# vs getEdad() en java). Esto puede parecer trivial pero sumado a las demas deficiencias de java hace que el código en general se vea horrendo.
- java no tiene inferencia de tipos locales, con lo cual el "var" no es posible, y se requiere repetir el tipo de algo que ya se conoce de antemano ya que depende puramente del tipo de la expresión del lado derecho de la asignación (var mayoresDeEdad = ... se convertiría innecesaria y estúpidamente en List<Persona> mayoresDeEdad = ... en java.
Hablando más en general:
- veo que las APIs de java de casi cualquier framework requieren instanciar una enorme cantidad de clases para todo, cuando en lenguajes modernos se resuelven de formas mucho más prácticas (usando funciones, por ejemplo). Cualquier clase que veas en java que tiene solo un método, se hubiera reemplazado por una función en un lenguaje decente. Esto tiene un impacto enorme en todos lados, y genera el famoso bloat que vemos en los frameworks de java que están llenos de "Providers", "Factories" y otro tipo de clases que existen meramente para compensar las falencias del lenguaje, y proveer abstracciones e indirecciones en el "Reino de los sustantivos" de java.
- también veo un excesivo uso de "MyClase.class" en todos lados en java, y esto también es para compensar falencias del lenguaje. En C#, por ejemplo, casi nunca ves un método que requiera un parámetro del tipo System.Type (el equivalente a XXX.class), porque en general estos son reemplazados por métodos genéricos. Por ejemplo IKernel.Get<T>() en lugar de IKernel.Get(Type t). Esto hace que el código que consume esos métodos sea mucho más limpio y claro, pero en java no se puede hacer por una limitación del lenguaje.
- La dicotomía estúpida entre "tipos primitivos" y "objetos" en java también aporta a que las APIs sean malísimas. En C#, cualquier clase genérica o método genérico que recibe un tipo T soporta tanto Value Types (mal llamados "primitivos" en java) o Reference Types (clases). En java esto no sucede, y tenés casos de APIs que tienen varios overloads para los diferentes primitivos y uno más para los objetos. IntStream y mapToInt() en java son ejemplos de esto. En LINQ es exactamente igual hacer un .Select(x => 5) que un .Select(x => new Persona()).
Cita:
Iniciado por detective_jd Pero ten en cuenta que eso lo estoy haciendo sólo, JPA e Hibernate y compañia son varios los que trabajan en un desarrollo, y además si supiera de alguien que le interesa hacer esto conmigo, con mucho gusto acepto la ayuda.
Yo te diría una vez más que no pierdas tiempo en tratar de inventar la rueda. Mucha gente con mayor conocimiento que vos y yo ya lo ha hecho en el pasado, y el resultado son los frameworks que usamos hoy por hoy. Si no te convencen los frameworks de java (como a mi) la solución es usar otro lenguaje, ya que esos frameworks son lo mejor que se puede obtener con un lenguaje tan limitado. Al pobre diablo que tuvo que escribir Hibernate no le quedó más opción que adaptarse a las limitaciones (o cambiarse a otro lenguaje).
Cita:
Iniciado por detective_jd Y de la multiplataforma que dije fue de los S.O (Windows, Linux y MAC OS) no de los lenguajes de programación..
Dijiste
Cita:
Iniciado por detective_jd además Java es Multiplataforma cosa que C# no lo es
Cuando la verdad es exactamente lo contrario. Te invito a nombrarme una plataforma sobre la que C# no pueda correr. Yo puedo nombrar al menos 2 en las que java no puede correr: iOS y Windows UWP (que se usa en las tabletas por ejemplo).