|
28 / 8 / 6
Регистрация: 20.09.2017
Сообщений: 133
|
|
Задача "Заказы в кафе"02.02.2018, 00:25. Показов 5799. Ответов 18
Метки нет (Все метки)
Доброго времени суток
Буду очень благодарен если кто подскажет алгоритм решения данной задачи Разработать иерархию классов, для хранения информации о сделанных заказах клиентами в кафе. Для идентификации клиента использовать информацию о номере столика и времени посещения. По каждому клиенту (столику, за период) вывести общую (среднюю) стоимость сделанных заказов. Разработать консольное приложение, позволяющее вводить, редактировать и удалять всю необходимую информацию. Предусмотреть сохранение и загрузку введённых данных как в/из текстовый файл, так и в бинарный
0
|
|
| 02.02.2018, 00:25 | |
|
Ответы с готовыми решениями:
18
Разработка программы «Кафе», содержащей информацию о работе кафе Вывести заказы созданные пользователем, который не разу не выполнял заказы Заказы появляются с опозданием, невидимые заказы |
|
|
||||||||||||||||||||||||||
| 02.02.2018, 11:26 | ||||||||||||||||||||||||||
Сообщение было отмечено robotcode как решение
Решение
Исходя из условия, сюда можно (и имхо нужно) притянуть паттерн Visitor для реализации взаимодействия клиент-столик. Покажу архитектуру на примере вычисления средних чеков, файлы и данные за период допилить сами сможете. Счета рандомные для простоты.
3
|
||||||||||||||||||||||||||
|
386 / 74 / 31
Регистрация: 13.04.2012
Сообщений: 127
|
|
| 02.02.2018, 14:04 | |
|
HighPredator, в
Bill.newRandomBill() для часов по идее надо RNG.nextInt(24) вместо RNG.nextInt(25), а то так получаем две разных строки для одного и того же времени (24.00-24.59 и 00.00-00.59).Идею с Visitor'ом я не совсем понял, его же вроде применяют тогда, когда нужно добавить новую функциональность, не меняя сам класс, и при этом может нарушаться инкапсуляция этого класса. А здесь мы по сути используем уже существующую функциональность из класса Table, и это выглядит, как ненужное нагромождение. То есть мы по сути могли бы просто сделать такой же класс Client, дописать туда метод visitTable(Table t) и добавить в t новый bill. По логике мы должны передать сам список Bills, чтобы Visitor мог при случае реализовать новую функциональность без изменения класса Table. К примеру, ещё один Visitor - какой-нибудь администратор, и ему нужно среднее значение по чекам. А какой-нибудь повар интересуется, сколько блюд, которые готовит он, в чеках по каждому столику. Если передавать Table, то каждый раз придётся в самом классе Table дописывать новые методы, а это не очень хорошо (класс же вроде должен иметь только одну причину для изменения). Не по теме: Опыта с паттернами практически нет, просто пытаюсь разобраться..
0
|
|
|
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
|
|
| 02.02.2018, 14:07 | |
|
HighPredator, спасибо за такие полезные и наглядные примеры!
Нижайшая просьба - объясни неразумному падавану, зачем в данном случае нужен интерфейс Visitor? Заранее спс.
0
|
|
|
|
|||||||||
| 02.02.2018, 14:17 | |||||||||
|
Кликните здесь для просмотра всего текста
1) что соответствует методу accept из вики?2) насколько сложно клиенту будет посетить бар, если такая сущность добавится? Если не будет понятно, тогда постараюсь ответить на вопросы.
2
|
|||||||||
|
386 / 74 / 31
Регистрация: 13.04.2012
Сообщений: 127
|
||||
| 02.02.2018, 15:30 | ||||
Table.serve()visit(Bar b) в интерфейс Visitor и реализовать его в классе Client. Я не очень понимаю, как Visitor здесь нам помогает, я ведь точно так же добавлю метод visit(Bar b) в простой класс Client и буду вызывать методы b, как обычно.Но в этом примере из вики Visitor'ы добавляют новую функциональность, а в нашем - нет: они просто вызывают уже существующий метод... и принцип одной обязанности всё равно нарушен для класса Table (в его задачу явно не входит расчёт всевозможных статистик, которые внезапно нам понадобились). То есть, задачу подсчёта среднего по счетам нужно делегировать Visitor'у в моём понимании и передавать ему копию списка счетов. Я про это:Client сделать обычным классом, который вызывает методы у Table. В принципе, можно сделать общий абстрактный класс "Заведение", а бар с кафе отнаследуются от него. Тогда при добавлении бара вообще никаких проблем не должно возникать (если он использует для счетов тот же класс Bill, а если какой-то другой, то добавить новый метод visit(..) в Visitor). Да и сам Bill, по-хорошему, "таскать" между классами не надо, а добавить в Table (или общий класс "Заведение") методы addRandomBill(), addBill(date, price), к примеру, а что там внутри используется клиенту знать не обязательно.Не по теме: То есть мне всё равно не понятно, какие плюсы от использования такого Visitor'a мы получаем...
0
|
||||
|
|
|||||||||||||||||||
| 02.02.2018, 16:25 | |||||||||||||||||||
Посмотрим на детали. По поводу счета. Если вы посмотрите внимательно на пример из вики, то вы увидите, что посетитель в процессе посещения каждого объекта в иерархии точек, изменяет их внутреннее состояние через их публичное АПИ. То же самое сделал и я со столом. В качестве подкрепления вышесказанного предлагаю следующий рефакторинг: запилим еще один тип поситителя -- менеджера, который будет собирать средний чек со стола после того, как все клиенты поедят. Приведем к такому виду:
5
|
|||||||||||||||||||
|
386 / 74 / 31
Регистрация: 13.04.2012
Сообщений: 127
|
||
| 02.02.2018, 16:38 | ||
|
0
|
||
|
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
|
|
| 02.02.2018, 18:53 | |
|
Вот! С появлением класса Manager все стало намного понятнее.
HighPredator, спасибо огромное еще раз. Снимаю шляпу!
0
|
|
|
28 / 3 / 1
Регистрация: 13.12.2017
Сообщений: 192
|
|
| 02.02.2018, 20:36 | |
|
robotcode, слинял по тихому, пока не прилетело. нервно курит в сторонке.
HighPredator, действительно спасибо.
0
|
|
|
28 / 8 / 6
Регистрация: 20.09.2017
Сообщений: 133
|
|
| 03.02.2018, 00:09 [ТС] | |
|
HighPredator, спасибо за ответ....теперь нужно все это пережевать )
0
|
|
|
28 / 3 / 1
Регистрация: 13.12.2017
Сообщений: 192
|
||||
| 03.02.2018, 14:16 | ||||
|
С позволения автора темы и чтобы не засорять выше написанные скрижали HighPredator, перейду в новую тему, где попробую осознать выше написанное
0
|
||||
|
28 / 8 / 6
Регистрация: 20.09.2017
Сообщений: 133
|
|||||||||||||||||||||||||||||||
| 05.02.2018, 02:50 [ТС] | |||||||||||||||||||||||||||||||
|
Вот мое решение этой задачи.
Многое конечно можно было запихать в методы, но пока так как есть Java изучаю чуть больше месяца поэтому с удовольствием принимаю все советы-замечания
0
|
|||||||||||||||||||||||||||||||
|
85 / 67 / 25
Регистрация: 09.10.2017
Сообщений: 208
|
|
| 05.02.2018, 10:12 | |
|
Здравствуйте!
Так же, как BufferedWriter закрываете bw.close(); надо закрывать и ObjectOutputStream и ObjectInputStream oos.close(); ois.close();
0
|
|
|
|
|
| 05.02.2018, 10:19 | |
|
TinSemenova, не надо. Они у него по механизму try-with-resources работают. Закроются сами.
1
|
|
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
||
| 06.02.2018, 16:42 | ||
|
0
|
||
|
|
|
| 06.02.2018, 16:49 | |
|
0
|
|
|
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
|
|
| 06.02.2018, 17:21 | |
|
2
|
|
|
|
||||||||
| 07.02.2018, 10:13 | ||||||||
|
Fene4ka_, стоп, вы похоже неточно выразились. Мой ответ
1
|
||||||||
| 07.02.2018, 10:13 | |
|
Помогаю со студенческими работами здесь
19
Нужно сделать в запросе условие отбора по ФИО заказчика, при котором бы отображались все заказы по этому заказчику, или заказы всех заказчиков Задача. Распределить заказы между предприятиями так, чтобы надежность собираемых из них устройств была наибольшей Кафе Кафе-2 Кафе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|