Несколько месяцев опасался этого паттерна и постоянно городил костыли как раз через enum'ы. А стоило всего лишь пару дней посидеть и разбираться, столько нервов потом сэкономил.. Ролик классный, спасибо огромное)
Этот канал просто сокровище, наконецто без воды, с примерами не про зарплату и банки а из геймдева, нормальная речь без эээ и нуу, отличная подача материала, обязательно продолжай курс паттернов
крайне редко пишу комментарии, но это видео и канал в целом - самое настоящее сокровище, таких подробных объяснений днем с огнем не сыщешь, один только пример чего стоит, после которого, кстати, в голове все стало на свои места) огромное спасибо за ваш труд, Сергей
Я фронтендер. Пыталась понять, так зачем же нужен этот паттерн. Глянула несколько видео, но именно благодаря твоему видео я поняла, что к чему. У тебя отличное объяснение и наглядный пример! Примеры из других видео словно слишком неестественные и использование паттерна там кажется неоправданным. Благодарю за видео! У тебя отлично получается!
крутая подача много полезной инфы, понятно абсолютно все, спасибо что такие каналы существуют, единственное могу посоветовать повесить мягкие треугольники что бы убрать эхо, а так большое спасибо тебе Сергей за твои видео
Я очень долго жил в почти пустой комнате, отчего такое эхо и было. Но теперь я как многие начинающие ютуберы буду вещать в шкаф забитый одеждой, эхо больше не будет беспокоить)
Супер крутые гайды, по паттернам! У меня вопрос не большой: Клиентом же не обязательно должна быть условная фабрика. Если, например, у меня есть какое-то объект, на который другие системы(классы, объекты) должны повлиять. Я могу в каждой другой системе создавать такую команду? Например, если в этой игре была, какая-то сущность, которая тоже создавалась и добавляла свои ходы? Или эти системы просто будут содержать сслыку на фабрику все команд?
Я бы все таки старался придерживаться принципа SRP и так или иначе сделал бы, чтобы в итоге фабрика была в одном месте и только она создавала бы команду. Наверное - это можно делать посредством ивентов - в вашей новой системе что-то происходит - она отправляет событие - кто-то на данное событие реагирует и вызывает фабрику
Спасибо за видео. Очень познавательно, как всегда. У меня вопрос есть, буду очень рад, если ответите. Есть, к примеру программа, которая сделана по шаблону MVC, к примеру, могу ли я её теперь использовать как блок, чтобы вставить в другую программку, сделанную на MVC ?? То есть это может выглядеть подобным образом: MVC1( MVC2, MVC3 (MVC4...)). Просто я не очень понимаю момент дальнейшего расширения. Если его и можно вставить подобным образом, то куда это вставляется, моё предположение что в модель, но может и по другому как-то по хитрому ??
MVC это ничто иное как слои. Слой данных + слой логики + слой вида. Если и переносить в другую программу то скорее типа такого M1+M2+M3/V1+V2+V3/C1+C2+C3. Тут у меня в шаверме мввм но думаю идея понятна) github.com/Haywaar/ShawarmaFight/tree/main/Assets/_Project/Develop/MVVM
@@sergeykazantsev1655 Спасибо за ответ, всё проанализирую. Просто вот я подумал, если я сделаю, игровой автомат в стиле MVC, то как сделать казино в стиле MV(C, P, VM) из этих автоматов, к примеру. Казино же содержит List. А Slot - это уже реализованный автомат MVC.
4:10 > клиент внедрил в команду ссылку на ресивер Это обязательно? Допускается ли, что в классе конкретной команды в методе `execute` уже используется нужный `receiver`? Т.е. на 13:19 ресивер не достается из входящих параметров конструктора, а просто прописан непосредственно в execute.
Согласно паттерну, да, обязательно. Если в методе execute у вас есть входные параметры, КАЖДАЯ команда обязана их передать. А так как команды могут быть очень разнообразными - рано или поздно это вылезет бессмысленной передачей неиспользуемого параметра.
@@sergeykazantsev1655 Я имею ввиду, можно ли вообще не передавать ресивер в виде параметра class MoveCommand extends Command { x: number; y: number; constructor(x, y) { this.x = x; this.y = y; } execute() { myCustomReceiver.move(this.x, this.y); } } а в client вот так создаем команду: new MoveCommand(2, 5); это нормально для данного паттерна?
Я думаю можно, но кто тогда если не ресивер будет что-то делать?) в вашем примере вот есть тот же MyCustomrReceiver, а как он туда попадёт? Или вы его планируете с нуля создавать?
Доброго времени суток. Возник вопрос не по теме видео, но он терзает меня уже какое-то время. У объекта класса есть возможность задать его приватные поля через Init метод или через свойства. Не значит ли это, что условный читер легко сможет накрутить себе бесконечный счет/здоровье/урон? Мб просто чего-то не понимаю в этой системе
Переформулировал запрос для гугла и наконец нашел ответ на свой вопрос. Модификаторы доступа вообще ничего не решают с точки зрения информационной безопасности. Видимо не правильно понимал формулировку о влиянии на объект извне. Пора удариться в информационную безопасность :D
По моему опыту - читеры обычно взламывают данные, они копаются в кэше игры и получают доступ к тем же PlayerPrefs, что позволяет довольно легко всё взломать, либо по принципу artmoney - отслеживают значение переменной и в какой-то момент отсеивают все ненужные и изменяют её. Есть способы защиты: 1) Хранить данные в сконвертированном хитром формате. Например у вашего игрока 100 монет, а в памяти вы храните всегда на 123 монеты больше. То есть у вас в памяти gold = 223, а на дисплее вы отображаете 223-123=100. Читер в памяти значение 100 найти не может и взломать тоже не может 2) Если есть соединение с сервером можно валидировать значения на клиенте и на сервере. Условно есть информация на сервере что у вас 100 монет а на клиенте внезапно стало 10000000 монет. Сервер явно поймёт что это фигня и поправит вам ваше значение Отдельная история это спидхаки, если нет сервера - от них защищаться сложнее всего но это отдельная история
Нравится практическая направленность канала. Но, пардон за моё брюзжание. Заметил грубую ошибку в подаче материала: если что-то написал, обязательно объясняй словами. Что значит "AddHealth" в "Определение"? Ты, и другие опытные программисты различают add (увеличить) и push (добавить в конец), но многие новички пишут addObject (к тому же в csharp'e как я понял Add == push). Да, из контекста, новичок поймёт что к чему, но на это уйдёт время, а так как ты не говорил об этом, то мозг, скорее всего, пропустит диаграмму и... зря. Потому что, её рассмотрение / обсуждение сразу же объясняет паттерн. Перенеси правую часть диаграммы влево, когда появляется "Команда -- отдельный объект". При "Наполнять параметрами" покажи что-то вроде commands.Add(new AddHealthCommand(value)) или commands.Add(() => player->AddHealth(value)). И аналогично по другим пунктам.А далее просто усложняй примеры.
Ты святой. Если я когда-либо выйду в область игровой индустрии со своим детищем, я укажу тебя в титрах как того, кому я особенно благодарен за помощь
Несколько месяцев опасался этого паттерна и постоянно городил костыли как раз через enum'ы. А стоило всего лишь пару дней посидеть и разбираться, столько нервов потом сэкономил..
Ролик классный, спасибо огромное)
Этот канал просто сокровище, наконецто без воды, с примерами не про зарплату и банки а из геймдева, нормальная речь без эээ и нуу, отличная подача материала, обязательно продолжай курс паттернов
крайне редко пишу комментарии, но это видео и канал в целом - самое настоящее сокровище, таких подробных объяснений днем с огнем не сыщешь, один только пример чего стоит, после которого, кстати, в голове все стало на свои места)
огромное спасибо за ваш труд, Сергей
Найс! Отличное объяснение моего любимого паттерна!
Спасибо большое!!!! Как раз летом буду делать головломку с программированием действий, ох как же меня выручили 😅
Я фронтендер. Пыталась понять, так зачем же нужен этот паттерн. Глянула несколько видео, но именно благодаря твоему видео я поняла, что к чему. У тебя отличное объяснение и наглядный пример!
Примеры из других видео словно слишком неестественные и использование паттерна там кажется неоправданным.
Благодарю за видео! У тебя отлично получается!
О, супер, спасибо за видос! Когда-то у меня дойдут руки до ртс, там этот паттерн распробую на полную)
Хорошо постарались. С головоломкой отличный пример вышел. Я в неё почему-то сыграть захотел
Надо только посложнее уровни сгенерить )
@@sergeykazantsev1655 и добавить лимит на количество ходов
крутая подача много полезной инфы, понятно абсолютно все, спасибо что такие каналы существуют, единственное могу посоветовать повесить мягкие треугольники что бы убрать эхо, а так большое спасибо тебе Сергей за твои видео
Я очень долго жил в почти пустой комнате, отчего такое эхо и было. Но теперь я как многие начинающие ютуберы буду вещать в шкаф забитый одеждой, эхо больше не будет беспокоить)
@@sergeykazantsev1655 это очень радует)
как всегда лучший
Приятно наблюдать за развитием качественного канала. Думал что за броситься, но нет пока держаться.Очень сильно помогли с SOLID
Спасибо за шикарный контент!)
повезло наткнуться на канал, надеюсь, вы наберёте побольше аудитории и люди станут писать код грамотнее!
Comfor minus - в голос))
Кайф, спасибо за видео!)
Балдеж
Супер крутые гайды, по паттернам!
У меня вопрос не большой:
Клиентом же не обязательно должна быть условная фабрика.
Если, например, у меня есть какое-то объект, на который другие системы(классы, объекты) должны повлиять. Я могу в каждой другой системе создавать такую команду?
Например, если в этой игре была, какая-то сущность, которая тоже создавалась и добавляла свои ходы? Или эти системы просто будут содержать сслыку на фабрику все команд?
Я бы все таки старался придерживаться принципа SRP и так или иначе сделал бы, чтобы в итоге фабрика была в одном месте и только она создавала бы команду.
Наверное - это можно делать посредством ивентов - в вашей новой системе что-то происходит - она отправляет событие - кто-то на данное событие реагирует и вызывает фабрику
круто разжевал
Спасибо за видео. Очень познавательно, как всегда.
У меня вопрос есть, буду очень рад, если ответите. Есть, к примеру программа, которая сделана по шаблону MVC, к примеру, могу ли я её теперь использовать как блок, чтобы вставить в другую программку, сделанную на MVC ?? То есть это может выглядеть подобным образом: MVC1( MVC2, MVC3 (MVC4...)). Просто я не очень понимаю момент дальнейшего расширения. Если его и можно вставить подобным образом, то куда это вставляется, моё предположение что в модель, но может и по другому как-то по хитрому ??
MVC это ничто иное как слои. Слой данных + слой логики + слой вида. Если и переносить в другую программу то скорее типа такого M1+M2+M3/V1+V2+V3/C1+C2+C3.
Тут у меня в шаверме мввм но думаю идея понятна)
github.com/Haywaar/ShawarmaFight/tree/main/Assets/_Project/Develop/MVVM
@@sergeykazantsev1655 Спасибо за ответ, всё проанализирую.
Просто вот я подумал, если я сделаю, игровой автомат в стиле MVC, то как сделать казино в стиле MV(C, P, VM) из этих автоматов, к примеру. Казино же содержит List. А Slot - это уже реализованный автомат MVC.
Ну, тут как вам будет удобнее и яснее. Вообще главное разделить логику на три слоя. Для казино это особенно важно
Здраствуйте, ждать ли видос про патерн стратегию?
Пока делаю материалы по декоратору и mvvm на практике, так что наверное в ближайшие два месяца точно нет :/
Хорооош)
4:10
> клиент внедрил в команду ссылку на ресивер
Это обязательно?
Допускается ли, что в классе конкретной команды в методе `execute` уже используется нужный `receiver`?
Т.е. на 13:19 ресивер не достается из входящих параметров конструктора, а просто прописан непосредственно в execute.
Согласно паттерну, да, обязательно.
Если в методе execute у вас есть входные параметры, КАЖДАЯ команда обязана их передать. А так как команды могут быть очень разнообразными - рано или поздно это вылезет бессмысленной передачей неиспользуемого параметра.
@@sergeykazantsev1655 Я имею ввиду, можно ли вообще не передавать ресивер в виде параметра
class MoveCommand extends Command {
x: number;
y: number;
constructor(x, y) {
this.x = x;
this.y = y;
}
execute() {
myCustomReceiver.move(this.x, this.y);
}
}
а в client вот так создаем команду:
new MoveCommand(2, 5);
это нормально для данного паттерна?
Я думаю можно, но кто тогда если не ресивер будет что-то делать?)
в вашем примере вот есть тот же MyCustomrReceiver, а как он туда попадёт?
Или вы его планируете с нуля создавать?
@@sergeykazantsev1655 myCustomReceiver будет импортирован в файл, где объявлен класс MoveCommand
@@sergeykazantsev1655 экземпляр myCustomReceiver просто импортируется в файл, где объявлен класс MoveCommand.
Как-то так)
спасибо!
Доброго времени суток.
Возник вопрос не по теме видео, но он терзает меня уже какое-то время.
У объекта класса есть возможность задать его приватные поля через Init метод или через свойства. Не значит ли это, что условный читер легко сможет накрутить себе бесконечный счет/здоровье/урон? Мб просто чего-то не понимаю в этой системе
Переформулировал запрос для гугла и наконец нашел ответ на свой вопрос.
Модификаторы доступа вообще ничего не решают с точки зрения информационной безопасности.
Видимо не правильно понимал формулировку о влиянии на объект извне.
Пора удариться в информационную безопасность :D
По моему опыту - читеры обычно взламывают данные, они копаются в кэше игры и получают доступ к тем же PlayerPrefs, что позволяет довольно легко всё взломать, либо по принципу artmoney - отслеживают значение переменной и в какой-то момент отсеивают все ненужные и изменяют её.
Есть способы защиты:
1) Хранить данные в сконвертированном хитром формате. Например у вашего игрока 100 монет, а в памяти вы храните всегда на 123 монеты больше. То есть у вас в памяти gold = 223, а на дисплее вы отображаете 223-123=100. Читер в памяти значение 100 найти не может и взломать тоже не может
2) Если есть соединение с сервером можно валидировать значения на клиенте и на сервере. Условно есть информация на сервере что у вас 100 монет а на клиенте внезапно стало 10000000 монет. Сервер явно поймёт что это фигня и поправит вам ваше значение
Отдельная история это спидхаки, если нет сервера - от них защищаться сложнее всего но это отдельная история
@@sergeykazantsev1655 вау. Не ожидал получить столь информативный ответ. Большое спасибо! Ты очень крут!
Нравится практическая направленность канала. Но, пардон за моё брюзжание. Заметил грубую ошибку в подаче материала: если что-то написал, обязательно объясняй словами. Что значит "AddHealth" в "Определение"? Ты, и другие опытные программисты различают add (увеличить) и push (добавить в конец), но многие новички пишут addObject (к тому же в csharp'e как я понял Add == push). Да, из контекста, новичок поймёт что к чему, но на это уйдёт время, а так как ты не говорил об этом, то мозг, скорее всего, пропустит диаграмму и... зря. Потому что, её рассмотрение / обсуждение сразу же объясняет паттерн. Перенеси правую часть диаграммы влево, когда появляется "Команда -- отдельный объект". При "Наполнять параметрами" покажи что-то вроде commands.Add(new AddHealthCommand(value)) или commands.Add(() => player->AddHealth(value)). И аналогично по другим пунктам.А далее просто усложняй примеры.
Это ни капли не легкий паттерн, если сравнивать с другими.
Сударь, у вас очепятка в описании. "сылка на гитхаб на проект"
Исправил, благодарю!)
Top
А еще инвокер иногда дает кривой санстрайк)
А иногда даже не кривой)
ошибка в названии
Исправлено, спасибо