Skip to content

Instantly share code, notes, and snippets.

@alberto
Created July 29, 2013 20:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alberto/6107632 to your computer and use it in GitHub Desktop.
Save alberto/6107632 to your computer and use it in GitHub Desktop.
¿Cómo expresarías esto con un sólo return por método?
module DownloadPolicy
def self.allow_download_for?(screencast, user)
return false unless screencast.published?
return true if screencast.free?
return false if user.nil?
return user.has_screencast_access?
end
end
@ialcazar
Copy link

module DownloadPolicy
def self.allow_download_for?(screencast, user)
result = false unless screencast.published?
result = true if screencast.free?
result = false if user.nil?
result = user.has_screencast_access?
return result
end
end

@ignasi35
Copy link

return screencast.published && (screencast.free || (!user.nil && user.has_screencast_access))

@ialcazar
Copy link

function DownloadPolicy(){
var allow_download_for=function(screencast, user){
var result;
if (!screencast.published)
result = false;
else if (screencast.free)
result = true;
else if (user.nil)
result = false;
else
result = user.has_screencast_access;
return result;
}
}

@GermanDZ
Copy link

ahora da un poco igual (feo pero efectivo) como seguramente vaya a seguir creciendo; más condiciones… más complejidad.

En el futuro, lejano o no, supongo que que evolucionará a algo así como que "para un screencast ser downloadeable por un user deben cumplirse alguna de las reglas"

  • Cada regla es un objeto en sí mismo.
  • Cada regla tiene una prioridad, precedencia o dependencia
  • Cada regla puede ser responder si se cumple para un contexto dado (screncast, user, otras cosas…)
  • Cada regla (en caso de cumplirse) indica si permite o prohibe

La DownloadPolicy se configura con las reglas que apliquen en cada caso y se evalúa cada regla y cuando alguna se cumpla ya tienes el resultado.

Tengo un caso de algo parecido (reglas para inscripciones a torneos) que terminó en algo así… sobre todo porque no alcanza con un "true/false" en lugar del false quiero una explicación de que falta o que problema tengo… para poder informar mejor y/o recuperar… si por ejemplo llegaste a que la única regla que no se cumple es la de user.has_access?(screencast)… me gustaría dar la posibilidad de "comprar" acceso en ese momento; y eso es distinto a user.nil? porque entonces quiero mostrar el login/signup.

@ialcazar
Copy link

Esto da para una Kata en condiciones muy del estilo del Fizz Buzz!

@arturoherrero
Copy link

Éste método está haciendo varias cosas, entiendo que cuando llamamos a allow_download_for? ya tenemos un screencast válido (está publicado) y un user válido (que no es nil). Con todo no me termina de gustar la solución.

module DownloadPolicy
  def self.allow_download_for?(screencast, user)
    screencast.free? || user.has_screencast_access?
  end
end

@alberto
Copy link
Author

alberto commented Jul 30, 2013

@ialcazar @ignasi35 os parecen más legibles vuestras soluciones?

@GermanDZ @arturoherrero no me redefináis el problema, ni es más complejo ni más sencillo :P

@GermanDZ Como decías por twitter, lo veo sobreingeniería. Creo que tendría que crecer y complicarse bastante para justificarlo o dudo que la solución fuese más sencilla, y eso que alguna vez he hecho algo similar ;)

@arturoherrero el código es el que es precisamente porque pueder haber screencasts no publicados y usuarios nulos.

Por cierto, el código es real, lo he sacado de un screencast de Destroy All Software.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment