-
-
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 |
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.
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"
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.