Форум Сообщества Аналитиков

×


Вопросы о диаграмме деятельностей(Прочитано 16561 раз)
Re: Вопросы о диаграмме деятельностей Ответ #15 : 19 Декабря 2011, 15:01:34
И они реально разные. Каждый класс решает свою подзадачу. Один класс - набор цифр, второй - набор запятой, третий - ввод символа операции, четвёртый - запись операнда в очередь, пятый - вычисление всего выражения, сколько бы операций в нём не было. Такой вот постфиксный калькулятор, запоминающий много операций.



Re: Вопросы о диаграмме деятельностей Ответ #16 : 19 Декабря 2011, 15:55:01
Я не обижаюсь. Ты меня не оскорблял, а то, что не согласен с чем-то, так это даже прекрасно.
Говоря про нарушение стиля ООП я имел в виду один из основных принципов: отделение представления от модели.

Кнопка - интерфейсный элемент, Табло тоже. Цель кнопки - получить команду извне(среагировать на событие) и передать его дальше. Кому? ну некому обработчику, который знает куда ее передать. Он - этот обработчик -подумает и вызовет или очередь или стек  и т.п.

Вопрос зачем? Ответ повторность использования, модифицируемость. Опять же реализуется принцип ООП: открытость для расширения, закрытость для модификации....



Re: Вопросы о диаграмме деятельностей Ответ #17 : 20 Декабря 2011, 07:49:59
И решает каждый класс свою подзадачу: набор цифры, набор запятой, помещение операнда в очередь, помещение символа операции в очередь и рассчёт. Это калькулятор такой для длинных постфиксных выражений.



Re: Вопросы о диаграмме деятельностей Ответ #18 : 20 Декабря 2011, 10:32:07
Кнопка - интерфейсный элемент, Табло тоже. Цель кнопки - получить команду извне(среагировать на событие) и передать его дальше. Кому? ну некому обработчику, который знает куда ее передать.
Согласен, но у меня обработчик зашит в метод. Или это тоже ошибка? Например, в метод "+ void Нажать()" класса "цифровая кнопка" зашит вызов "Табло::+ void Добавить(n:char)", причём, этот вызов - действие внутри метода, а "-char n" - атрибут класса "цифровая кнопка". Это зашито в метод. У запятой в методе уже два действия, второе - вызов операции блокирования самой кнопки, а та операция уже пишет атрибут "- bool Заблокировано", если он true, то в следующий раз операция "Нажать" уже не вызывается. Ну и так далее. Так что скорей уж пору поинтересоваться, не переборщил ли я с ООПом. Не будет ошибкой зашивание обработиков в методы? Мелкософтовый c++ позволяет из оконной процедуры (а именно она контролирует допустимость операций и централизует диспетчеризацию сообщений, предназначенных классу) вызвать что угодно, включая члены классов, лишь бы оно было доступно в глобальной области видимости + можно ключевым словом friend отменить все спецификаторы видимости одного класса в отношении конкретной функции, в том числе, оконной процедуры, а если и этого мало - friend ещё в одном классе и его спецификаторы тоже перестают распространяться на данную функцию. А так как пишу я именно на мелкософтовом c++, то реализовать такую модель могу, но сама оконная процедура формально не может быть членом класса.
« Последнее редактирование: 20 Декабря 2011, 10:33:47 от taras_aa »



Re: Вопросы о диаграмме деятельностей Ответ #19 : 20 Декабря 2011, 10:41:51
Вопрос зачем? Ответ повторность использования, модифицируемость. Опять же реализуется принцип ООП: открытость для расширения, закрытость для модификации....
Так ведь именно на классах основано повторное использование. Наследуем от класса и метод-обработчки тоже наследуется. А для не связанных классов он не имеет смысла. Да и доступ из него нужен к атрибутам объекта, а они могут быть закрыты. Одну оконную процедуру френдануть - не велико отступление, а все обработчики френдить=прощай инкапусляция. Да и обработчики по смыслу все общедоступные, их не проблема вызывать и без френда, только завернуть исходники блокируемых обработчиков в альтернативы, проверяющие допустимость операции, но уже на уровне реализации, а не модели.



Re: Вопросы о диаграмме деятельностей Ответ #20 : 20 Декабря 2011, 14:24:39
Говоря про нарушение стиля ООП я имел в виду один из основных принципов: отделение представления от модели.
И где же у меня в кнопке хвосты от реализации стека и очереди? Если они ограничены, то могут в качестве внутреннего представления юзить массивы. А можно сделать списки. Очередь будет односвязной, а стек двусязным. А можно на динамических массивах. Можно вообще на файлах сделать. От модели системы в целом это представление как раз и отделено, выбор же самих интерфейсов очереди и стека вытекает из нотации. Не из нотации UML, конечно. А из нотации самих выражений, для которых этот калькулятор предназначен. Инфиксному нужно дерево, постфиксному - одновременно стек и очередь.



Re: Вопросы о диаграмме деятельностей Ответ #21 : 20 Декабря 2011, 14:28:28
Для того, чтоб постфиксное выражение посчитать без стека и очереди, придётся его транслировать в другую форму. Для того, чтоб инфиксное выражение посчитать без рекурсии и без даже неявного древовидного представления, его надо транслировать в другую форму.



Re: Вопросы о диаграмме деятельностей Ответ #22 : 20 Декабря 2011, 15:47:12
Тарас, объединяй посты. Чего флудишь

Вопрос о диаграмме деятельности выродился в детали реализации. Исходная ошибка  - модель идет после реализации, нужно постараться научиться делать наоборот. Иначе диаграмма просто малополезна - код информативнее.
« Последнее редактирование: 20 Декабря 2011, 15:50:50 от Galogen »



Re: Вопросы о диаграмме деятельностей Ответ #23 : 20 Декабря 2011, 16:09:25
Я и делаю наоборот. Нотация математического выражения - это не реализация, а часть постановки. Задача: разработать калькулятор, поддерживающий длинные выражения с бинарными операторами: +, -, *, / (разделить), в постфиксной нотации, в которой операторы не имеют приоритетов, указываются после своих операндов, а порядок их исполнения определяется порядком их следования в выражении, при вычислении значения такого выражения возвращаться по выражению назад нельзя, но одним, или обоими операндами могут быть результаты предшествующих операций, выражение просматривается вперёд, пока не встретится оператор, при этом каждый встреченный операнд помещается в стек, а как только встретился оператор, из стека извлекаются последние элементы в количестве операндов данного оператора, после чего он выполняется над извлечённыи данными и его результат помещается в стек. Это постановка задачи. Разумеется, все её особенности оказались в модели. Реализацией же я пока не занимался вообще. И на чём будут реализованы очередь и стек - пока ни закорючки. Скорее всего это будут динамические массивы, а не списки, но в модели этого пока нет.
« Последнее редактирование: 20 Декабря 2011, 16:11:46 от taras_aa »



Re: Вопросы о диаграмме деятельностей Ответ #24 : 20 Декабря 2011, 17:50:34
В любом случае необходимо отделить детали интерфейса от алгоритма.

Для начала можно нарисовать две диаграммы деятельности, не используя плавательные дорожки:
- 'Формирование постфиксного выражения'
(Ввод символа - их, видимо, три типа - цифра, запятая, знак. Вероятно, еще разделитель. Комбинация цифр и запятой составляет операнд. Операнды и знаки добавляются в очередь)
- 'Вычисление постфиксного выражения'
Примерно то, что на Вашей диаграмме, но без дорожек. Или, по крайней мере, без кнопки и табло. А то из диаграммы можно сделать вывод, что пользователь для получения результата выражения должен сорок раз на кнопку 'Расчет' нажать.

Можно еще отдельно - 'Проверка постфиксного выражения' - пригодится.

А действия пользователя с калькулятором изображать на отдельных диаграммах - если это потребуется.



Re: Вопросы о диаграмме деятельностей Ответ #25 : 20 Декабря 2011, 18:19:33
Вот, рыбка приплыла, хвостиком махнула. и все сделала ясным и понятным:)



Re: Вопросы о диаграмме деятельностей Ответ #26 : 21 Декабря 2011, 05:41:10
Или, по крайней мере, без кнопки и табло.
А то из диаграммы можно сделать вывод, что пользователь для получения результата выражения должен сорок раз на кнопку 'Расчет' нажать.
Зачем 40 раз запускать цикл? Но если нужны значения сорока выражений, то именно так. За один раз ровно одно выражение. Пусть длинное, но одно. А если не понятно, что это цикл, так и без табло будет тоже самое и надо исправлять именно изображение цикла. И без кнопки как она вообще получится, если алгоритм зашивается в кнопку? Причём, пользовательский интерфейс от алгоритма вроде отделён. Я пока не указал, будет ли калькулятор даже десятичным, или шестнадцатеричным. А может вообще вавилонская система будет. Это пока ни где не указано. Знак числа - это унарный -, а у меня предусмотрен только бинарный. Хотя, в принципе можно сделать и унарный на том же классе, что и запятая. А можно так: -4+68+2*4 записывать как
0
4
-
68
2
4
*
+
2*(-3+4) как
2
0
3
-
+
*
или как
2
4
3
-
*
. То есть знака числа нет, он может быть не введён и это не помешает использовать отрицательные числа.



Re: Вопросы о диаграмме деятельностей Ответ #27 : 21 Декабря 2011, 05:46:49
Вероятно, еще разделитель.
А вот разделителей быть не может, символы набираются на табло, а в том месте, где водоплавающим видится разделитель, должна быть нажата управляющая кнопка - кнопка помещения уже готового операнда целиком в очередь. Не в строку, а в очередь, следующий помещённый в очередь операнд будет уже другим элементом и отделяется безо всяких разделителей.



Re: Вопросы о диаграмме деятельностей Ответ #28 : 21 Декабря 2011, 08:38:38
Я нарисовал новый вариант. Теперь вопросы:
1. Надо ли указать типы данных?
2. Надо ли указать их начальные значения?
3. Я не переврал нотацию обращения через объект к его атрибуту, или операции?
4. Можно ветвление делать сразу с одной ветви на 4, а слияние с 4-х в одну? Как это изображается?
« Последнее редактирование: 21 Декабря 2011, 08:58:07 от taras_aa »



Re: Вопросы о диаграмме деятельностей Ответ #29 : 21 Декабря 2011, 08:56:53
Я нарисовал новый вариант. Теперь вопросы:
1. Надо ли указать типы данных?
2. Надо ли указать их начальные значения?
3. Я не переврал нотацию обращение через объект к его атрибуту, или операции?
ДД - по сути блок-схема. Блок-схема  - суть визуализация алгоритма. Тебе судить самому правильно ли или не правильно, ты записал свой алгоритм. К синтаксису особых претензий нет




 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19