Принцип единой ответственности - У класса должна быть только одна причина для изменения. Если у вас есть монолитный класс, то у него, вероятно, есть несколько причин для изменения. Просто определите свою единственную причину для изменения и будьте настолько гранулированными , насколько разумными . Я бы предложил начать «большой». Переведите одну треть кода в другой класс. Как только вы это получите, начните все сначала с вашего нового класса. Переход от одного класса к 20 слишком сложен.
Открытый / закрытый принцип - Класс должен быть открыт для расширения, но закрыт для изменения. Там, где это целесообразно, отметьте своих членов и методы как виртуальные или абстрактные. Каждый элемент должен быть относительно небольшим по своей природе и давать вам базовую функциональность или определение поведения. Однако, если вам потребуется изменить функциональность позже, вы сможете добавить код, а не изменить код для введения новых / других функций.
Принцип замещения Лискова - Класс должен быть замещаемым для его базового класса. Ключевым моментом здесь, на мой взгляд, является правильное наследование. Если у вас огромный оператор case или две страницы операторов if, которые проверяют производный тип объекта, то вы нарушаете этот принцип и вам необходимо переосмыслить свой подход.
Принцип разделения интерфейсов - На мой взгляд, этот принцип очень похож на принцип единой ответственности. Это относится только к высокоуровневому (или зрелому) классу / интерфейсу. Один из способов использовать этот принцип в большом классе - заставить ваш класс реализовать интерфейс empty . Затем измените все типы, которые используют ваш класс, чтобы быть типом интерфейса. Это сломает ваш код. Тем не менее, он укажет, как именно вы потребляете свой класс. Если у вас есть три экземпляра, каждый из которых использует свое собственное подмножество методов и свойств, то теперь вы знаете, что вам нужно три разных интерфейса. Каждый интерфейс представляет собой совокупный набор функций и одну причину для изменения.
Принцип обращения зависимостей - Аллегория родителей / детей позволила мне понять это. Подумайте о родительском классе. Он определяет поведение, но не касается грязных деталей. Это надежно. Дочерний класс, однако, все о деталях, и на него нельзя положиться, потому что он часто меняется. Вы всегда хотите зависеть от родителей, ответственных классов, а не наоборот. Если у вас есть родительский класс, зависящий от дочернего класса, вы получите неожиданное поведение при изменении чего-либо. На мой взгляд, это то же самое мышление SOA. Контракт на обслуживание определяет входные, выходные данные и поведение без подробностей.
Конечно, моё мнение и понимание могут быть неполными или неправильными. Я бы предложил учиться у людей, которые освоили эти принципы, таких как дядя Боб. Хорошей отправной точкой для меня была его книга Agile Принципы, Шаблоны и Практики в C # . Другим хорошим ресурсом был Дядя Боб на Hanselminutes .
Конечно, как отметили Джоэл и Джефф , это принципы, а не правила. Они должны быть инструментами, которые помогут вам вести, а не закон страны.
EDIT:
Я только что нашел эти ТВЕРДЫЕ скринкасты , которые выглядят действительно интересно. Каждый длится примерно 10-15 минут.