Базовый класс несет одну ответственность, а производный класс — другую. Соответствует ли это SRP?

У меня есть VolumeButton, который является производным от ButtonModifier. Если я помещу свою бизнес-логику (увеличение/уменьшение громкости, отключение звука и т. д.) в VolumeButton, включу/отключу логику для базового класса ButtonModifier. Нравиться,

public class VolumeButton : ButtonModifier
{
    /// Event handler to change the volume.
    void ChangeVolume() { ... }
}

public class ButtonModifier
{
    /// Updates the visibility of the button.
    void UpdateVolumeVisibleStatus() { ... }

    /// Enable or disable the button.
    void Enable(bool enable) { ... }
}

С одной стороны, изменение бизнес-логики влияет на VolumeButton, а изменение инфраструктуры влияет на ButtonModifier. Так что это соответствует SRP. С другой стороны, VolumeButton унаследовал логику включения/отключения от базового класса. Значит, у него две обязанности?

Эти два класса соответствуют SRP?


person Yang Nan    schedule 18.04.2016    source источник


Ответы (2)


И VolumeButton, и ButtonModifier имеют только одну причину для отдельного изменения. Так что они буквально соответствуют SRP. Однако интуитивно я думаю, что VolumeButton наследует обязанности от ButtonModifie, что приводит к нарушению SRP.

С точки зрения зависимостей кода вы не разделили никакую зависимость, перенеся одну ответственность из производного класса в базовый класс. Согласно «Принципам, шаблонам и практикам Agile в C#» дяди Боба Глава 8 Во всех примерах дядя Боб ввел дополнительные абстракции для разделения обязанностей. Таким образом, полезным намеком на ваш вопрос может быть: «Ввели ли вы дополнительную абстракцию для разделения зависимостей?»

person Irwin    schedule 18.04.2016

Я не думаю, что они соответствуют SRP, потому что производный класс получает все общедоступные/защищенные члены из своего базового класса, например:

public class Flyable
{
    public void fly(){...}
}
public class Bird : Flyable
{
    public void walk(){...}
}

Птица может летать и ходить. Возможно пример не совсем для вашего случая. Но я хочу сказать, что производный класс получит две обязанности, если эти две обязанности будут разделены: одна в базовой, а другая в производной.

person Francis Luo    schedule 20.04.2016