Принцип единой ответственности. У класса должна быть только одна причина для изменения. Если у вас монолитный класс, то у него, вероятно, есть несколько причин для изменения. Просто определите единственную причину для изменения и будьте настолько подробны, насколько разумны. Я бы посоветовал начать с большого. Выполните рефакторинг одной трети кода в другой класс. Как только вы его получите, начните заново со своим новым классом. Перейти сразу с одного класса до 20 - это слишком сложно.
Принцип открытости / закрытости. Класс должен быть открыт для расширения, но закрыт для изменений. По возможности, пометьте своих участников и методы как виртуальные или абстрактные. Каждый элемент должен быть относительно небольшим по своему размеру и давать вам базовую функциональность или определение поведения. Однако, если вам понадобится изменить функциональность позже, вы сможете добавить код, а не изменить код, чтобы ввести новые / другие функциональные возможности.
Принцип замещения Лискова. Класс должен быть заменяемым для своего базового класса. Ключевым моментом здесь, на мой взгляд, является правильное наследование. Если у вас есть большой оператор case или две страницы операторов if, которые проверяют производный тип объекта, значит, вы нарушаете этот принцип и вам необходимо переосмыслить свой подход.
Принцип разделения интерфейса. На мой взгляд, этот принцип очень похож на принцип единой ответственности. Это просто применимо конкретно к высокоуровневому (или зрелому) классу / интерфейсу. Один из способов использования этого принципа в большом классе - заставить ваш класс реализовать пустой интерфейс. Затем измените все типы, которые используют ваш класс, на тип интерфейса. Это нарушит ваш код. Однако он точно укажет, как вы потребляете свой класс. Если у вас есть три экземпляра, каждый из которых использует собственное подмножество методов и свойств, то теперь вы знаете, что вам нужны три разных интерфейса. Каждый интерфейс представляет собой совокупный набор функций и одну причину для изменения.
Принцип инверсии зависимостей. Аллегория родитель / ребенок заставила меня понять это. Подумайте о родительском классе. Он определяет поведение, но не касается грязных деталей. Это надежно. Однако дочерний класс - это все о деталях, и на него нельзя полагаться, потому что он часто меняется. Вы всегда хотите зависеть от родительских, ответственных классов, а не наоборот. Если у вас есть родительский класс, зависящий от дочернего класса, вы получите неожиданное поведение, когда что-то измените. На мой взгляд, это то же самое мышление, что и SOA. Контракт на обслуживание определяет входы, выходы и поведение без каких-либо подробностей.
Конечно, мои мнения и понимание могут быть неполными или ошибочными. Я бы посоветовал поучиться у людей, усвоивших эти принципы, например у дяди Боба. Хорошей отправной точкой для меня была его книга Agile Principles, Patterns и практики в C #. Еще один хороший ресурс - Дядя Боб на Hanselminutes.
Конечно, как отметили Джоэл и Джефф, это принципы, а не правила. Они должны быть инструментами, которые помогут вам направлять вас, а не законом страны.
РЕДАКТИРОВАТЬ:
Я только что нашел эти SOLID скринкасты, которые выглядят действительно интересно. Каждый длится примерно 10-15 минут.
person
Aaron Daniels
schedule
23.04.2009