2015-09-07 15 views
0

Я не понимаю, какая разница между Принципом разделяющего интерфейса и принципом открытого/закрытого.В чем разница между ISP и OCP?

Насколько я понимаю, ISP должен зависеть от интерфейсов и OCP от классов, и я вижу, что оба они могут быть реализованы одинаково, но с интерфейсами и с классами.

ответ

0

Давайте рассмотрим принципы с точки зрения разработки единичного теста.

Если вы пишете много модульных тестов для одного интерфейса/класса, это похоже на то, что вы нарушаете принцип ISP. Интерфейс слишком велик.

Если вы хотите переопределить какой-либо метод в интерфейсе/классе тестирования, но вы не можете этого сделать, потому что этот метод не является виртуальным, это похоже на то, что вы нарушаете принцип OCP, а ваш класс не позволяет расширять.

+0

хорошо предположим, что у меня есть класс конечно и сообщений класса и есть IFetchable, IUploadable, класс конечно два интерфейсных воплощали только я Fetchable и пост реализует как так я сделал класс это для управления операциями http://pastebin.com/nJx6C38g я думаю, что он может быть реализован на основе OCP, как сделать выборку класса есть метод извлечения и загрузить класс загрузить методу и сделать класс выглядеть следующим образом управлять операциями http://pastebin.com/9FRX2XK1 извините, но это что я понял: / – MrDroid

3

Programming to interfaces сообщите нам, что наш код должен зависеть от интерфейсов, в то время как ISP направляет нас не создавать интерфейсы богов, которые имеют большое количество методов. Большие интерфейсы вызывают две основных проблем:

  • клиентов, использующих этот интерфейс в зависимости от методов, которые они не используют
  • новых реализаций этого интерфейса должен реализовать все методы, и если интерфейс является большим, что не всегда ясно, как надлежащим образом реализовать этот интерфейс

OCP направляет нас на то, чтобы написать код, который мы можем продлить без изменения существующего кода. Так, например, пусть предполагается, что вы следующий интерфейс:

public interface ITask 
{ 
    void Execute(); 
} 

Затем вы создаете SendToEmailTask класс, который реализует интерфейс ITask. Предположим, что через некоторое время появляется новое требование о необходимости добавления журнала в SendToEmailTask. И в соответствии с OCP вы не должны изменять существующий код, а добавить новый LoggingTask, который также реализует ITask интерфейс (используя Decorator рисунок):

public class LoggingTask : ITask 
{ 
    private readonly ITask task; 

    public LoggingTask(ITask task) 
    { 
     //guard clause 
     this.task = task; 
    } 

    public void Execute() 
    { 
     Logger.Log("task..."); 
     this.task.Execute(); 
    } 
} 

Благодаря тому, что вы достигли Single Responsibility принципа.