Question

J'ai eu récemment quelques scénarios où les petits changements au code ont donné lieu à l'évolution des conditions préalables dans plusieurs cours et je me demandais si la conception par contrat est censé être de cette façon ou non.

public Goal getNextGoal() {
    return goalStack.pop();
}

Si goalStack.pop() a une condition que la pile n'est pas vide, alors ne getNextGoal() besoin d'avoir explicitement la même condition sine qua non? Il semble que les conditions héritant rendrait les choses fragiles, et le passage à une file d'attente ou une autre structure modifierait les conditions préalables à getNextGoal(), il est appelants et les appelants des appelants est tout. Mais il semble que les conditions ne héritant cacheraient les contrats et les appelants et les appelants des appelants, ne connaîtraient pas sur les conditions préalables.

Code fragile où tous les appelants savent et héritent des conditions préalables et postconditions du code qu'ils appellent, ou un code mystérieux où les appelants ne savent jamais ce que les conditions préalables et postconditions plus profondes sont?

Était-ce utile?

La solution

Cela dépend de ce que votre méthode d'appel fait exactement. La chose importante avec des conditions préalables est que l'appelant est responsable de la réalisation des conditions préalables .

Donc, si les appelants de votre méthode GetNextGoal devrait être responsable de fournir une pile non vide, alors vous devriez en effet également fixer des conditions préalables sur votre méthode GetNextGoal. Clarté des conditions est l'un des énormes avantages des contrats de code, donc je vous suggère de les mettre dans tous les lieux où les appelants doivent remplir les conditions.


Si votre code semble fragile cependant, il pourrait être un signe que vous devez factoriser un code .

  

Il semble que héritant de la   conditions préalables seraient les choses   cassant, et le passage à une file d'attente ou   une autre structure changerait la   conditions préalables à getNextGoal (), il est   les appelants et les appelants des appelants est tout.

Si vous exposez la file d'attente aux appelants et le modifier ultérieurement (à une autre structure, comme vous l'avez dit), les appelants de cela aurait aussi le changement. Cela est généralement un signe d'un code fragile.

Si vous exposeriez Interface au lieu d'une mise en œuvre de la file d'attente spécifique , vos conditions pourraient également utiliser l'interface et vous ne devez modifier les conditions chaque fois que vos changements de mise en œuvre. entraînant ainsi un code moins fragile.

Autres conseils

Les exceptions sont une solution, mais peut-être pas possible pour votre situation.

Documenter ce qui se passe s'il n'y a pas de buts est normal.E.G. C'est ce que malloc () fait dans C

Je ne peux pas dire si vous utilisez Java ou C ++ ou quelque chose d'autre que chaque langue peut avoir des moyens un peu plus naturel pour cette langue spécifique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top