|
|
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Как правильно организовать программу? Прочёл шаблоны проектирования банды черырёх, узнал одну вещь: пересказ из книжкиЕсть интерфейс. Есть "ядро" программы. Передача из интерфейса в ядро и обратно идёт по некоторому "узкому горлу", например, посредством объекта некоего класса Command. Это позволит добавить в программу функцию "отмена". Вопрос: Как организовать класс "Command", чтобы не пришлось его переписывать при малейших изменениях в интерфейсе или ядре. Вопрос: Как вообще грамотно спроектировать интерфейс? Ссылки на книжки, статьи и пр. приветствуются. Ищу давно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2010, 23:20 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Michael Melvin, А тебе нужно команду "отмена" добавлять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 09:08 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Команда "отмена" самая простая и ето РоллБек + РефрешОлл :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 12:04 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Во-первых, паттерн Command - не единственный способ реализации UNDO. Во-вторых, во многих случаях при малейших изменениях интерфейса или ядра Command переписывать не нужно. Есть исключения. И если у тебя такое исключение - пойми, в чем оно состоит или хотя бы расскажи об этом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 12:18 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Упрощённо, выглядит это так. Есть несколько окон (все разные, т.е. объекты разных классов), есть некое "ядро", т.е. группа классов, которая хранит и обрабатывает данные, отображаемые в интерфейсе. Я делал вот так: (это неправильно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 13:07 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Надо же как-то через класс command. Проблема: данных много, как мне вносить коррективы в интерфейс или ядро, не трогая класс command? Вот, надо мне изменить ячейку в таблице, значит, я должен обратиться таблице в классе command, которая должна обратиться к этой таблице в ядре... получается, что эта таблица обязана быть в "command". А там, получается, не только таблица, но и куча других данных... как организовать такой класс - не знаю. В целом, в итоге, вот как должно быть: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 13:10 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Сможет ли кто-нибудь схематично, псевдокоде описать, как должно выглядеть объявление методов и переменных класса Command? Если что-то неясно нарисовал, спрашивайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 13:15 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
мне всегда казалось что банда четырех вполне нормально выложила материал с примерами блек-джеком и шлюхами. Неужели ты думаешь что кто-то будет сидеть и рисовать тебе схемы? У людей выходной, они хотят отдыхать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 14:03 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Надо хранить проперти, которые меняешь в 2-х состояниях - до изменения и после. И от какого они объекта. И в объекте "команд" ввести функции ундо-редо. В дополнение к функции ду. Что они делают - понятно. Одна возвращает проперть в предыдущее состояние, а другая, соответственно, в последующее. При нажатии кнопки "Сохранить" списки пропертей обнуляются. Как-то так в общем и целом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 14:10 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Esofterмне всегда казалось что банда четырех вполне нормально выложила материал с примерами блек-джеком и шлюхами. Неужели ты думаешь что кто-то будет сидеть и рисовать тебе схемы? У людей выходной, они хотят отдыхать. Банду четырёх я читал, они на класс command только намекнули. Как его реализовать - не описывали. Схемы рисовать не надо, просто описать приблизительно так: private: приблизительно такие переменные, такие методы public: примерно такие вот методы для того-то и того-то, вызываются для того-то и того-то CervusElaphusSibiricusНадо хранить проперти, которые меняешь в 2-х состояниях - до изменения и после. И от какого они объекта. И в объекте "команд" ввести функции ундо-редо. В дополнение к функции ду. Что они делают - понятно. Одна возвращает проперть в предыдущее состояние, а другая, соответственно, в последующее. При нажатии кнопки "Сохранить" списки пропертей обнуляются. Как-то так в общем и целом. Вот и вопрос - как должно выглядить "от какого они объекта" - их как-то пронумеровать? Или по адресу передавать? Данные-то от разных объектов - их сериализовать надо? Вот в этом-то и вопросы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 14:19 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Michael Melvin Проблема: данных много, как мне вносить коррективы в интерфейс или ядро, не трогая класс command? Твою картинку можно перерисовать так: слева прога, справа БД, в середине SQL. По сути - тот же паттерн, только не объектный. Ты вносишь изменения в свою программу, не меняя сам язык SQL, правильно ? Вот у тебя должно быть что-то в этом роде - проблемно-ориентированный язык, реализованный в виде класса command. Какой именно - зависит от задачи. Как правило, этот язык строится на основании анализа детальных Use Cases. Которые, к слову, редко меняются (хотя и часто содержат ошибки). Допустим, у тебя есть действие "добавить строку к счету". Ты делаешь в command метод addline, который реализует запоминание того, какая строка была добавлена и заталкивает в стек саму команду addline. Дальше метод undo сможет откатить действие. Создавать же методы типа "создать счет на оборудование", "создать накладную", "создать квитанцию на уплату за газ" - неправильно, тут тебе действительно придется менять command на каждый чих. Вырази свои действия через элементарные операции, и будет тебе щастье. Модератор: Тема перенесена из форума "Просто треп". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 16:00 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Michael Melvin CervusElaphusSibiricusНадо хранить проперти, которые меняешь в 2-х состояниях - до изменения и после. И от какого они объекта. И в объекте "команд" ввести функции ундо-редо. В дополнение к функции ду. Что они делают - понятно. Одна возвращает проперть в предыдущее состояние, а другая, соответственно, в последующее. При нажатии кнопки "Сохранить" списки пропертей обнуляются. Как-то так в общем и целом. Вот и вопрос - как должно выглядить "от какого они объекта" - их как-то пронумеровать? Или по адресу передавать? Данные-то от разных объектов - их сериализовать надо? Вот в этом-то и вопросы Это зависит от платформы, на которой разрабатывать. В частности на .NET, например, есть такая штука как отражение. Т.е. имя объекта и имя его проперти можно сохранять в коллекции как простой стринг. Т.е. создаём класс - описатель со свойствами имя объекта, имя проперти, тип данных и значение. Это всё засовываем в коллекцию. Какую-нибудь хэш-таблицу. И с помощью отражения уже обрабатывать. Кроме того есть атрибуты. Атрибуты вообще могут поменять взгляд на классическое применение шаблонов, как они описаны у тех же четырёх бандитов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 16:14 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Вот я тоже смотрел в сторону БД. Фактически, там используется сериализация в строку-запрос, которая и анализируется. Но вот думаю, а правильно ли применять такой метод для взаимодействия между интерфейсом и ядром... YossarianСоздавать же методы типа "создать счет на оборудование", "создать накладную", "создать квитанцию на уплату за газ" - неправильно, тут тебе действительно придется менять command на каждый чих. Вырази свои действия через элементарные операции, и будет тебе щастье. вот!! вот!! В том-то и вопрос! Ведь "создать квитанцию на уплату за газ, используя данные, отмеченные галочками за такой-то и такой-то период с такой-то степенью детализации" - это действие по анализу данных. По идее, обработка должна быть в ядре. По первой нарисованной мною схеме я бы просто из ядра вызвал бы метод: void СозданиеОтчётаЗаГаз(МассивГалочек, 1 /*квартал*/ , 3 /*развернуто*/, таблРезультат /*в эту таблицу записать результат для вывода на форму в Grid*/ ); и всё. Но как такой вот вызов пропустить через класс command? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 16:22 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Michael Melvin Ведь "создать квитанцию на уплату за газ, используя данные, отмеченные галочками за такой-то и такой-то период с такой-то степенью детализации" - это действие по анализу данных. По идее, обработка должна быть в ядре. Воо. Вот она, проблема. Дело в том, что многие писатели умных книжек для простоты предполагают, что развитой бизнес-логики как бы нет. (ну или она на уровне "сумма перевода не может быть больше 10000$") То есть в базе лежит то же, что видно в формах. В этом случае, действительно, все так, как ты нарисовал. В твоем случае, похоже, нужен еще один объектный слой, отвечающий за преобразование данных. Тогда паттерн command будет жить не между интерфейсом и ядром, а между слоями ядра. Главное - спроектировать так, чтобы 1) не было обходных путей 2) язык команд не был слишком низкоуровневым. Однако я бы посмотрел на другие способы реализации undo-redo, например, на вариант сохранения полного текущего состояния объекта. Это дорого, зато не требует паттерна command ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 16:33 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Отличные идеи подкинул! Единственное, сохранение полного состояния не пойдёт. Когда данных реально дохрена, а отменить надо значение ввода в ячейку... и отмен нужно около 50 или вообще неизвестно, сколько заказчик запросит - то не пойдёт. Так в PAINT'е реализовано: сохраняется полная картинка, вот и отмен там всего-то 3 штуки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 16:40 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Michael MelvinОтличные идеи подкинул! Единственное, сохранение полного состояния не пойдёт. Когда данных реально дохрена, а отменить надо значение ввода в ячейку... и отмен нужно около 50 или вообще неизвестно, сколько заказчик запросит - то не пойдёт. Так в PAINT'е реализовано: сохраняется полная картинка, вот и отмен там всего-то 3 штуки. я бы сделал так: бс = Базовое состояние. оч = очередь команд. При срабатывании конкретного события, добавлять событие с аргументами в очередь. При срабатывании любого события, заново строить Текущее состоянии, последовательно применяя к бс(не изменяя старый объект бс). Если в оч накопится больше команд чем, максимальное(например 15). то применить первую команду очереди к бс, и заменить старое бс на новое. и удалить данную команду из очереди. Для отмены, выкинуть из очереди команду. При изменении интерфейса лишь добавляем\изменяем новые события с необходимыми аргументами(аргументом является объект реализующий интерфейс команда). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 17:45 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Michael Melvin Точно не помню, но чтобы работал Command нужна какая-то инфраструктура. ПС. Лет 10 назад я-бы спокойно взял Win32API, и без всякий знаний от "шайки четырех" слабал бы свой собственный Paint с поддержкой Undo (причём оптимально, без оверхеда). Сегодня, как ты, сижу и думаю как-бы эдак похитрее и концептуальнее сделать простой ETL из базы. Уж интерфейсов нарисовать штук двадцать а воз и ныне там. Имплементации в них нет как нет. Многие знания умножают печаль... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 17:46 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNТекущее состоянии, последовательно применяя к бс(не изменяя старый объект команды из очереди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 17:47 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
отменяемые команды, тоже желательно сохранять в стек отмененных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 17:50 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN отменяемые команды, тоже желательно сохранять в стек отмененных . Фраза понравилась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 22:41 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
maytonZyK_BotaN отменяемые команды, тоже желательно сохранять в стек отмененных . Фраза понравилась. для того, что-бы можно было отменить отмену отмененной ранее команды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 22:47 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Michael Melvin Единственное, сохранение полного состояния не пойдёт. Когда данных реально дохрена, а отменить надо значение ввода в ячейку... и отмен нужно около 50 или вообще неизвестно Как бы паттерн Command и нужен для того, чтобы не хранить ПОЛНОЕ состояние, а только изменения. А как сделать -- да легче всего взять книгу, да прочитать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 23:24 |
|
||
|
Кто что скажет по шаблонам проектирования программ?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2010, 21:17 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36940065&tid=1343336]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
191ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 213ms |
| total: | 521ms |

| 0 / 0 |
