Паттерн State (Состояние) | |
---|---|
S-type Сообщений: 2969 Дата регистрации: 24.04.2004 |
На metanit.com описан паттерн State. Почитал статью, возникли вопросы.
|
Паттерн State (Состояние) | |
---|---|
S-type Сообщений: 2969 Дата регистрации: 24.04.2004 |
Во первых, в статье даётся определение:
Цитата: Конечно, это определение корректное, но - очень размытое, и не передающее сути. На мой взгляд, правильно будет: Цитата: Исправлено 2 раз(а). Последнее : S-type, 08.06.18 15:19 |
Re: Паттерн State (Состояние) | |
---|---|
S-type Сообщений: 2969 Дата регистрации: 24.04.2004 |
Во вторых, в статье приводится код, который реализует конечный автомат. Примерно такой:
Жутко не нравится, что используется конструкция:
Это ведь функция с побочным эффектом ru.wikipedia.org На мой взгляд, подобного надо избегать. Как можно изменить код, что бы не было функции с побочным эффектом? Исправлено 3 раз(а). Последнее : S-type, 08.06.18 09:54 |
Re: Паттерн State (Состояние) | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
IMHO оно более корректное и, главное, понятное, в отличие от твоего. Конечный автомат можно реализовать и безо всяких шаблонов state. Кроме того, к его определению можно свести вообще практически всё что угодно - любую программу на шарпе в частности. Наоборот - оно более "конкретное". Во-первых для шаблона state не обязательно выполнение действия будет связано с изменением состояния. Ключевое в шаблоне то, что САМО действие зависит от состояния, а значит изменение состояния вызовет изменение действия. Во-вторых ничего криминального в недетерминированных функциях и функциях с побочными эффектами нет. Я думаю что невозможно написать программу состоящую сплошь из "чистых" функций. Ну точнее написать то можно, но смысла в ней не будет. Создание нового файла, изменение записи и в БД и даже просто вывод текста на экран - это уже "побочный эффект функции". ------------------ WBR, Igor |
Re: Паттерн State (Состояние) | |
---|---|
S-type Сообщений: 2969 Дата регистрации: 24.04.2004 |
Под "конечный автомат" имеется ввиду не "любая программа на C#", а ДКА ru.wikipedia.org Так что, приведённое мной определение корректно с математической точки зрения. Опять таки, можно реализовать ДКА с помощью матрицы переходов, с помощью switch, и при этом обе программы будут попадать под определение Цитата: Но, при этом они не будут реализовывать паттерн State, потому что паттерн State - это именно "объектно-ориентированная реализация КА", когда каждое состояние описывается своим объектом. Но, собственно, мой вопрос был о другом
Т.е. вот такая реализация: Это то же реализация паттерна State?
С этим, безусловно, полностью согласен. Вот только в примере с метанита функция "втихаря" меняет состояние объекта - что IMHO кране не правильно. |
Re: Паттерн State (Состояние) | |
---|---|
S-type Сообщений: 2969 Дата регистрации: 24.04.2004 |
Погуглил. cpp-reference.ru говорится:
Цитата: Выходит, в данном случае функция с побочным эффектом обязательна. Хотя, тут же написано: Цитата: А в случае, если переходом в новое состояние "рулит" Context, то в классы StateN передавать ссылку на Context не нужно. В общем, как то всё мутно Исправлено 1 раз(а). Последнее : S-type, 08.06.18 20:34 |
Re: Паттерн State (Состояние) | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ну этот объект и есть "состояние", так что абсолютно ничего страшного что состояние (автомата в целом) он же и меняет. Более того, это одно из отличий этого шаблона от strategy Т.е. он должен менять текущее состояние в основном объекте.
Впрочем, даже если бы он менял и другие поля - и в этом я не нахожу "крамолы". Этот шаблон есть декомпозиция сложной логики на простые части. Семантически state-классы являются частью своего владеющего объекта, т.е. они не имеют смысла в отрыве от него (в отличие от шаблона strategy). Они вполне могут быть реализована вложенными классами и тупо прописывать то что надо в приватные члены основного класса (если логика реализации отдельного шага требует такого "прописывания"). Они вообще не обязаны быть публичным - при том будут замечательно выполнять свою функцию, разделяя "километровый" монолитный код основных методов на множество маленьких "частичных" реализаций, и формализуя логику перехода из состояния в состояние. По поводу дефиниции - если ты хочешь сказать что "state - это вариант реализации конечного автомата при помощи набора вспомогательных классов описывающих отдельные состояния КА, и содержащих в себе логику перехода из состояния в состояние" - ну с этим можно согласится. Т.к. нельзя называть другие варианты реализации КА "не ООП" В других примерах тоже - вообще это и есть суть шаблона - сделал дело и перевёл автомат в очередное состояние. А "перевод" это и есть присваивание нужного (обычно другого, т.к. чаще идёт переход на "другой" узел графа КА, а не итеративный возврат к тому же самому состоянию) State в свойство/поле основного класса. Твой вариант как раз нарушает этот принцип. Т.к. получается что исполнение логики отдельного шага КА НЕ гарантирует смены состояния всего автомата, а это неправильно. На английской вики, или в других источниках можешь глянуть - вызов setState() (шарповское "присвоение свойству" это и есть вызов спецметода set_State) является непременным признаком этого шаблона. ------------------ WBR, Igor |
Re: Паттерн State (Состояние) | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
+100500 Практически OFF к данному топику, но... Что такое паттерны, и для чего целую книгу написали. Появляется некая задача. До кода еще далеко, нужно придумать алгоритм решения. Вот тут они на помощь и приходят. Тут примеры кода... ну просто некая подсказка, простенький вариант... Вообще, не стоит на нем зацикливаться. Да и сами паттерны))) Часто в коде превращаются в жуткую смесь, медиатора и стэйта))) В общем то, при теоретическом изучении, наверное стоит всего лишь запомнить, отложить в глубине памяти, что есть решение подобных алгоритмов Вот когда приходишь к выводу, при проектировании, что стоит именно этот паттерн применить, можно нагуглить кучу его реализаций, на нужном, или похожих языках ------------------ |
Re: Паттерн State (Состояние) | |
---|---|
S-type Сообщений: 2969 Дата регистрации: 24.04.2004 |
Рад, что мы достигли консенсуса. Спасибо, теперь понятно. |
Re: Паттерн State (Состояние) | |
---|---|
S-type Сообщений: 2969 Дата регистрации: 24.04.2004 |
Вопрос - какие реально (на практике) паттерны применяете? |
Re: Паттерн State (Состояние) | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
"На практике" паттерны применяют даже те, кто про них и слыхом не слыхивал Правда при этом они обычно "изобретают велосипед", и зачастую с квадратными колёсами (поскольку не учитывают какой-нить нюанс, который уже многократно был "обмусолен" при различных реализациях того или иного шаблона). Многие шаблоны "встроены" в языки программирования или системное АПИ - event как самый классический пример.
------------------ WBR, Igor |
Re: Паттерн State (Состояние) | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Ну так сходу точно. Репозиторий, MVC, Singlton О State ... не часто встречается, и в смеси с медиатором))) Прямо лучше не скажешь!) Просто смотришь на какую то хрень, и вдруг думаешь, так это же ОН!) И сразу становится яснее реализация. По крайней мере, к своим знаниям, сразу добавляешь кучу чужих. ------------------ Исправлено 1 раз(а). Последнее : Аспид, 09.06.18 15:01 |
Re: Паттерн State (Состояние) | |
---|---|
S-type Сообщений: 2969 Дата регистрации: 24.04.2004 |
Есть такой анекдот. Приходят однажды журналисты к Альберту Эйнштейну (в некоторых версиях - к Нильсу Бору) взять у него интервью. Смотрят - а у него над дверью висит подкова. Они ему: - Вы верите в эти суеверия? Эйнштейн: - Мне сказали, что подкова помогает даже тем, кто в неё не верит...
Сюда можно добавить: DbContext - это реализация паттерна "Unit Of Work", DbSet<T> - реализация паттерна "репозиторий". Или, если создать программу Core MVC, то можно увидеть что то вроде:
Это использование паттерна Method chainig (цепочка методов). |
Re: Паттерн State (Состояние) | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Когда начинают учить на музыкальных инструментах, очень много внимания, уделяют апплекатуре. (Правильной расстановке пальцев)
Умеющий играть, практически не думает об этом. Он только в сложных местах, задумывается как сподручнее) Я не говорю об Ойстрахе или Рахманинове))) Те видимо всегда на автомате))) Так и тут, привыкаешь к чему то, и не думаешь об этом. Но случаются, необычные сложные моменты, тут и думаешь... куда пальчик поставить) ------------------ |
© 2000-2024 Fox Club  |