2016-11-08 1 views
-1

Je fais une calculatrice de console en tant que projet de test. La caractéristique principale de ma réalisation est que je l'ai fait des chiffres et des classes d'opérateurs hérités de l'interface iTerm:Est-ce que mon code viole le principe de responsabilité unique?

public interface ITerm 
{ 
    Object Value { get; } 
} 

Maintenant, je suis héritant dans les interfaces IOperand et IOperator et l'utilisation de ces Intefaces dans les calculs supplémentaires via la notation inverse pologne .

Et maintenant, on m'a dit que l'utilisation de cette propriété de type Object à la fois pour conserver les nombres et les opérateurs est une violation du principe de responsabilité unique.

private ITerm CalculatePostfixExpression(IEnumerable<ITerm> input) 
{ 
    var tempResult = new Stack<ITerm>(); 
    foreach (var term in input) 
    { 
     if (term is IOperand) 
     { 
      tempResult.Push(term as IOperand); 
     } 
     if (term is IOperator) 
     { 
      tempResult.Push(ProceedOperation(term as IOperator, tempResult)); 
     } 
    } 
    return tempResult.Peek(); 
} 

Voici comment je gère le calcul. Il y a donc deux questions: 1. Y a-t-il des défauts dans mon idée de stocker à la fois les opérandes et les opérateurs dans la variable Objet? 2. Existe-t-il des moyens d'améliorer mon code? J'envisage d'utiliser le modèle de visiteur dans la méthode CalculatePostfixExpression maintenant.

+3

Vous devriez poster ici: http: // CodeReview .stackexchange.com/ –

+0

merci de me guider, devrais-je supprimer ma question après avoir posté sur codereview? –

Répondre

2

Ce n'est certainement pas l'approche la plus évidente.

Ce que vous stockez dans la propriété Value n'est pas très clair pour moi?

Le fait que vous avez 2 interfaces IOperand et IOperator que les deux dérivent de la même interface de base ITerm, tandis que ceux IOperand et IOperator n'ont pas un est-une relation est AMHA une odeur de code au moins.

Cela signifie que IOperand et IOperator ne sont pas interchangeables mais ils sont tous les deux ITerm cas, ce qui est une violation du principe de substitution Liskov (un des principes solides).

J'ai créé un projet console test similaire moi-même (inverse console app calculatrice polonaise) il y a quelques semaines, que vous pouvez trouver sur github: https://github.com/fgheysels/Calculator

+0

Merci beaucoup, je devrais regarder votre code. La propriété Value contient, ehm, le contenu du terme "128" ou "+" –