2011-08-09 2 views
2

Ce que je vais partager est un modèle courant dans mes projets. Certains cas sont plus longs que d'autres mais le motif est plus ou moins le même et je me demande comment je peux être plus SEC. La seule chose qui se passe ici est de définir un message basé sur le statut. Theres doit être un moyen d'appeler le retour qu'une seule fois et peut-être même resserrer le conditionnel.Obtenir DRY avec les conditions Python et les retours Django

Des idées?

Répondre

4

Se pourrait-il quelque chose dans la ligne de:

Module lib

def add_error_message(request, status, result=0): 
    if status == 'ACTIVE' and not result: 
     msg = 'Active Message... bla bla bla' 
    elif status == 'TOO MANY FAILURES': 
     msg = 'Failed. Foooobarrrrr' 
    elif status == 'DEACTIVATED BY MERCHANT': 
     msg = 'Deactivated derpa derp' 
    messages.add_message(request, messages.ERROR, _(msg)) 

Ce ne serait pas pour la condition de 'p.result', un dictionnaire aurait été beaucoup mieux:

MESSAGES = { 
    'ACTIVE': 'Active Message... bla bla bla', 
    'TOO MANY FAILURES': 'Failed. Foooobarrrrr', 
    'DEACTIVATED BY MERCHANT': 'Deactivated derpa derp', 
} 
def add_error_message(request, status): 
    try: 
     messages.add_message(request, messages.ERROR, _(MESSAGES[status])) 
    except KeyError: 
     pass 

vue Module

from lib import add_error_message 

def your_view(request, *args, **kwargs): 
    # ... 
    add_error_message(request, status, p.result if p else 0) 
    return HttpResponseRedirect(reverse('billing_update')) 
+0

Je pense que j'aime ça et ça aide aussi à démontrer que je peux prendre beaucoup d'autres parties de code répétées et appliquer la même chose. Est-ce que '' lib.py'' est un modèle courant parmi les projets django? Je n'ai jamais construit mes vues en dehors de .... views.py;) – Flowpoke

+0

Vous êtes libre de moduler notre code de toute façon que vous aimez. Cette fonction peut vivre dans le même module views.py si elle n'est pas nécessaire ailleurs. Le but de DRY est de décomposer le code commun en fonctions et de les mettre dans un endroit accessible. Certaines personnes utilisent 'lib.py' certains' utils.py', d'autres qui aiment Ruby on Rails pourraient penser à utiliser 'helpers.py'. Soyez simplement cohérent dans votre propre projet et documentez votre code. – rewritten

+0

Cela ne l'aide pas vraiment à ne pas se répéter - la duplication de 'messages.add_message (request, messages.ERROR, _())' est toujours là. Ceci est juste une plus grande modularisation --- il pourrait simplement être fait en le mettant dans une méthode. Et, s'il est seulement utilisé depuis 'views.py', il n'appartient pas nécessairement sémantiquement à un autre module. – agf

0

Je remarque que votre dernière déclaration est conditionnelle, et devinez basée sur mon propre code similaire que si aucun des contrôles déclencheurs, vous voulez aller et retour quelque chose d'autre, peut-être même pas ... redirect

Voilà comment je pense que je le ferais:

def checkForMessage(): 
    if status == 'ACTIVE' and p.result != "0": 
     return 'Active Message... bla bla bla' 
    if status == 'TOO MANY FAILURES': 
     return 'Failed. Foooobarrrrr' 
    if status == 'DEACTIVATED BY MERCHANT': 
     return 'Deactivated derpa derp' 
    return None 

msg = checkForMessage() 
if msg: 
    messages.add_message(request, messages.ERROR, _(msg)) 

    return HttpResponseRedirect(reverse('billing_update')) 

// ... go on and do some other stuff ... 
return direct_to_template('some/template.html', {some: stuff}) 

Notez que la fonction checkForMessage est définie dans la fonction de vue, donc nous ne pas passer tout ce qui concerne un test en tant que paramètre (dans Si les tets sont nombreux et variés, s'ils ont juste besoin d'un statut et d'une variable "p", il peut tout aussi bien être déclaré outsi de la fonction de vue et prenez ces paramètres). Le point principal est que l'alternative "fall through" où l'on ne veut ajouter aucun message peut être traitée en retournant None dans la méthode check et en vérifiant l'existence d'un message dans la méthode view.

+0

Comme si les fermetures étaient faciles et sécuritaires pour un programmeur débutant ...;) – rewritten

+0

Les fermetures ont certainement leurs complexités, mais je ne pense pas que l'on doive éviter une fonction simple dans une fonction juste parce que la fonction de langage qui l'implémente peut être utilisée d'autres manières qui sont très difficiles à comprendre. :-) –

+0

De toute façon, le point principal ici n'était pas la météo pour passer ces paramètres ou pas, mais que la méthode checkForMessage peut renvoyer None, et nous pouvons utiliser une vérification secondaire pour que seulement ajouter le message s'il y avait un message à ajouter , comme je l'ai deviné, c'était la raison pour laquelle les chaînes de messages n'étaient pas simplement mises dans une variable et ajoutées après toutes les vérifications. –