|
34 / 34 / 5
Регистрация: 25.02.2013
Сообщений: 221
|
|
Проектирование объектной модели12.10.2013, 00:26. Показов 5676. Ответов 18
Метки нет (Все метки)
Здравствуйте! Есть задание спроектировать объектную модель определённый предметной области.
Определить иерархию продуктов питания. Собственно создаём абстрактный класс Products, определяем поля и методы. С этим проблем нет. Дальше у нас к примеру появляется 2 ветки наследования, а именно - классы "Овощи" и "Фрукты", создавать от таких классов экземпляры - не имеет смысла. Как вариант сделать их тоже абстрактными, но по сути они будут пустыми ибо никаких своих методов они не имеют (или могут иметь?). Просто я не вижу отличий между классами "Овощи" и "Фрукты". Наследованные поля типа: имя, вес, и т.д. и соответствующие методы уже определены в суперклассе...Подскажите как быть? Может быть что-то почитать?
0
|
|
| 12.10.2013, 00:26 | |
|
Ответы с готовыми решениями:
18
Объектно-ориентированное проектирование и дизайн приложений: взаимодействие, модели, системы, архитектура Свойства объектной модели Использование объектной модели |
|
Ушел с форума
|
|
| 12.10.2013, 09:59 | |
|
Эти рассуждения очень похожи на "ООП ради ООП".
Смысл классов, интерфейсов и т.п. в том, чтобы упростить решение какой-то конкретной задачи. Например, единообразное управление объектами разных типов. А если цели нет, или нет понимания того, для решения какой задачи нужны будут все эти наследования и иерархии, превращать все в ООП не имеет смысла.
0
|
|
|
34 / 34 / 5
Регистрация: 25.02.2013
Сообщений: 221
|
||
| 12.10.2013, 15:08 [ТС] | ||
|
0
|
||
|
Ушел с форума
|
||
| 12.10.2013, 16:04 | ||
|
Ответите на этот вопрос - станет ясно, что от чего наследовать (и нужно ли).
0
|
||
|
34 / 34 / 5
Регистрация: 25.02.2013
Сообщений: 221
|
||
| 12.10.2013, 17:49 [ТС] | ||
|
По сути дела нам нужен конкретный овощ или фрукт (чтобы сортировать и искать их по разным параметрам и т.д.). Огурец может наследоваться от Products, а "Овощи" можно сделать интерфейсом который мы реализуем в "огурце".
0
|
||
|
Ушел с форума
|
||
| 12.10.2013, 20:39 | ||
|
Давайте возьмем реальный пример ООП - парсер какого-нибудь формата, такого как JSON, XML или CSV, не суть. Хороший парсер позволяет работать с любой формой входных данных - файл, буфер в памяти, URL, по которому размещаются данные, и т.п. Для этого парсер работает с данными не напрямую, а через некий обобщенный интерфейс, пусть будет abstract_stream, а за этим интерфейсом уже скрываются реальные формы данных - file_stream, memory_stream, url_stream и т.д. Если клиента по каким-то причинам не устраивает ни одна из готовых реализаций, он пишет свою, переопределяя нужные методы в базовом abstract_stream. Но можно делать и совсем по-другому. Например, есть класс "картошка". У картошки есть кожура. Сразу вопрос: кожура - это часть картошки, или кожура - это и есть картошка. Или, может быть, картошка - это наследник кожуры. Давайте наследовать картошку от ее кожуры. Ах, да, у картошки есть разные сорта. Введем несколько базовых классов "сорта", унаследуем от них каждую разновидность картошин. Картошка бывает жареная, вареная, сырая, печеная - отличный повод сделать еще одну параллельную иерархию наследования... Давайте введем класс-примесь, который будет определять, какие блюда можно готовить из картошки, а какие нет. А регулировать это все будем различными visitor-ами, двойной диспетчеризацией и т.п. Первый пример четкий и законченный, потому что классы, наследование и интерфейсы в нем отвечают вполне конкретным требованиям - обеспечить единообразие обработки парсером различных форм входных данных, а также упростить для клиентов написание и интеграцию новых компонентов. Второй пример - типичная "ООП-каша", в которой наследуются только ради того, чтобы от чего-то унаследоваться, "потому что так нужно в ООП". И нет ни одного требования или ограничения (естественного или созданного искусственно), чтобы привести все эти наследования в порядок и ответить на вопрос, где оно нужно, это ООП, а где оно как козе баян.
3
|
||
| 12.10.2013, 21:31 | ||
|
Дополняя предыдущий ответ - все должно созреть, каждая общность и каждая зависимость должна диктоваться абсолютной необходимостью. Вы можете задумывать очень многие конструкции которые по-житейски могут показаться очень логичными/естественными, но с точки зрения программирования окажутся фуфлом.
Вот Вы уже создали классы "Овощи" и "Фрукты" - а зачем? Ну да, одни растут на земле, др на деревьях, но если напр мы торгуем ими в магазине - какая разница? Отсюда избитое выражение "не плодите сущности". Я понимаю что это не поможет Вам сдать задание, но может Вы хотели услышать правдивые ответы ![]() Добавлено через 10 минут - данные организованы в виде тегов, для конкретного формата правила оформления тегов известны - тег может иметь вложенные теги и.т.п. В данных где этого нет (напр obj файл alias 3d модель) вся конструкция развалится (что не означает она плоха)
1
|
||
|
34 / 34 / 5
Регистрация: 25.02.2013
Сообщений: 221
|
|
| 12.10.2013, 21:40 [ТС] | |
|
Да, в моём случае можно создать бесконечно глубокую иерархию картошки и прочих овощей. Причём практически все эти классы бесполезны ибо не будут выполнять какие-либо действия. Их наличие "просто для галочки". Можно попробовать у конкретных объектов добавить константное поле типа такого: type = "Овощ" или же задавать тип в конструкторе. Таким образом можно решить проблему бессмысленного наследования?
0
|
|
|
Ушел с форума
|
||
| 12.10.2013, 21:42 | ||
|
Проблема бессмысленного наследования нерешаема в принципе
![]()
1
|
||
|
34 / 34 / 5
Регистрация: 25.02.2013
Сообщений: 221
|
|||||||
| 13.10.2013, 00:06 [ТС] | |||||||
|
Добавлено через 2 часа 15 минут Итого, после переваривания вышеизложенной информации решил поступить как-то так...
0
|
|||||||
|
Каратель
|
|
| 13.10.2013, 00:10 | |
|
иллюстрация предыдущих ответов
http://habrahabr.ru/post/153225/
1
|
|
| 13.10.2013, 13:28 | |||
|
0
|
|||
|
Антикодер
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
|
|
| 17.10.2013, 17:02 | |
|
я как то писал небольшую статью по UML в которой немного раскрывается этот вопрос
articleUML как будет время поправлю ссылки в статье. (там просто теперь в ссылках "http" нужно заменить на "https" в самом начале, возможно также нужно убирать "www.") Добавлено через 8 минут можно обратиться к сообществу системных аналитиков(сайт uml2_ru) они вас быстро научат точно определять требования к системе и определять цели пользователей.
0
|
|
| 17.10.2013, 18:14 | |
|
в реальности четкую границу между овощами и фруктами не провести. поэтому предлагаю упростить задачу, сделав некоторые допущения и упрощения.
пускай базовый класс (продуктпитания) умеет отвечать на вопрос о калорийности и названии. овощ может иметь методы, например, "сколькодлясалата", "сколькодлясупа", "скольковарить" фрукт - "насколькосладкий", "насколькокислый". понимаю, что кислота или сладость овощей нас может также интересовать, но для такой из пальца высосаной задачи лучшего в голову не идет.
0
|
|
|
34 / 34 / 5
Регистрация: 25.02.2013
Сообщений: 221
|
|
| 18.10.2013, 19:32 [ТС] | |
|
Задача решилась в 2 класса. Абстрактный Products и класс наследник ConcreteProduct. К слову сдал на отлично, с небольшими оговорками. Всем спасибо кто принимал участие.
0
|
|
| 18.10.2013, 19:32 | |
|
Помогаю со студенческими работами здесь
19
Использование объектной модели html-документа Word: Цикл по элементам объектной модели Доступ к объектной модели AutoCAD из внешней СИ-программы Нумерация страниц посредством объектной модели Ворда
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|