-
-
Save alberto/6107632 to your computer and use it in GitHub Desktop.
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 |
return screencast.published && (screencast.free || (!user.nil && user.has_screencast_access))
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;
}
}
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.
Esto da para una Kata en condiciones muy del estilo del Fizz Buzz!
É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
@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.
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