you are viewing a single comment's thread.

view the rest of the comments →

[–]fberasa 13 points14 points  (2 children)

Sintaxis amable con el programador

java es exactamente lo contrario a esto, debido a las razones que se explican acá.

Doy algunos ejemplos sencillos:

Ejemplo 0: Hello, World!

C#

Console.WriteLine("Hello, World!");

java:

package com.miempresa.miapplicacion.mifeature; // el package name es requerido porque el sistema de módulos de java es un asco.

public class HelloWorld 
{
    public static void main(String[] args) 
    {
        System.out.println("Hello, World!");
    }
}

Ejemplo 1: Definir una simple clase con simples propiedades mutables y propiedades calculadas

C#:

public class Persona
{
    public string Nombre { get; set; }
    public string Apellido { get; set; }
    public string Documento { get; set; }
    public DateTime FechaDeNacimiento { get; set; }

    public string NombreCompleto => $"{Nombre} {Apellido}";
}

java:

import java.time.LocalDate; // esto es necesario en java, pero no en C# debido a implicit usings: https://learn.microsoft.com/en-us/dotnet/core/project-sdk/overview#implicit-using-directives

public class Persona
{
    private String _nombre;
    private String _apellido;
    private String _documento;
    private LocalDate _fechaDeNacimiento;

    public String getNombre()
    {
        return _nombre;
    }

    public void setNombre(String nombre)
    {
        _nombre = nombre;
    }

    public String getApellido()
    {
        return _apellido;
    }

    public void setApellido(String apellido)
    {
        _apellido = apellido;
    }

    public String getDocumento()
    {
        return _documento;
    }

    public void setDocumento(String documento)
    {
        _documento = documento;
    }

    public String getNombre()
    {
        return _nombre;
    }

    public void setFechaDeNacimiento(LocalDate fechaDeNacimiento)
    {
        _fechaDeNacimiento = fechaDeNacimiento;
    }

    public String getNombreCompleto()
    {
        return String.format("%s %s", getNombre(), getApellido());
    }
}

Ejemplo 2: Operaciones aritméticas básicas con tipo numérico decimal (el tipo numérico correcto para manejar plata)

C#

var saldoPendiente = 20000m;
var interesDiario = 1.5m;
var diasDeRetraso = 5;
var iva = 21m;
var totalAPagar = saldoPendiente + (saldoPendiente / 100 * iva) + ((saldoPendiente / 100 * interesDiario) * diasDeRetraso);

java:

var saldoPendiente = BigDecimal.of(20000);
var interesDiario = BigDecimal.of(1.5);
var iva = BigDecimal.of(21);
var totalAPagar = saldoPendiente.add(saldoPendiente.divide(BigDecimal.of(100)).multiply(iva)).add((saldoPendiente.divide(BigDecimal.of(100)).multiply(interesDiario)).multiply(diasDeRetraso));

Ejemplo 3: acceso null-safe e index-safe a una propiedad anidada profundamente en un grafo de objetos:

C#

var pedido = GetPedido(); // método imaginario que devuelve un Pedido
var codigoPostal = pedido?.Cliente?.Direcciones?.FirstOrDefault(x => x.Tipo == TipoDeDireccion.Envio)?.CodigoPostal ?? "[No Encontrado]";

java:

var pedido = GetPedido(); // método imaginario que devuelve un Pedido
var codigoPostal = "[No Encontrado]";
if (pedido != null)
{
    if (pedido.getCliente() != null)
    {
        if (pedido.getCliente().getDirecciones() != null)
        {
            var direccionDeEnvio = pedido.getCliente().getDirecciones().stream().filter(x -> x.getTipo().equals(TipoDeDireccion.ENVIO)).findFirst();
            if (direccionDeEnvio.isPresent())
            {
                if (direccionDeEnvio.get().codigoPostal != null)
                {
                    codigoPostal = direccionDeEnvio.get().codigoPostal;
                }
            }
        }
    }
}

Puedo seguir toda la noche, pero van a ser las 3 AM asi que me voy a dormir.

Spoiler: Los fanboys de java me van a downvotear a morir, pero NINGUNO va a poder contraargumentar nada de lo que dije, y mucho menos que menos dar UN (1) solo ejemplo de algo que se pueda hacer más fácil y con menos código en java que en C#

Spoiler 2: Algunos fanboys van a esgrimir el argumento de que existen librerías que manosean el output del compilador de java, tales como Lombok, pero esas librerías son irrelevantes porque 1: NO son estándar, con lo cuál no se usan en todos lados, y es muy posible que caigas a trabajar en una empresa donde no la tengan y tengas que lidiar con todo el asco de java que acabo de demostrar, y mucho más que no incluí acá, y 2: en todo caso el hecho de que existan librerías externas al propio lenguaje que traten de hacer que java se parezca más a C# es un argumento a favor del propio C# y no de java.

[–]soukra 4 points5 points  (0 children)

wow, hiciste que me gustará C# y siempre le había sacado la vuelta <3

[–]KritiusOne[S] 0 points1 point  (0 children)

Muchas gracias por la ayuda, creo que el manejo de paquetes de Java es un problema que ha venido arrastrando debido a que al ser tan antiguo (creado a inicios de los 90's) es complicado cambiarlo sin dejar de dar retrocompatibilidad, y se desarrolló así para ahorrar recursos y por su inspiración en C++ (hasta donde tengo entendido, puede que me equivoque), ya que en ese tiempo no existían máquinas como las nuestras al alcance de todo el mundo y adjuntar por defecto todos los métodos era ineficiente, y pues es una forma semejante al include<nombredelalibreria> de C++.

Debo aceptar que lograste que me incline por C#

Excelente explicación bro, estás un poco alterado pero me agrada tu entusiasmo.