2010-03-22 9 views
4

Dans mon entreprise, un système est conçu pour avoir 3 couches. Layer1 est responsable du traitement de la logique métier. Layer3 appelle les systèmes d'extrémité. Layer2 se trouve entre les deux couches de sorte que layer1 n'a pas besoin de connaître les systèmes dorsaux. Pour relayer les informations de layer3, layer2 doit définir l'interface avec layer1. Par exemple, layer1 veut vérifier si un code PIN de l'utilisateur est correct. Il appelle la méthode layer2 checkPin(), puis layer2 appelle le système back-end approprié. Les résultats checkPin() peuvent être: correctPin, inCorrectPin et internalError. À l'heure actuelle, nous avons défini le type de retour 'int'. Donc, si layer2 renvoie 0, cela signifie correctPin; si 1 est retourné, cela signifie inCorrectPin; Si 9 est retourné, cela signifie internalError.Type de retour de méthode

Cela fonctionne. Cependant, je me sens un peu mal à l'aise avec cette approche. Y a-t-il de meilleurs moyens de le faire? Par exemple définir un enum CheckPinResult {CORRECT_PIN, INCORRECT_PIN, INTERNAL_ERROR}, et le type de retour CheckPinResult?

Merci, Sarah

+3

Utilisez des exceptions sur chaque couche. Si une couche échoue, vous interceptez cette exception. De cette façon, vous savez quel calque a échoué. C'est une suggestion, alors pourquoi je ne l'ai pas affiché comme réponse. –

+0

Oui, j'ai compris. Ce que nous faisons en ce moment, c'est enregistrer les erreurs quand c'est une erreur interne. S'il y a une exception, nous l'attrapons et l'enregistrons dans layer1. Layer2 et Layer3 l'escaladent vers une couche supérieure. – sarahTheButterFly

+0

Je pense que ce qu'Elite a dit était de créer une exception Personnalisée de chaque couche. Ce sont des exceptions d'affaires et c'est ce que nous faisons. Cela aide aussi quand vous utilisez les couches comme API, les développeurs extérieurs seront capables de gérer les erreurs. –

Répondre

1

J'aime l'approche enum. C'est auto-documenté et facilement extensible. Vous pouvez définir la valeur renvoyée par chacun pour correspondre à la convention 0, 1, 9 que vous avez en place. Lancer une exception est certainement une approche défendable, mais jeter des exceptions peut être une chose coûteuse. J'ai toujours cru qu'ils devaient être utilisés pour indiquer des situations vraiment exceptionnelles. Avoir une mauvaise épingle peut ou ne pas être aussi exceptionnel en fonction de votre problème d'affaires. Si votre processus permet une fiabilité de «cinq neuf» pour les épingles, alors je dirais qu'une exception serait un bon moyen d'aller.

Mais si les taux d'échec sont plus de l'ordre de 1%, je dirais qu'une valeur de retour pourrait être meilleure. Vous voudrez peut-être faire défiler un grand nombre de valeurs et simplement accumuler les numéros de pièce avec les broches défectueuses en tant que gros lot. Cela dépend de la façon dont vous utilisez le code d'erreur.

+0

Notre architecte sera définitivement d'accord avec vous. Il n'aime pas du tout le mécanisme d'exception java. – sarahTheButterFly

+0

Malheureusement, je ne pouvais pas convaincre mes collègues d'utiliser enum. Ils ont dit que c'était trop de travail de ré-affacturage. :( – sarahTheButterFly

+0

Nous parlons de changer la signature d'une seule méthode, n'est-ce pas? Si c'est le cas, ce serait facile pour un outil comme IntelliJ, combien de fois appelez-vous cette méthode? – duffymo

1

Est-ce un cas commun raisonnable que vous obtenez l'erreur interne? Sinon, j'aurais checkPin retourner un booléen et lancer une exception s'il y a une erreur interne (mais j'appellerais probablement la méthode pinIsValid ou quelque chose comme ça à la place). Si cela (pour une raison quelconque) est un résultat attendu de rencontrer l'erreur interne, alors un enum à trois états pourrait probablement bien fonctionner (j'ai un cas similaire dans mon projet actuel).

1

Enum est certainement une amélioration par rapport aux types de retour entiers et une approche parfaitement valide. Une autre option serait d'avoir une signature couche 2 tels que:

public boolean isPINValid() throws InternalErrorException(); 

Depuis, je présume, les erreurs internes sont l'exception, pourquoi ne pas les traiter en tant que telle?

1

Ceci est une question de style. La façon dont vous avez décrit est une sorte de style C pour atteindre l'objectif. Le style java est le suivant: checkPin (pin) devrait renvoyer un booléen. Vraie signifiant que l'épingle est correcte et fausse ce qui signifie que ce n'est pas correct. Si une erreur survient, vous lancez une exception. Les exceptions sont la manière standard de traiter les erreurs dans Java. Les exceptions sont utiles car elles peuvent contenir des types et des messages d'erreur pour faciliter le débogage. Je dis que le mécanisme que vous décrivez est un style C car en C la manière standard de gérer les erreurs est de renvoyer un entier qui mappe à une définition puis de transmettre par référence la valeur que vous recherchez (dans ce cas-ci) cas un booléen).Donc, c vous auriez

int checkPin(int pin, bool &ans); //returns an error value. 

De toute façon, je vous recommande fortement de ne pas retourner la valeur d'erreur au même endroit que vous retourniez le booléen. Cela crée de la confusion car une seule valeur (la valeur de retour) ne devrait vraiment représenter qu'une seule chose. Le statut de l'erreur et la réponse à la question sont deux choses différentes et doivent donc être renvoyés par des canaux différents.

J'espère que cela a aidé.

+0

Haha..you got.C style.Con collègue qui a défini l'interface est de fond C. Il est si difficile pour persuader les gens de C fond d'utiliser say enum. – sarahTheButterFly