2017-02-14 33 views
3

Я недавно был назначен создать класс, который содержал бизнес-логику в одном общедоступный методЯвляется ли этот класс Следующим принципом единой ответственности?

class MyClass 
     private BusinessObject object; 
     public BigInteger calculateCost() { 
       //do calcualation using properties of object 
     } 
} 

Расчет делается в методе calculateCost (а) совершенно нормально, однако есть и другие свойства объекта, которые могут изменить расчет способ сделанный. Таким образом, исходя из некоторого состояния, я должен иметь возможность применять скидку, есть несколько условий, каждый из которых может изменить расчет.

Поэтому я применил простой подход, создавая частные методы, как ниже

 private calculateCost1() { 
      //using object's properties calculate the cost 
    } 

    private calcualteCost2() { 
      //using object's properties calculate the cost 
    } 

И назвал эти методы из открытого метода

 public BigInteger calculateCost() { 
       //do calcualation using properties of object 
       calculateCost1(); 
       calculateCost2(); 
     } 

Против этой конструкции является то, что если мне нужно добавить дополнительные метод расчета, мне придется изменить MyClass, однако я получил обратную связь, что его не следует принципу единой ответственности. Я считаю, что единственная ответственность класса заключается в том, чтобы рассчитать стоимость и после добавления дополнительных методов для расчета стоимости по-разному, основываясь на свойствах бизнес-объекта, она все еще придерживается SRP.

Может кто-нибудь прокомментировать, почему этот дизайн не соответствует SRP, если это не так?

+0

Без дополнительной информации, я думаю, что он придерживается SRP –

+0

Вы также несете ответственность за разработку класса BusinessObject, или он дается? – Calculator

+0

Или вы делаете это там или в других классах и называете эти классы из расчета стоимости. В любом случае конечное значение необходимо изменить до его возврата. – efekctive

ответ

4

Я получил обратную связь, что его не следующий принцип единой ответственности

Ваш класс следит за единой ответственности Принцип поскольку все методы в классе имеют одну цель стоимости calcualting.

Что ваш класс не является ахерингом, является Принцип открытого закрывания. Вам необходимо изменить свой класс каждый раз, когда вам нужно ввести новый механизм расчета. Принцип открытого замыкания гласит, что классы должны быть открыты для расширения, но закрыты для modificaiton. Одним из способов, которым вы можете придерживаться OCP в вашем случае, является использование Strategy Pattern, где у вас есть один класс для каждого типа расчета.