Recientemente “herede” un código algo antiguo, así que me he decidido a hacerlo algo mas “funcional”.
Les comparto algo muy simple pero sirve para ilustrar.
Este era el primer codigo, es una función para determinar que nombre de usuario debe mostrarse en la web.
var user = {
first_name: 'John',
last_name: 'Travolta',
user_name: '@JohnTheUser'
}
var name;
functiondisplayName() {
if (user.first_name && user.last_name){
name = user.first_name + ' ' + user.last_name
}
if (user.first_name){
name = user.first_name
}
if (user.user_name){
name = user.user_name
}
name = 'new user'
}
displayName()
En principio no me pareció nada raro, aunque me chocaba la idea de cambiar el valor de la variable ‘name’ de esa forma… añadiendo algunos returns y pasando el objeto como parámetro tal vez quedaría mejor.
function displayName(user) {
if (user.first_name && user.last_name){
return user.first_name + ' ' + user.last_name
}
if (user.first_name){
return user.first_name
}
if (user.user_name){
return user.user_name
}
return 'new user'
}
name = displayName(user)
Ahora luce un poco mejor, y aun así no le veía mucho sentido a declarar la variable name antes de usarla… añadiendo un poco de operador ternario y condicionales, esta es la versión final.
const displayName = user => {
return (user.first_name && user.last_name)
? `${user.first_name} ${user.last_name}`
: user.first_name || user.user_name || 'new user'
}
const name = displayName(user)
y en contraste este mismo código en Elixir, un lenguaje puramente funcional.
defmodule User dodefdisplayName(%User{firstname: f, lastname:l})when f != ""and l != "", do"#{f}#{l}"defdisplayName(%User{firstname: f})when f != "", do: f
defdisplayName(%User{username: u})when u != "", do: u
defdisplayName(%User{}), do:'New User'end
Espero sirva el ejemplo 😃