
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
25.06.2019, 02:13
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
Интересует шаблон State. Не пойму, как применить его в случае работы с Delphi, если все классы в Delphi - это визуальные компоненты (формы). О каком наследовании может идти речь? На форме имеется ряд кнопок состояний судна. Обработка состояний идет по классике перебором статусов внутри процедуры. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. Обработка вида кнопок в зависимости от статуса Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. Как видите, все достаточно однообразно и муторно. Приведите пример, как можно это в Delphi переписать на шаблон State и стоит ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.06.2019, 02:22
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
Может быть я не вижу гибкости работы с классами или чего-то не знаю, подтолкните в нужную сторону. Пока программировал тупо формами и методами внутри них. Одна форма - один класс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.06.2019, 02:49
|
|||
|---|---|---|---|
|
|||
Шаблоны проектирования в Delphi |
|||
|
#18+
svnvlad, Код: sql 1. 2. Поскольку есть 2 кнопки "На рейде", ввёл 2 состояния ShStNearBy и ShStNearBy2. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Так как состояния могут быть взаимоисключающими, надо бы создать кросстаблицу и проверять набор состояний на валидность. Например, не может быть одновременно ShStArrived и ShStDebarked. Добавление состояния : Код: pascal 1. Если же вообще состояние только одно, то нужен не set, а набор констант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.06.2019, 03:05
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
Victor Cookinsvnvlad, Код: sql 1. 2. Поскольку есть 2 кнопки "На рейде", ввёл 2 состояния ShStNearBy и ShStNearBy2. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Так как состояния могут быть взаимоисключающими, надо бы создать кросстаблицу и проверять набор состояний на валидность. Например, не может быть одновременно ShStArrived и ShStDebarked. Добавление состояния : Код: pascal 1. Если же вообще состояние только одно, то нужен не set, а набор констант. Ну а шаблона State то здесь нет. Там каждое состояние - это отдельный класс со своим поведением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.06.2019, 03:07
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
Victor Cookin, конечно состояние только одно - это работа с конечным автоматом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.06.2019, 03:58
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
Victor Cookin, как-то так наверно... Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.06.2019, 07:28
|
|||
|---|---|---|---|
|
|||
Шаблоны проектирования в Delphi |
|||
|
#18+
svnvladVictor Cookin, как-то так наверно... Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ...здесь главное не перемудрить... для небольшого кол-ва состояний достаточно построить простенький детерминированный конечный автомат: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. Может я что то упустил из сути твоей задачи, и тебе это не подходит, но я обычно реализую таким образом если состояния можно описать set-ами и объект находится всегда в одном из них (а не set of). Если же тебе нужно обрабатывать набор состояний как одно целое (т.е. реагировать на цепочку событий), то здесь как я обычно строю автомат на алгоритме Ахо-Корасика. Пока, думаю, трудозатраты/цена вопроса не соответствуют необходимости в этом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.06.2019, 20:34
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
Просто адовый говнокод. Потому что хардкод. Малейшее изменение и приходится пересобирать проект. Заюзайте чтоле Tag. Там можно сделать 32 битовых статуса. Сделать процедуру RTTI-перебора кнопок и проверки этих статусов. Также следует заюзать некую легковесную БД. Даже ин-мемори. И управлять кнопами произвольно гибко и настраиваемо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 04:44
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
pvv.pas, как вариант, достаточно интересно. Я так понял, что это урезанный вариант классического шаблона Состояние. Суть поста была как раз разобраться с шаблоном State, чем получить рекомендации по конкретной задаче (хотя за это тоже спасибо, может быть шаблон и не нужен). В описании шаблона обычно указывают преимущества: - Избавляет от множества больших условных операторов машины состояний. - Концентрирует в одном месте код, связанный с определённым состоянием. - Упрощает код контекста. https://refactoring.guru/ru/design-patterns/state Я пытаюсь смоделировать шаблон для своей задачи. Пока путаюсь, вот тот код, что я привел, содержит ошибки, в частности, создание экземпляра абстрактного класса, что делать нельзя. Однако как правильно, я еще не разобрался. Где и как создавать экземпляры всех унаследованных классов, конкретизирующих поведение каждого состояния. И, судя по всему, экземпляры нужно создавать в виде Singleton, обращаясь к ним не по Create, а по GetInstanсe, чтобы по ошибке не создать дубликаты состояний. Потом, по приведенному мной коду, переписанному на шаблон State, вовсе не прослеживается, что "для ввода нового состояния достаточно создать соответствующий класс, и не надо переписывать множество условных операторов и пересобирать весь проект" - как видно, для ввода нового состояния придется создать соответствующие процедуры В КАЖДОМ подклассе. Различие лишь в том, что из одного места эта перепись переходит в десятки разных мест. Так в чем преимущество шаблона? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 09:13
|
|||
|---|---|---|---|
|
|||
Шаблоны проектирования в Delphi |
|||
|
#18+
svnvlad... Так в чем преимущество шаблона? Так ведь ты сам ответил на свой вопрос: svnvlad... В описании шаблона обычно указывают преимущества: - Избавляет от множества больших условных операторов машины состояний. - Концентрирует в одном месте код, связанный с определённым состоянием. - Упрощает код контекста. ... Проще говоря - наводит порядок как в голове так и в коде, и, соответственно, упрощает дальнейшее сопровождение. И ещё раз повторюсь: главное не перемудрить и не выгореть на этапе изучения, а то понапишут столько про элементарщину... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 09:52
|
|||
|---|---|---|---|
|
|||
Шаблоны проектирования в Delphi |
|||
|
#18+
svnvlad, состояния в VCL для гуи уже реализовано в виде TAction для присвоения состояния контролу достаточно присвоить ему нужный Action, это и есть "переход" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 10:40
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
kealon(Ruslan)svnvlad, состояния в VCL для гуи уже реализовано в виде TAction для присвоения состояния контролу достаточно присвоить ему нужный Action, это и есть "переход" Тут не о состоянии контролов говорится, а о состоянии системы в целом. Здесь как бы две задачи - сориентировать состояния системы между собой и попутно прорисовать контролы, соответственно состоянию системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 10:42
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
kealon(Ruslan)svnvlad, состояния в VCL для гуи уже реализовано в виде TAction для присвоения состояния контролу достаточно присвоить ему нужный Action, это и есть "переход" Я думал над этим. В дельфи ничего не мешает уже существовать чему-либо типа TAction, как классу состояния системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 10:44
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
kealon(Ruslan)svnvlad, состояния в VCL для гуи уже реализовано в виде TAction для присвоения состояния контролу достаточно присвоить ему нужный Action, это и есть "переход" А что тогда играет роль абстрактного класса State? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 10:48
|
|||
|---|---|---|---|
|
|||
Шаблоны проектирования в Delphi |
|||
|
#18+
вот нахрена смешивать модель с GUI-ём в одну кучу?! какие нахрен батоны? какие нахрен акции? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 10:48
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
kealon(Ruslan), если создать несколько TAction с разными именами, соответственно количеству состояний, и в каждом TAction создать несколько методов, соответствующих переходам, с одинаковыми именами, и осуществлять подмену класса Action, получится ли? Будет ли вызываться одна и та же процедура по имени, с подменой поведения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 10:50
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
Мимопроходящийвот нахрена смешивать модель с GUI-ём в одну кучу?! какие нахрен батоны? какие нахрен акции? это вы про какое именно сообщение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 11:01
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
kealon(Ruslan), не получится. TAction - сквозной элемент GUI, нельзя в разных акциях создать процедуры с одинаковыми именами - они все вываливаются в общий класс формы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 11:26
|
|||
|---|---|---|---|
|
|||
Шаблоны проектирования в Delphi |
|||
|
#18+
svnvladkealon(Ruslan), не получится. TAction - сквозной элемент GUI, нельзя в разных акциях создать процедуры с одинаковыми именами - они все вываливаются в общий класс формы.и не надо TAction это и есть состояние какого-то объекта и одновременно и метод. Контрол же у вас не может вызвать два метода на выбор? ну и зачем козе баян? общее состояние - это комбинация состояний группы контролов, соответственно каждый контрол и вызывает метод из Aсtion (это и есть "процедура с именем", которую вы ищете). В ней вы выполнете нужное действие и прописываете новое состояние системы (задаёте контролам новые состояния, указав им новый Action) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 11:28
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Все вышеуказанные "действия" тоже можно заменить шаблонными методами. Например посмотреть в сторону паттерна "стратегия". Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Таким образом для каждого состояния можно компоновать различные уникальные и не уникальные наборы действий. Ну и соответственно иметь возможность расширять список возможных действий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 11:30
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
kealon(Ruslan)svnvladkealon(Ruslan), не получится. TAction - сквозной элемент GUI, нельзя в разных акциях создать процедуры с одинаковыми именами - они все вываливаются в общий класс формы.и не надо TAction это и есть состояние какого-то объекта и одновременно и метод. Контрол же у вас не может вызвать два метода на выбор? ну и зачем козе баян? общее состояние - это комбинация состояний группы контролов, соответственно каждый контрол и вызывает метод из Aсtion (это и есть "процедура с именем", которую вы ищете). В ней вы выполнете нужное действие и прописываете новое состояние системы (задаёте контролам новые состояния, указав им новый Action) В новом TAction-е будут имена процедур другие. Вы предлагаете каждой кнопке назначать новое имя процедуры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 11:33
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
перепутал TAction и TActionManager. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 11:40
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
Dimonka Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Все вышеуказанные "действия" тоже можно заменить шаблонными методами. Например посмотреть в сторону паттерна "стратегия". Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Таким образом для каждого состояния можно компоновать различные уникальные и не уникальные наборы действий. Ну и соответственно иметь возможность расширять список возможных действий. Паттерн стратегия внутри паттерна State? Насколько я понял, их различие в том, что в State есть ссылка на контекст, а в стратегии нет. Например изнутри процедур конкретного класса состояния есть доступ к самой форме и ее элементам, а в стратегии нет (чтоб к тем же контролам обратиться например). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 11:43
|
|||
|---|---|---|---|
|
|||
Шаблоны проектирования в Delphi |
|||
|
#18+
svnvladВ новом TAction-е будут имена процедур другие. Вы предлагаете каждой кнопке назначать новое имя процедуры?когда вы присваиваете контролу другой Action у него меняется Caption, Enabled, Checked(если есть) и само собой метод OnClick или аналоги т.е. всем отображением и действиями управляет уже новый присвоенный Action ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.06.2019, 11:51
|
|||
|---|---|---|---|
Шаблоны проектирования в Delphi |
|||
|
#18+
kealon(Ruslan)svnvladВ новом TAction-е будут имена процедур другие. Вы предлагаете каждой кнопке назначать новое имя процедуры?когда вы присваиваете контролу другой Action у него меняется Caption, Enabled, Checked(если есть) и само собой метод OnClick или аналоги т.е. всем отображением и действиями управляет уже новый присвоенный Action Ну там 10-20 контролов (кнопок). И кроме кнопок (видимых элементов), есть еще поля и таблицы в базе данных, которым присваиваются значения и выполняются некие процедуры. Вы предлагаете шаблон State сделать наизнанку. Там подменяется класс, внутри которого ряд процедур, на другой класс с таким же набором процедур. А вы предлагаете оставить класс, а менять имена процедур для каджой кнопки. Зачем, если есть уже отработанный шаблон? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=58&tablet=1&tid=2039312]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
164ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
2ms |
| others: | 219ms |
| total: | 514ms |

| 0 / 0 |
