2012-07-04 1 views
3

C'est peut-être un problème plus esthétique, mais je trouve cela très ennuyeux car je me retrouve toujours avec un code moche. Et la lisibilité est toujours importante, non?Évitez de vérifier qu'il n'y a pas de problème lors de l'accès au sous-élément

Je veux vérifier si une valeur existe dans un hachage dans un hachage. Donc ce que je fais est ceci.

already_exists_data[:data][:user_id] 

Mais qui peut me obtenir une exception nullpointer si: les données sont nulles et vérification: les données pourraient me donner un nullpointer si already_exists_data est nul. Donc, ce que je me retrouve avec est la suivante:

if already_exists_data && already_exists_data[:data] && already_exists_data[:data][:user_id] 
    # Do stuff 
end 

Maintenant c'est un code méchant. Peut-être devrais-je modifier le hachage pour en faire un objet à la place. Mais je continue de tomber sur ce problème parfois et je me demandais comment vous les gars y faire face.

Je suis actuellement en train de coder en Ruby mais j'ai eu ce problème avec plusieurs autres langues.

Répondre

2

Si je demande à mon majordome de ramasser la boîte de chocolats sur la table de la salle à manger rue Victoria 34, je lui demande juste cela. Je ne veux pas dire: Allez trouver Victoria Street, et, si vous le trouvez, s'il vous plaît chercher le numéro 34, et si vous le trouvez ...

Je peux le faire parce qu'il attrape ses propres erreurs : s'il ne trouve pas la rue, il reviendra juste les mains vides.

Vous devriez donc utiliser un try avec un gestionnaire d'exceptions vide. En pseudo-code:

try {chocolats = rues ("Victoria") (34) ("salle à manger") ("table")}

Dans les langues (comme ruby, certains bure syntactic sugar) où les blocs sont des expressions que vous pourriez écrire:

si try {already_exists_data (données) (user_id)}

faire _stuff

La langue elle-même peut aussi aider: en perl, $streets{Victoria}[34]{dining_room}{table} est définie lorsque par exemple $streets est. Bien sûr, votre majordome peut rentrer à la maison les mains vides pendant des années avant de découvrir que l'adresse est erronée.La solution de bloc try - et votre if .. && .... - ont le même inconvénient: ne les utilisez que lorsque cela vous est égal si Victoria Street a un numéro 34 ou non.

1

Solution agnostique au langage: n'utilisez pas les valeurs nulles. Déjà. Appliquez cette règle à tous vos projets. Si vous devez absolument, wrap them into Either/Optional which adds explicitness. Certaines langues, telles que Scala, ont la notion de Optional déjà construit en

solution Java spécifique à:. si vous devez utiliser des valeurs nulles, annoter arguments de la méthode et les valeurs de retour avec @Nullable et @Nonnull. Les EDI corrects (tels que IntelliJ) sont capables d'analyser votre code et de mettre en évidence les déréférences possibles, si une valeur est acquise à partir d'une telle méthode.

1

Une autre possibilité consiste à envelopper l'accès de hachage avec un appel de fonction, et de faire le travail "sale" dans la fonction. Ensuite, votre code sera quelque chose comme (syntaxe pseudo-code):

accessHash(already_exists_data, data, userid) 

Remarque: vous pouvez obtenir la fantaisie avec accès hash imbriqués en fonction du nombre de paramètres passés à la fonction d'emballage, de sorte qu'il fonctionne dans un plusieurs situations.

Questions connexes