2010-08-05 11 views
5

Je me demande si on devrait valider que les arguments passés à une méthode sont d'une certaine classe.Valider les arguments dans Ruby?

par ex.

def type(hash = {}, array = []) 
    # validate before 
    raise "first argument needs to be a hash" unless hash.class == Hash 
    raise "second argument needs to be an array" unless array.class == Array 

    # actual code 
end 

Est-il intelligent de faire cela ou est-ce juste lourd et perte de temps pour valider tous passé dans les arguments?

Y a-t-il des circonstances où vous souhaiteriez bénéficier de cette sécurité supplémentaire et des circonstances dans lesquelles vous ne serez pas dérangé?

Partagez vos expériences!

Répondre

9

Je ne recommanderais pas cette approche spécifique, car vous ne parvenez pas à accepter les classes qui fournissent une sémantique de hachage ou de tableau mais qui ne sont pas de cette classe. Si vous avez besoin de ce type de validation, il est préférable d'utiliser respond_to? avec un nom de méthode. Les tableaux implémentent la méthode: [], pour ce que ça vaut.

OpenStruct possède une sémantique de hachage et une sémantique de méthode d'accesseur d'attribut, mais ne retournera pas true pour la condition hash.class==Hash. Cela fonctionnera comme un hash dans la pratique, cependant. Pour le mettre en perspective, même dans un langage non dynamique, vous ne voudriez pas le faire de cette façon; vous préférez vérifier qu'un objet implémente IDictionary<T>. Ruby préférerait idiomatiquement que, si nécessaire, vous vérifiiez que la méthode existe, parce que si c'est le cas, le développeur a probablement l'intention que son objet agisse de la même manière. Vous pouvez fournir des tests unitaires supplémentaires autour du code client comme une alternative à forcer les choses à être non-dynamique.

4

Je pense que c'est inutile. Une fois, j'ai lu sur un blog quelque chose comme "Si vous avez besoin de protéger votre code contre les gens stupides, ruby ​​n'est pas la langue pour vous."

+1

c'est vrai. pourquoi valider vos programmeurs =) –

1

Si vous voulez des contrats de code imposés par le compilateur/l'exécution, alors Ruby n'est pas pour vous. Si vous voulez un langage malléable et facile à tester, alors Ruby l'est.

5

Il n'est généralement pas nécessaire de valider que les arguments appartiennent à une certaine classe. Dans Ruby, vous êtes encouragé à utiliser Duck Typing.

1

J'ai trouvé que valider que les paramètres d'entrée répondent à vos conditions préalables est une pratique très précieuse. La personne stupide dont elle vous sauve, c'est toi. Cela est particulièrement vrai pour Ruby car il n'a pas de vérification de temps de compilation. S'il y a certaines caractéristiques de l'entrée de votre méthode qui, vous le savez, doivent être vraies, cela permet aux sénes de les vérifier au moment de l'exécution et d'élever les erreurs avec des messages d'erreur significatifs. Dans le cas contraire, le code commence à produire des déchets pour les ordures et vous obtenez une mauvaise réponse ou une exception sur toute la ligne.

Questions connexes