Форум программистов, компьютерный форум, киберфорум
Обо всем!
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/55: Рейтинг темы: голосов - 55, средняя оценка - 4.91
шарпопочитатель
 Аватар для ht1515
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035

SOLID принципы

23.01.2017, 17:55. Показов 17657. Ответов 359
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всего 5 принципов:
1) srp - класс должен описывать только те характеристики, которые на объект из предметной области возложены. То есть либо кот, либо пес, котопес быть не может.
2) ocp - Писать надо классы так, чтобы их можно было легко расширить, но не изменять
3) Лисков - ???
4) делайте много маленьких интерфейсов, один дольшой интерфейс это плохо. Так как рефакторинг усложняется...
5) Инверсия зависимостей. Типо композицию поменяйте на агрегацию


Я не понимаю принцип Лисков. Можете объяснить популярно?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.01.2017, 17:55
Ответы с готовыми решениями:

Нелогичные принципы программирования
Я вспомнил программу, по которой как то начинал изучать программирование на языке С++, код приложу к теме. Программа определяет количество...

SOLID
Здравствуйте, стоит ли использовать правила SOLID в маленьких задачках, например в том же шифре цезаря? Задаюсь таким вопросом потому что...

Нарушен ли solid ?
Привет. Есть например сущности предметной области Нож и Складной Нож. Как вы думаете нужно спроектировать классы в этом случае? ...

359
Заблокирован
24.01.2017, 15:23
Студворк — интернет-сервис помощи студентам
hoggy, ваш пример немного не о том, что я имел в виду. У вас тут коллбек оnClick -- это метод объекта button. Вы просто конкретизируете его, конфигурируете существующий объект. С таким же успехом там мог быть любой другой метод, это просто метод объекта button.
Хз, что Вы имели в виду под:

Цитата Сообщение от hoggy Посмотреть сообщение
паттерн "коллбек" (делегаты) позволяет кнопке вообще не знать ничего о том,
что произойдёт при нажатии.
В вашем примере, как раз, вы явно указываете кнопне, что должно происходить при нажатии, в вашей терминологии кнопка "знает" это

Я имел в виду передачу коллбека в рантайме
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
24.01.2017, 15:35
Цитата Сообщение от asmquest Посмотреть сообщение
В вашем примере, как раз, вы явно указываете кнопне, что должно происходить при нажатии, в вашей терминологии кнопка "знает" это
То просто у костыля лямбдовского синтаксис сразу не понятный.
С нативными делегатами гораздо понятнее будет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Button.CheckState(){
   ...
   if (PressDetected && OnPress) OnPress();
  ...
} 
 
void Lamp.SwitchOn(){
      // ну типа тут спираль накаляем и т.п
}
void main(){
     Lamp lamp;
     Button button;
     button.OnPress=lamp.SwitchOn;
}
Т.е. ни кнопка о лампе ни лампа о кнопке вообще ничего не знают. Знает только дирижер который связывает источник и получатель калбека.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.01.2017, 15:54
Цитата Сообщение от asmquest Посмотреть сообщение
это метод объекта button
это не метод.
это - делегат.

он ничего ни о какой кнопке не знает.

но благодаря ему,
не нужно делать никаких наследников базовой кнопки
только для того, что бы кликнуться.
и не нужно никому знать про то,
что случится при клике.

итого: минус все интерфейсы и их возможные наследники.

Добавлено через 2 минуты
Цитата Сообщение от asmquest Посмотреть сообщение
В вашем примере, как раз, вы явно указываете кнопне, что должно происходить при нажатии, в вашей терминологии кнопка "знает" это
да, я явно указываю, что произойдёт при клике.
только кнопка про это не знает,
и ей это не интересно.

она знает только про себя.
и про то, что когда кликнеццо,
нужно будет пнуть делегат.

а уж что он там будет делать - ей всё равно.

Добавлено через 1 минуту
Цитата Сообщение от asmquest Посмотреть сообщение
Я имел в виду передачу коллбека в рантайме
можно и в рантайме.
0
Заблокирован
24.01.2017, 15:56
Fulcrum_013, по-моему, это все смахивает на демагогию. Никакой объект вообще никогда не знает о том как осуществляется применение его метода к себе(своему окружению), этим занимается реализация языка. Ну, мы можем поверх реализации написать явно свою реализацию того же самого, что и так есть нативно, суть от этого не изменится.

С другой стороны, с точки зрения интерфейса, выражение
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
button.OnPress=lamp.SwitchOn;
конфигурирует объект button таким образом, что он отвечает на сообщение(уведомление о событии клик) таким вот определенным образом. Вы просто написали еще одну реализацию связывания поверх нативной, с точки зрения семантики же ничего не изменилось
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
24.01.2017, 15:57
Цитата Сообщение от asmquest Посмотреть сообщение
и не имеет представления о тех физических процессах
То может реальная лампочка Ильича и не знала . А сущность лампочка в программе как раз и занимается тем что моделирует эти физические законы. Точно так же как и другие сущности типа сущностей выключатель провод и т.п. И для того чтобы модель была цельной эти сущности должны между собой взаимодействовать. Т.е. так или иначе знать интерфейсы друг друга для того чтобы друг с другом стыковаться. При этом сильная завязка на интерфейсы других сущностей снижает гибкость а соответсвенно и возникают вопросы кто кого знать должен а кто кого не должен чтобы как можно меньше переделывать взаимосвязей прирасширении фукнционала/набора сущностей. Делегаты в этом плане дают практически полную свободу от этих знает интерфейс/не знает интефейс, так как для взаимодействия сущностям не нужно знать другую сущность, нужно только чтобы совпадали форматы передаваемых при взаимодействии данных.
Да кстати это когда лампочку Ильича воспевали в притчах, компутеры были ламповые и те все поголовно пережитки загнивающего капитализма. А нонче каждая уважающая себя лампочка имеет внутри контупер который все ее физические процессы физичит (типа фазы синусоидой делает с кос-фи правильным, и т.п )
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
24.01.2017, 15:57
Цитата Сообщение от asmquest Посмотреть сообщение
и не имеет представления о тех физических процессах
То может реальная лампочка Ильича и не знала . А сущность лампочка в программе как раз и занимается тем что моделирует эти физические законы. Точно так же как и другие сущности типа сущностей выключатель провод и т.п. И для того чтобы модель была цельной эти сущности должны между собой взаимодействовать. Т.е. так или иначе знать интерфейсы друг друга для того чтобы друг с другом стыковаться. При этом сильная завязка на интерфейсы других сущностей снижает гибкость а соответсвенно и возникают вопросы кто кого знать должен а кто кого не должен чтобы как можно меньше переделывать взаимосвязей при расширении фукнционала/набора сущностей. Делегаты в этом плане дают практически полную свободу от этих знает интерфейс/не знает интефейс, так как для взаимодействия сущностям не нужно знать другую сущность, нужно только чтобы совпадали форматы передаваемых при взаимодействии данных.
Да кстати это когда лампочку Ильича воспевали в притчах, компутеры были ламповые и те все поголовно пережитки загнивающего капитализма. А нонче каждая уважающая себя лампочка имеет внутри контупер который все ее физические процессы физичит (типа фазы синусоидой делает с кос-фи правильным, и т.п )
0
Заблокирован
24.01.2017, 16:00
Цитата Сообщение от hoggy Посмотреть сообщение
это не метод.
это - делегат.
Тут имеет место недопонимание в силу того, что в истинных ООП-языках, понятие делегат является лишним. Любой метод является первоклассным объектом, и на него можно сослаться откуда угодно, поэтому в нормальных языках, любой метод и так является "делегатом", в Вашей терминологии. И кажущаяся Вам разница между двумя этими вещами обусловлена не принципами проектирования, а ограничениями конкретных языков.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.01.2017, 16:03
Цитата Сообщение от asmquest Посмотреть сообщение
Тут имеет место недопонимание в силу того, что в истинных ООП-языках
дальше не читал.

в след. раз прежде чем что нить написать, подумайте,
как это соотносится с обсуждаемой темой.
в данном случае - solid.
0
Заблокирован
24.01.2017, 16:25
Цитата Сообщение от hoggy Посмотреть сообщение
как это соотносится с обсуждаемой темой.
в данном случае - solid.
Насколько я понимаю, принципы solid претендуют на то, чтобы быть общими принципами проектирования. В противном случае, должны быть явно указаны языки и среды, для которых они являются справедливыми.

Добавлено через 10 минут

Не по теме:

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А нонче каждая уважающая себя лампочка имеет внутри контупер который все ее физические процессы физичит (типа фазы синусоидой делает с кос-фи правильным, и т.п )
для лампочки ильича это не требуется, это нужно только для источкиков с большой долей реактивной нагрузки.



Добавлено через 5 минут
Цитата Сообщение от hoggy Посмотреть сообщение
но благодаря ему,
не нужно делать никаких наследников базовой кнопки
и опять же непонятно для чего "не нужно". Для Вашего случая оно и так не нужно. А для других вещей, таких как совместное использование кода, гибкое управление обобщенным поведением различных кнопок -- нужно.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
24.01.2017, 17:22
Цитата Сообщение от asmquest Посмотреть сообщение
Какой-то невнятный пример. Почему это у Вас кнопка зависит от лампочки, а не наоборот?
Потому что в классе Кнопка был метод void TurnOn(Lamp lamp).
И чтобы скомпилировать модуль с классом Кнопка, нужно указать ссылку на модуль с классом Лампочка.

з.ы. Класс Кнопка не имеет никакого отношения к GUI. Возможно, кроме метода TurnOn() там ничего больше нет.

Добавлено через 6 минут
Цитата Сообщение от asmquest Посмотреть сообщение
Вообще говоря, лампочка всегда будет зависеть от кнопки, а не наоборот, потому что лампочка (как и включабельный) -- это пассивная сторона.
Мягко говоря, это очень глупое заявление.
Если в моём классе Кошка будет метод Летать(Велосипед велик), то Кошка будет зависеть от Велосипеда. И ещё Кошка будет Летать Велосипедом. Пытаться привязать к коду аналогии из жизни на основе совпадения названий чего-нибудь - весьма странное занятие.
0
24.01.2017, 17:25

Не по теме:

Цитата Сообщение от asmquest Посмотреть сообщение
для лампочки ильича это не требуется, это нужно только для источкиков с большой долей реактивной нагрузки.
Энергосберегающая и светодиодка от лампочки Ильичаа далеко ушли. Им хрен знает что промодулированное по частоте 50 герц в качестве питания не пойдеть.

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.01.2017, 17:36
Цитата Сообщение от asmquest Посмотреть сообщение
Насколько я понимаю, принципы solid претендуют на то, чтобы быть общими принципами проектирования.
на топовый c-like

нахрена вообще нужны все эти интерфейсы языку,
концепция которого позволяет ему проворачивать ровно тоже самое,
и без них?

Цитата Сообщение от asmquest Посмотреть сообщение
А для других вещей, таких как совместное использование кода, гибкое управление обобщенным поведением различных кнопок -- нужно.
обобщенное программирование
не имеет никакого отношения к DI.
0
Заблокирован
24.01.2017, 19:06
Цитата Сообщение от hoggy Посмотреть сообщение
нахрена вообще нужны все эти интерфейсы языку,
концепция которого позволяет ему проворачивать ровно тоже самое,
и без них?
Интерфейсы не нужны, естественно, как явная сущность, но какие-то общие принципы и методологии проектирования, и некоторые паттерны вполне применимы.

Добавлено через 7 минут
Цитата Сообщение от Shamil1 Посмотреть сообщение
Потому что в классе Кнопка был метод void TurnOn(Lamp lamp).
И чтобы скомпилировать модуль с классом Кнопка, нужно указать ссылку на модуль с классом Лампочка.
Короче, Вы говорите о зависимости с тз неймспейсов. А речь, вроде, о концептуальной зависимости.

А в вашем примере, ни о каких принципах проектирования речи не идет, на мой взгляд. лампочка и выключатель -- это вещи одного порядка с точки зрения иерархии, и что к чему подключать надо определять исходя из конкретной задачи, в данном случае, тут нет никакого общего принципа. Логичней всего было бы подключать и то и другое к чему то, что использует и то и другое. То есть, Ваш кейз в любом случае плох. И, видимо, опять же, зависим от языка, в данном случае, от особенностей компиляции

Добавлено через 1 час 18 минут

Не по теме:

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Им хрен знает что промодулированное по частоте 50 герц в качестве питания не пойдеть.
лампочка Ильича -- это обычная лампа накаливания. У нее нет никаких особых требований по частоте, уменьшив номинальную частоту Вы просто снизите интенсивность свечения.

0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
24.01.2017, 20:36
Цитата Сообщение от asmquest Посмотреть сообщение
Короче, Вы говорите о зависимости с тз неймспейсов. А речь, вроде, о концептуальной зависимости.
Я говорю о той зависимости, которая упоминается в термине "Инверсия Зависимости". А мой пример показывает, как эту зависимость инверсировать (развернуть).

Цитата Сообщение от asmquest Посмотреть сообщение
лампочка и выключатель -- это вещи одного порядка с точки зрения иерархии
Лампочка и Кнопка - это названия классов. Можно поменять их местами (Лампочка будет включать Кнопку) - и ничего от этого не изменится. О какой иерархии Вы говорите?
0
Заблокирован
24.01.2017, 20:53
Цитата Сообщение от Shamil1 Посмотреть сообщение
Я говорю о той зависимости, которая упоминается в термине "Инверсия Зависимости". А мой пример показывает, как эту зависимость инверсировать (развернуть)
Я пока не вижу там упоминания зависимости выключателя и лампочки.
Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Цитата Сообщение от Shamil1 Посмотреть сообщение
О какой иерархии Вы говорите?
Я говорю об иерархии классов. Например, лампочка является частным случаем осветительного прибора, а выключатель -- частным случаем коммутационного устройства.

Добавлено через 4 минуты
Цитата Сообщение от Shamil1 Посмотреть сообщение
инверсировать (развернуть).
Кстати говоря, я вообще не понял, о какой инверсии/развертке идет речь. Я не вижу никакой инверсии ни в вашем примере, ни в определении "инверсии зависимостей". Видимо, как всегда, кто то что-то не понял, а потом название прижилось. Оно не соответствует сути этого принципа, там ничего не инвертируется

Добавлено через 4 минуты
Shamil1, да и вообще, кстати, не надо тянуть сюда низкоуровневые детали, такие как особенности компиляции и работа модульной системы конкретного языка/языков. Если мы хотим оставаться в рамках конструктивного обсуждения, мы должны придерживаться терминологии ООП, т.е. Класс/тип, экземпляр, объект, сообщение и тд
0
шарпопочитатель
 Аватар для ht1515
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035
24.01.2017, 21:18  [ТС]
Я не обзываю, вы выдрали из контекста и подставили меня! )) их критикуют все просто, а по факту они излагаю все что написано в книге гоф. Теперь вроде разбираюсь, если лисковский принцип понял верно. А так я хз наверно таким макаром, читая гоф можно еще пару принципов предложить.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
24.01.2017, 21:22
Цитата Сообщение от asmquest Посмотреть сообщение
Например, лампочка является частным случаем осветительного прибора, а выключатель -- частным случаем коммутационного устройства.
Неправильно. Лампочка является классом, который мы назвали "Лампочка", а Кнопка - классом, который мы назвали "Кнопка". Если Вам слова мешают понимать смысл, замените их на буквы.

Есть класс А и есть класс Б с методом В(А а). Класс Б зависит от класса А (потому что содержит метод, принимающий аргумент класса А). Ну и дальше так, как я писал выше.

Цитата Сообщение от asmquest Посмотреть сообщение
Кстати говоря, я вообще не понял, о какой инверсии/развертке идет речь. Я не вижу никакой инверсии ни в вашем примере, ни в определении "инверсии зависимостей".
В определении сложно не заметить слово "инверсия".
В моём примере сначала модуль МБ, содержащий класс Б, зависел от модуля МА, содержащего класс А. После добавления интерфейса в МБ и замены типа аргумента в методе В на интерфейс, модуль МА стал зависеть от модуля МБ. "Стрелочка" зависимости развернулась в противоположную сторону.
0
Заблокирован
24.01.2017, 21:30
Цитата Сообщение от Shamil1 Посмотреть сообщение
Есть класс А и есть класс Б с методом В(А а). Класс Б зависит от класса А (потому что содержит метод, принимающий аргумент класса А).
Я не буду спорить, что я не понимаю принцип инверсии зависимостей, но если это соответствует тому что Вы говорите -- это полнейший бред. Это примерно то же самое, что утверждать, что функция зависит от своего аргумента.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
24.01.2017, 21:39
Именно это и называется зависимостью в программировании.
0
Заблокирован
24.01.2017, 21:41
Shamil1, грубо говоря, если некоторая функция принимает аргумент определенного типа, очевидно, что на помент вызова этой функции, этот тип должен существовать. Что значит избавиться от зависимости в данном случае? Когда человек избавляется от головы, он избавляется от зависимости от головы? Отличный способ

Добавлено через 1 минуту
Цитата Сообщение от Shamil1 Посмотреть сообщение
Именно это и называется зависимостью в программировании.
какой прок от этого?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.01.2017, 21:41

Solid Works Api
Здравствуйте! Пишу програмку для Solid Works используя Api. Перестроение проекта, высвечивание элементов занимает много времени. Можно ли...

Пятый принцип SOLID
Здравствуйте. Формулировка пятого принципа гласит о том, что модули верхнего уровня не должны зависеть от модулей нижнего уровня. И те и...

Применение SOLID принципов
Всем доброго времени суток, Есть плохо написанный код машины Тьюринга на Java: package tm; import...

Solid Works Api и C#
Здравствуйте! Подскажите пожалуйста, ресурсы для изучения Solid Works Api на русском. Интересуют такие моменты как, 1. Вставка деталей,...

Тест по SOLID принципам
Нужна помощь по тестам, в принципах вроде как разобрался, но тест очень сильно путает своими вариантами ответов. Хочется узнать мнение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru