Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 1
Регистрация: 11.02.2012
Сообщений: 44

Использование SOLID

15.02.2024, 11:55. Показов 457. Ответов 3

Студворк — интернет-сервис помощи студентам
Всем привет. Помогите, пожалуйста, допереть, как применять SOLID в UNITY.
S - Единственная ответственность. Допустим у нас есть объект класса HUMAN:Monobehaviour, который может ходить и атаковать. Тогда по данному принципу мы должны создать класс MOVEMENT и ATTACK, и в HUMAN инициализировать объекты данных классов, после чего, HUMAN вызывает необходимые методы из объектов соответствующего класса. И обращаться к этим методам извне нужно через human.movement и human.attack.
O - Открытость-закрытость. От HUMAN наследуем RUSSIAN и ENGLISH. Реализуем метод Hello(). Вызывая у Human Hello(), он говорит "Привет" или "Hello" в зависимости от того, какой конретно это класс. при этом мы легко можем добавить еще GERMAN без изменения кода.
L - Принцип Лисков - Тот же пример что и в O, но суть в том, что нам не важно russian, english или german, можем к нему обратиться как к human.
I - Разделение интерфейса. Это подобно S, но для того, чтобы если мы навешиваем интерфейс, нам не пришлось реализовывать лишние методы. Например есть IMovement, который перемещает объект по поверхности и для полета нужен интерфейс IFly, поскольку не все объекты могут летать.
D - Инверсия зависимостей. Допустим есть класс HUMAN и GUN. У Human есть ссылка на объект класса GUN (Gun), и Gun не должен ссылаться на Human. При этом GUN класс абстрактный и имеет дочерние классы PISTOL, SHOTGUN и т.д.

Я все правильно понял?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.02.2024, 11:55
Ответы с готовыми решениями:

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

Solid Edge
как в Visual C++ сделать так чтобы в солиде чертился чертёж? в примерах SDK лазил но так и непонял, как модули подключать? и какие...

SOLID принципы
всего 5 принципов: 1) srp - класс должен описывать только те характеристики, которые на объект из предметной области возложены. То есть...

3
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,217
15.02.2024, 15:09
Цитата Сообщение от Хотя_бы_4 Посмотреть сообщение
Я все правильно понял?

в общих чертах да, но не все так однозначно. один и тот же принцип может реализовываться разными инструментами C# или их сочетанием. и не обязательно все 5 пунктов должны присутствовать в проекте. зависит от конкретного случая. обрати дополнительно внимание еще на патерны проектирования (машина состояний, фабрика, наблюдатель и т.д.)

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

для понимания данной темы нужно время, много инфы перелопатить и практиковаться. краткого ответа тут не дать.
1
1144 / 309 / 159
Регистрация: 30.07.2022
Сообщений: 1,783
Записей в блоге: 4
15.02.2024, 15:39
Цитата Сообщение от Хотя_бы_4 Посмотреть сообщение
S - Единственная ответственность.
и да и нет.
Например: Программа управляющая атомной электростанцией - это тоже единая ответственность(не смотря на миллионы её функций).
А вот если она будет управлять станцией и например системой пожаротушения, то принцип нарушится.
что же касается MOVEMENT, то этот класс будет нарушать принцип единой ответственности, тем, что будет не только двигать объект, но и отслеживать ввод от клавиатуры Input.GetAxis(). а также этот подход может стать антипаттерном. если вы для каждого метода будете отдельный класс создавать вы рано или поздно сломаете себе голову.

Цитата Сообщение от Хотя_бы_4 Посмотреть сообщение
O - Открытость-закрытость
Открыты для расширения. Закрыты для изменений. добавить еще GERMAN без изменения кода в HUMAN тут верно.

Цитата Сообщение от Хотя_бы_4 Посмотреть сообщение
обратиться как к human.
Например у класса russian будет личный метод (Matroshka()-не важно, что он делает) если вы попытаетесь написать
human.Matroshka(); то у вас ни чего не выйдет.
но вы можете из russian вызывать методы созданные в human.
однако в инспекторе в поле human вы действительно сможете поместить класс russian.
хотя правильно будет принцип интерпретировать так "Должна быть возможность вместо базового типа подставить любой его подтип."
а у вас наоборот получается.

Цитата Сообщение от Хотя_бы_4 Посмотреть сообщение
Разделение интерфейса
ну в принципе да.(дополнительно к этому изучите паттерн стратегия)

Цитата Сообщение от Хотя_бы_4 Посмотреть сообщение
Инверсия зависимостей
это не те зависимости о которых подразумевает принцип.
и зачем HUMAN'у знать про GUN? обе сущности должны быть полностью независимыми.


ну как то так.
1
2 / 2 / 1
Регистрация: 11.02.2012
Сообщений: 44
15.02.2024, 19:22  [ТС]
Цитата Сообщение от Gammister Посмотреть сообщение
в общих чертах да, но не все так однозначно. один и тот же принцип может реализовываться разными инструментами C# или их сочетанием. и не обязательно все 5 пунктов должны присутствовать в проекте. зависит от конкретного случая. обрати дополнительно внимание еще на патерны проектирования (машина состояний, фабрика, наблюдатель и т.д.)

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

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

Добавлено через 15 минут
Цитата Сообщение от ieretsumi Посмотреть сообщение
и да и нет.
Например: Программа управляющая атомной электростанцией - это тоже единая ответственность(не смотря на миллионы её функций).
А вот если она будет управлять станцией и например системой пожаротушения, то принцип нарушится.
что же касается MOVEMENT, то этот класс будет нарушать принцип единой ответственности, тем, что будет не только двигать объект, но и отслеживать ввод от клавиатуры Input.GetAxis(). а также этот подход может стать антипаттерном. если вы для каждого метода будете отдельный класс создавать вы рано или поздно сломаете себе голову.
Это да, я и не говорил про то что управление будет в Movement Но все равно спасибо)

Цитата Сообщение от ieretsumi Посмотреть сообщение
Открыты для расширения. Закрыты для изменений. добавить еще GERMAN без изменения кода в HUMAN тут верно.
Например у класса russian будет личный метод (Matroshka()-не важно, что он делает) если вы попытаетесь написать
human.Matroshka(); то у вас ни чего не выйдет.
но вы можете из russian вызывать методы созданные в human.
однако в инспекторе в поле human вы действительно сможете поместить класс russian.
хотя правильно будет принцип интерпретировать так "Должна быть возможность вместо базового типа подставить любой его подтип."
а у вас наоборот получается.
По всей видимости надо еще раз будет разобрать. Так как как-то O и L идут по сути бок о бок.

Цитата Сообщение от ieretsumi Посмотреть сообщение
ну в принципе да.(дополнительно к этому изучите паттерн стратегия)
Да, знаю его) спасибо.

Цитата Сообщение от ieretsumi Посмотреть сообщение
это не те зависимости о которых подразумевает принцип.
и зачем HUMAN'у знать про GUN? обе сущности должны быть полностью независимыми.
Эх. Вот это самое сложное, не понял его совсем. А знать про GUN - это какое оружие у него активировано.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.02.2024, 19:22
Помогаю со студенческими работами здесь

Принципы SOLID
Добрый день. Есть такая задача? Пока не совсем понимаю как правильно организовать структуру классов, какие классы должны быть...

Принципы SOLID
Здравствуйте! Бьюсь над заданием уже неделю, но знаний ООП не хватает для решения:-|. Нужно создать классы фигур треугольник, квадрат,...

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru