SOLID - кратко о Принципах, что это в Программировании. ООП
Primary tabs
(текст заметки в процессе создания)
SOLID -- это аббревиатура, где первые 5 букв 5-ти принципов разработки программ в стиле ООП составлены в одно слово, которое с английского переводится как "твердый, сплошной, цельный".
Главное, это что, что за принципы скрываются под каждой буквой:
- S -- Принцип единственной ответственности (The Single Responsibility Principle):
Каждый класс должен "иметь одну причину для изменений".
-- это относительный принцип, напр. по началу у вас может быть одна "причина для изменений" класса, но по мере развития проверка и добавления кода в класс, можно заметить, что таких "причин" стало больше - это повод декомпозироваться, разделить класс.
В идеале: если в каком-то объекте вы можете выделить часть функционала в отдельную сущность - выделяйте, другое дело, что это в целом увеличивает количество кода.
- O -- Принцип открытости/закрытости (The Open Closed Principle)
«программные сущности … должны быть открыты для расширения, но закрыты для модификации.»
-- вопрос "решен" в ООП, напр, в концепции наследования классов, наследуясь от класса мы расширяем (можем расширить) функционал в потомках, но не модифицируем поведение самого родительского класса.
В Бертрана Мейера относящейся к наследованию классов, указывается, что напр. не надо модифицировать логику имеющегося класса, если это требуется со временем, а надо просто создать новый класс, унаследовавшись от предыдущего.
- L -- Принцип подстановки Барбары Лисков:
смысл его можно охарактеризовать так (слова Саттера и Александреску из руководства по C++):подкласс не должен требовать от вызывающего кода больше, чем базовый класс, и не должен предоставлять вызывающему коду меньше, чем базовый класс
- I -- Принцип разделения интерфейса:
Роберт С. Мартин определил этот принцип так:
Программные сущности не должны зависеть от методов, которые они не используют.
Фактически тут предлагается завязываться на "минимальный" интерфейс (в смысле ООП сущности), а классу, который мы хотим использовать таким образом релизовывать этот интерфейс, конечно для удобного выполнения этого принципа крайне желательно чтобы язык программирования поддерживал множественную реализацию интерфейсов.
- D -- Принцип инверсии зависимостей
Формулировка:- Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
- Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
-- опять же сама концепция ООП старается помочь нам следовать этому принципу, но если классы (или их группы) не связаны наследованием, но тем не менее кто-то из них более "общий", а кто-то более "частный" - мы должны уже сами сохранять однонаправленную зависимости, избегая перекрестных.
-- эти принципы не являются железно необходимыми в любой ситуации, но следуя им можно создавать масташтабируемый, легко обновляемый код, что очень важно для больших проектов с долгим сроком поддержки.
- Log in to post comments
- 5284 reads
fgh
Wed, 02/10/2021 - 18:31
Permalink
Принцип SINGLE RESPINSIBILITY (единая отвественность).
Класс должен отвечать за что то одно.
При возникновения действия задействовать только один класс.
Простыми словами надо сделать так, чтобы класс не превратился в свалку с изменяющимися методами. У класса не должно быть полно причин, чтобы изменяться.
Пример, как неправильно:
Пример, как правильно (один класс один метод):
Источники информации:
Сайт о SOLID
Просто о SOLID (Принципы ООП)
fgh
Wed, 02/10/2021 - 18:33
Permalink
Принцип OPEN-CLOSED (открытости и закрытости).
Модуль должен быть открыт для расширения но закрыт для изменения. Это необходимо для разработки устойчивого к изменениям приложения. Простыми словами, надо сделать так, чтобы изменения одного класса не затронуло изменения затронутых с ним других классов.
Пример, как неправильно:
Есть массив и цикл перебора массива:
При добавлении нового элемента массива изменяем массив и цикл foreach:
Пример, как правильно:
Если добавляется новый автомобиль мы дополняем массив , но не изменяем цикл foreach.
fgh
Wed, 02/10/2021 - 18:40
Permalink
Принцип LISKOV SUBSTITUTION принцип подстановки "Барбары Лисков"
В разработке.
fgh
Wed, 02/10/2021 - 18:42
Permalink
Принцип Interface Segregation (принцип разделения сущностей).
Сущности не должны зависеть от интрфейсов которые они используют. Класс который имплеметируется от интерфейса не должен содержать в себе ненужные методы (так как эти методы должны быть обязательно описаны). Интерфейс надо декомпозировать.
Пример, как неправильно:
Пример, как правильно:
fgh
Wed, 02/10/2021 - 18:44
Permalink
Принцип DEPENDENCY INVERSION инверсии зависимости
Модули высших уровней не должны зависеть от модулей низких уровней. Оба должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций. Уменьшение межмодульных зависимостей.
class XmlHttpRequestService {}
// low level
class XmlHttpService extends XmlHttpRequestService {
request (url,type) {}
}
// high level
Class Http {
constructor ( ) {}
get (url,options) {}
post (url) {}
}
Interface Connection {
request (url, options)
}
class http {
constructor ( httpConnection impliments Connectionb) {}
get () {}
post () {}
}
class XmlHttpRequestService {
open () {}
send () {}
}
Interface Connection {
request (url, options)
}
class XmlHttpService impliments Connection {
xhr = new XmlHttpRequestService
request (url, type) {
this.xhr.open
this.xhr.send
}
}
Mock