8
votes

Est-il une bonne idée d'utiliser des aspects comme une méthode permettant de supprimer des contrôles défensives de la logique d'application?

genre de titre long, mais c'est généralement la question.

Je veux savoir si vous pensez que c'est une bonne idée de faire ce qui suit.

au lieu de: < Pré> xxx

Je veux avoir quelque chose comme: xxx

Pensez-vous que c'est bon / terrible / trop fantaisie / trop lent / trop lent? Si vous pensez réellement que c'est bien je pensais à utiliser spel < / a> Pour la mettre en œuvre, quelqu'un a-t-il quelque chose de meilleur / plus léger / plus rapide?

Merci,


0 commentaires

5 Réponses :


3
votes

Ce n'est pas nécessairement une mauvaise chose, mais votre cas simple peut bien être résolu avec exception déclarations ( Plutôt que assertions que j'ai initialement mentionné).

Il semble que vous introduisiez votre propre ensemble d'annotations que d'autres développeurs de votre projet doivent accepter et s'adapter à. Cependant, une fois que vous avez introduit des annotations, il semble qu'une approche régulière proxy serait un meilleur candidat à résoudre le problème.

Pour résumer: le problème que vous avez décrit peut facilement être résolu à l'aide de solutions de remplacement Java standard, bien que dans un cas plus complexe, il pourrait être justifié (considérer par exemple, @secured au printemps-sécurité), en particulier Si vous développez votre propre framework .


5 commentaires

Et il introduit une autre langue à l'intérieur des annotations.


En fait, cette question a été dans ma tête exactement comme un effet secondaire d'utiliser @secured . Mais puisque nous utilisons déjà @secured pour la sécurité de niveau de la méthode, il serait déroutant de l'utiliser pour les chèques de défensifs IMO, c'est pourquoi je demande des idées sur le faire et que @secured et @peuthorize Utilisez Spel, je pensais que le choix évident.


Il est généralement considéré comme inapproprié d'utiliser affirmer pour vérifier les arguments. Mais vous pouvez ajouter une méthode, disons, Legalid ou CHECKID pour effectuer la vérification de manière concise.


@Simon, si vous développez un cadre de cadre utilisé par d'autres applications, cela peut en valoir la peine. Si utilisé dans ce projet, il ajoute probablement plus de confusion et tend à être survenant. Néanmoins, si vous voulez apprendre, avoir les Devs de votre côté et le temps de la mettre en œuvre, bien sûr, essayez-le.


@ Tomhawtin-tackline, oui je pense que tu as raison. J'ai mis à jour le poste et a référencé un point de vue de la présente publication sur le problème de l'affirmation / des exceptions.



2
votes

Je pense que c'est

  • Overengineering
  • casse de rupture, en s'appuyant sur un aspect externe (qui pourrait ou ne pourrait pas être là) pour maintenir des invariants de l'objet
  • déroutant
  • pas efficace
  • ne pas ajouter de valeur

    J'aime utiliser Préconditions de Guva classe pour de tels contrôles. De plus, de tels contrôles font partie de la logique commerciale, IMHO.


3 commentaires

Que ce soit la logique commerciale ou non est subjective (probablement ... Je ne suis pas sûr de savoir s'il y a une définition décisive), mais toujours son dans la méthode :) et à l'intérieur de la méthode, je me sens mieux (peut-être que c'est juste moi) si je Ne lisez pas 10/20 lignes de chèques, ce qui est normal si vous essayez d'être sûr à 100%.


Les conditions préalables de Guava réduiraient le nombre de lignes, car elles évitent les blocs IF. Si ces chèques sont si gros qu'ils dérangent, alors mettez-les dans une méthode privée et appelez cette méthode privée. Qui réduit les chèques à une seule ligne. Et si vous voulez être sûr à 100%, n'utilisez pas d'assertions (pouvant être désactivées - et sont désactivées par défaut IIRC) et n'utilisez pas un aspect, qui peut être désactivé, ou mal installé de manière incorrecte.


@downvoter: Vous pourriez être en désaccord avec ma réponse, mais cela ne le rend pas utile. Pourquoi le bowvote?




1
votes

Il ressemble à validation . FYI, plusieurs cadres existent déjà, consultez Cette question et ovale par exemple.

Je ne sais pas des performances, mais pour moi, ce n'est pas une overgineering: vous gardez uniquement le code logique. J'aime travailler avec ça.


0 commentaires

2
votes

Je pense que vous vouliez dire des annotations, pas des aspects. Les aspects sont normalement externes au code qu'ils conseillent. Dans tous les cas, vous pouvez accomplir le type de validations que vous avez soulignées dans votre message avec JSR 303 a>. Cas au point:

public void buyItem(@Min(value = 1) int itemId, @Min(value = 1) int buyerId) {
    // buy logic
}


1 commentaires

Je veux dire des aspects. Je suis ouvert aux suggestions d'approche de non-annotation.