SOLID — это аббревиатура пяти принципов проектирования объектно-ориентированного программирования. Роберт С. Мартин представил принципы SOLID в начале 2000-х годов, и с тех пор они стали краеугольным камнем передовой практики разработки программного обеспечения. Вот почему принцип SOLID так важен и почему он полезен для нас в программировании.
S — принцип единой ответственности
Принцип единой ответственности (SRP) гласит, что у класса должна быть только одна причина для изменения.
Другими словами, у класса должна быть только одна обязанность или работа. Это упрощает понимание, поддержку и расширение класса. Если у класса слишком много обязанностей, изменения в одной области могут повлиять на другие области класса, что усложнит его модификацию и тестирование. Это выгодно, потому что SRP:
- Облегчает понимание того, что делает класс и как его следует использовать.
- Облегчает поддержку класса, поскольку изменения сосредоточены на одной ответственности.
- Облегчает тестирование класса, поскольку я могу изолировать поведение одной ответственности.
O — принцип «открыто-закрыто»
Принцип открытости-закрытости (OCP) гласит, что класс должен быть открыт для расширения, но закрыт для модификации.
Другими словами, я должен иметь возможность добавлять в класс новые функции, не меняя существующий код. Это достигается с помощью интерфейсов, абстрактных классов и наследования. Следование OCP гарантирует, что код моей команды станет более гибким, пригодным для повторного использования и удобным в сопровождении. Это выгодно, потому что OCP:
- Упрощает добавление новых функций в программу без изменения существующего кода.
- Облегчает поддержку существующего кода, поскольку изменения ограничиваются новой функциональностью.
- Поощряет использование интерфейсов, абстрактных классов и наследования, которые способствуют модульности и повторному использованию кода.
L — принцип замены Лисков
Принцип замещения Лискова (LSP) гласит, что подтипы должны быть взаимозаменяемыми для своих базовых типов.
Это означает, что если программа использует базовый класс, она должна иметь возможность использовать любые производные классы, не зная об этом. Этот принцип гарантирует, что код моей команды будет более гибким и адаптируемым к изменениям. Это также упрощает написание модульных тестов и гарантирует, что поведение программы остается согласованным. Как это может нам помочь? Потому что ЛСП:
- Обеспечивает единообразие поведения для разных типов, упрощая анализ и тестирование программы.
- Поощряет хороший объектно-ориентированный дизайн, поддерживая наследование и полиморфизм.
I — Принцип разделения интерфейсов
Принцип разделения интерфейсов (ISP) гласит, что клиенты не должны зависеть от интерфейсов, которые они не используют.
То есть я и моя команда должны разрабатывать небольшие, связные интерфейсы, соответствующие потребностям каждого клиента. Таким образом, мы можем избежать создания сложных интерфейсов, которые трудно реализовать и поддерживать. Этот принцип также способствует слабой связанности, что делает наш код более модульным и тестируемым. Это может сделать нашу работу немного менее сложной, потому что интернет-провайдер:
- Облегчает реализацию интерфейсов, поскольку они малы и специфичны для нужд каждого клиента.
- Способствует слабой связанности, что делает код более модульным и тестируемым.
- Позволяет использовать несколько реализаций интерфейса, упрощая переключение между различными реализациями по мере необходимости.
D — Принцип инверсии зависимостей
Принцип инверсии зависимостей (DIP) гласит, что модули высокого уровня не должны зависеть от модулей низкого уровня, но оба должны зависеть от абстракций.
Это означает, что мы должны проектировать наш код так, чтобы способствовать использованию интерфейсов и абстрактных классов. Это может уменьшить связь между различными модулями, сделав наш код более гибким и пригодным для повторного использования. Это полезно в программировании, потому что DIP:
- Уменьшает связь между различными модулями, упрощая изменение одного модуля, не затрагивая другие.
- Способствует использованию интерфейсов и абстрактных классов, что делает код более модульным и тестируемым.
- Упрощает замену одной реализации на другую, делая код более гибким и адаптируемым.
Реализация
Следуя этим принципам, мы с моей командой можем создавать высококачественное программное обеспечение, отвечающее потребностям моего клиента, и которое будет легче поддерживать с течением времени, даже по мере роста и развития проекта. Крайне важно, чтобы все в команде понимали принципы и стремились следовать им в своем коде. Я считаю, что это может помочь обеспечить согласованность и уменьшить конфликты или проблемы в будущем.
Вот несколько примеров принципов, которые мы попробовали в нашем проекте:
- Принцип единой ответственности (SRP): мы можем создать отдельные классы для каждого компонента, отвечающего за компонент раздела Drag & Drop. Например, у нас может быть класс AddedForm, класс AddedSelectionField и класс AddedVisualizationAttribute, каждый из которых несет одну ответственность.
- Принцип замещения Лискова (LSP): каждый компонент одних и тех же родителей должен вести себя согласованно и иметь одинаковый интерфейс, чтобы их можно было использовать взаимозаменяемо. Например, и AddedForm, и AddedDetail имеют одного и того же родителя, которым является ViewComponentPart, поэтому у них один и тот же интерфейс.
- Принцип разделения интерфейсов (ISP): мы можем создавать интерфейсы для каждого родительского компонента. Таким образом, клиенты компонентов должны зависеть только от интерфейса, а не от реализации, что делает код более модульным и тестируемым.
Внедряя принципы SOLID в нашу программу, мы можем создавать более удобный, тестируемый и гибкий код и легко вносить будущие изменения или дополнения.
Таким образом, принципы SOLID предоставляют рекомендации по написанию кода, который легко понять, поддерживать и расширять. Мы можем создавать гибкое, адаптируемое и тестируемое программное обеспечение, следуя этим принципам. Используя SOLID, мы можем улучшить качество нашего кода и стать лучшими разработчиками программного обеспечения.
Ссылка
- https://www.digitalocean.com/community/conceptual-articles/s-o-l-i-d-the-first-five-principles-of-object-Oriented-Design
- https://phoenixnap.com/blog/solid-principles
- https://blog.knoldus.com/why-we-need-solid-principles-and-its-types/
- https://www.section.io/engineering-education/introduction-to-solid-principle/