Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
34 / 34 / 5
Регистрация: 25.02.2013
Сообщений: 221

Проектирование объектной модели

12.10.2013, 00:26. Показов 5676. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть задание спроектировать объектную модель определённый предметной области.
Определить иерархию продуктов питания. Собственно создаём абстрактный класс Products, определяем поля и методы. С этим проблем нет. Дальше у нас к примеру появляется 2 ветки наследования, а именно - классы "Овощи" и "Фрукты", создавать от таких классов экземпляры - не имеет смысла. Как вариант сделать их тоже абстрактными, но по сути они будут пустыми ибо никаких своих методов они не имеют (или могут иметь?). Просто я не вижу отличий между классами "Овощи" и "Фрукты". Наследованные поля типа: имя, вес, и т.д. и соответствующие методы уже определены в суперклассе...Подскажите как быть? Может быть что-то почитать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.10.2013, 00:26
Ответы с готовыми решениями:

Объектно-ориентированное проектирование и дизайн приложений: взаимодействие, модели, системы, архитектура
В общем, дело такое. В ООП ничего не понимаю. Нужны некоторые уточнения парадигмы. Предполагается чистый C++ (без boost, stl и подобного). ...

Свойства объектной модели
Всем добрый день. Для работы программы мне нужно знать размеры вставляемой jpg картинки. Читаю значение свойств Pictures(1).Height и...

Использование объектной модели
Вопрос такой - Есть программа, к которой будут писаться 'плагины'. Плагины - это обычные DLL-ки на VB, которые программка будет...

18
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.10.2013, 09:59
Эти рассуждения очень похожи на "ООП ради ООП".
Смысл классов, интерфейсов и т.п. в том, чтобы упростить решение какой-то
конкретной задачи. Например, единообразное управление объектами разных типов.
А если цели нет, или нет понимания того, для решения какой задачи нужны будут
все эти наследования и иерархии, превращать все в ООП не имеет смысла.
0
34 / 34 / 5
Регистрация: 25.02.2013
Сообщений: 221
12.10.2013, 15:08  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Эти рассуждения очень похожи на "ООП ради ООП".
Смысл классов, интерфейсов и т.п. в том, чтобы упростить решение какой-то
конкретной задачи. Например, единообразное управление объектами разных типов.
А если цели нет, или нет понимания того, для решения какой задачи нужны будут
все эти наследования и иерархии, превращать все в ООП не имеет смысла.
Цель - получить конкретный овощ и фрукт. Как пример нам нужен огурец, который имеет суперкласс "Овощи". Мы его можем порезать, поместить в массив с другими овощами/фруктами и получить салат. Сам же суперкласс "Овощи" не имеет "личных" методов, он просто наследует всё то, что определено в Products. Я не знаю правильно ли оставлять "Овощи" пустым. Да, вы правильно заметили, тут всё похоже на "ООП ради ООП"...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.10.2013, 16:04
Цитата Сообщение от Recreate Посмотреть сообщение
Цель - получить конкретный овощ и фрукт.
Для чего ? Для каких функциональных или архитектурных требований это нужно ?
Ответите на этот вопрос - станет ясно, что от чего наследовать (и нужно ли).
0
34 / 34 / 5
Регистрация: 25.02.2013
Сообщений: 221
12.10.2013, 17:49  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Для чего ? Для каких функциональных или архитектурных требований это нужно ?
Ответите на этот вопрос - станет ясно, что от чего наследовать (и нужно ли).
Ну требование такое: Спроектировать объектную модель для заданной предметной области.
По сути дела нам нужен конкретный овощ или фрукт (чтобы сортировать и искать их по разным параметрам и т.д.). Огурец может наследоваться от Products, а "Овощи" можно сделать интерфейсом который мы реализуем в "огурце".
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.10.2013, 20:39
Цитата Сообщение от Recreate Посмотреть сообщение
Ну требование такое: Спроектировать объектную модель для заданной предметной области.
В том-то и дело, что данное требование весьма и весьма туманное.

Давайте возьмем реальный пример ООП - парсер какого-нибудь формата, такого как
JSON, XML или CSV, не суть. Хороший парсер позволяет работать с любой формой
входных данных - файл, буфер в памяти, URL, по которому размещаются данные, и т.п.
Для этого парсер работает с данными не напрямую, а через некий обобщенный
интерфейс, пусть будет abstract_stream, а за этим интерфейсом уже скрываются
реальные формы данных - file_stream, memory_stream, url_stream и т.д.
Если клиента по каким-то причинам не устраивает ни одна из готовых реализаций,
он пишет свою, переопределяя нужные методы в базовом abstract_stream.

Но можно делать и совсем по-другому.
Например, есть класс "картошка". У картошки есть кожура. Сразу вопрос:
кожура - это часть картошки, или кожура - это и есть картошка. Или, может быть,
картошка - это наследник кожуры. Давайте наследовать картошку от ее кожуры.
Ах, да, у картошки есть разные сорта. Введем несколько базовых классов "сорта",
унаследуем от них каждую разновидность картошин. Картошка бывает жареная,
вареная, сырая, печеная - отличный повод сделать еще одну параллельную
иерархию наследования... Давайте введем класс-примесь, который будет определять,
какие блюда можно готовить из картошки, а какие нет. А регулировать это
все будем различными visitor-ами, двойной диспетчеризацией и т.п.

Первый пример четкий и законченный, потому что классы, наследование и
интерфейсы в нем отвечают вполне конкретным требованиям - обеспечить
единообразие обработки парсером различных форм входных данных, а также
упростить для клиентов написание и интеграцию новых компонентов.

Второй пример - типичная "ООП-каша", в которой наследуются только ради
того, чтобы от чего-то унаследоваться, "потому что так нужно в ООП".
И нет ни одного требования или ограничения (естественного или созданного
искусственно), чтобы привести все эти наследования в порядок и ответить
на вопрос, где оно нужно, это ООП, а где оно как козе баян.
3
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,897
Записей в блоге: 2
12.10.2013, 21:31
Дополняя предыдущий ответ - все должно созреть, каждая общность и каждая зависимость должна диктоваться абсолютной необходимостью. Вы можете задумывать очень многие конструкции которые по-житейски могут показаться очень логичными/естественными, но с точки зрения программирования окажутся фуфлом.

Вот Вы уже создали классы "Овощи" и "Фрукты" - а зачем? Ну да, одни растут на земле, др на деревьях, но если напр мы торгуем ими в магазине - какая разница? Отсюда избитое выражение "не плодите сущности". Я понимаю что это не поможет Вам сдать задание, но может Вы хотели услышать правдивые ответы

Добавлено через 10 минут
Цитата Сообщение от Убежденный Посмотреть сообщение
Давайте возьмем реальный пример ООП - парсер какого-нибудь формата, такого как
JSON, XML или CSV, не суть. Хороший парсер позволяет работать с любой формой
входных данных - файл, буфер в памяти, URL, по которому размещаются данные, и т.п.
Для этого парсер работает с данными не напрямую, а через некий обобщенный
интерфейс, пусть будет abstract_stream, а за этим интерфейсом уже скрываются
реальные формы данных - file_stream, memory_stream, url_stream и т.д.
Если клиента по каким-то причинам не устраивает ни одна из готовых реализаций,
он пишет свою, переопределяя нужные методы в базовом abstract_stream.
Хороший пример, но и он предполагает какие-то правила типа

- данные организованы в виде тегов, для конкретного формата правила оформления тегов известны
- тег может иметь вложенные теги и.т.п.

В данных где этого нет (напр obj файл alias 3d модель) вся конструкция развалится (что не означает она плоха)
1
34 / 34 / 5
Регистрация: 25.02.2013
Сообщений: 221
12.10.2013, 21:40  [ТС]
Да, в моём случае можно создать бесконечно глубокую иерархию картошки и прочих овощей. Причём практически все эти классы бесполезны ибо не будут выполнять какие-либо действия. Их наличие "просто для галочки". Можно попробовать у конкретных объектов добавить константное поле типа такого: type = "Овощ" или же задавать тип в конструкторе. Таким образом можно решить проблему бессмысленного наследования?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.10.2013, 21:42
Проблема бессмысленного наследования нерешаема в принципе

Цитата Сообщение от Recreate Посмотреть сообщение
По сути дела нам нужен конкретный овощ или фрукт (чтобы сортировать и искать их по разным параметрам и т.д.).
Вот от этого (выделил жирным) можно попробовать отталкиваться.
1
34 / 34 / 5
Регистрация: 25.02.2013
Сообщений: 221
13.10.2013, 00:06  [ТС]
Цитата Сообщение от Igor3D Посмотреть сообщение
Я понимаю что это не поможет Вам сдать задание, но может Вы хотели услышать правдивые ответы
Мне хочется именно разобраться в данном вопросе. Сдать задание я всегда успею. Хочу понять и сделать качественно.

Добавлено через 2 часа 15 минут
Итого, после переваривания вышеизложенной информации решил поступить как-то так...
Java
1
2
3
4
5
6
abstract class Products {
    private final String NAME; // конкретное наименование (картошка, морковь)
    private Product type; // enum содержащий {ОВОЩ, ФРУКТ итд}
    private double weight; // вес
    private double cost; // цена
// далее идут конструкторы, геттеры, сеттеры
Конкретный класс (картошка) наследует только абстрактный класс (быть может придумаются какие-то нужные интерфейсы), в поле type мы выбираем чем является наша картошка...Соответственно сортировку можно производить по цене, весу, типу. Поиск по аналогии. Если нам нужен салат, то создаём массив имеющий тип абстрактного класса и уже туда кладём конкретные продукты. Вроде бы такой подход компактен и не имеет излишеств.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.10.2013, 00:10
иллюстрация предыдущих ответов
http://habrahabr.ru/post/153225/
1
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,897
Записей в блоге: 2
13.10.2013, 13:28
Цитата Сообщение от Recreate Посмотреть сообщение
Мне хочется именно разобраться в данном вопросе. Сдать задание я всегда успею. Хочу понять и сделать качественно.
Сделать ЧТО? В задании это никак не звучит, нет цели для чего это.

Цитата Сообщение от Recreate Посмотреть сообщение
Конкретный класс (картошка) наследует только абстрактный класс (быть может придумаются какие-то нужные интерфейсы), в поле type мы выбираем чем является наша картошка...Соответственно сортировку можно производить по цене, весу, типу. Поиск по аналогии. Если нам нужен салат, то создаём массив имеющий тип абстрактного класса и уже туда кладём конкретные продукты. Вроде бы такой подход компактен и не имеет излишеств.
Добавить поле ID - уникальный идентификатор продкута. Заметим что так или иначе - цель появилась, напр можно искать продукты по каким-то ключам. Вполне нормально
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
13.10.2013, 14:21
Цитата Сообщение от Igor3D Посмотреть сообщение
Ну да, одни растут на земле, др на деревьях, но если напр мы торгуем ими в магазине - какая разница?
Арбуз, дыня, ананас, черника теперь являются овощами?)
1
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
14.10.2013, 17:16
Если по теме, то одно из основных понятий ООП не класс, а абстракция
Абстрагирование — это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые. Соответственно, абстракция — это набор всех таких характеристик
Если не можешь выделить существенные отличия, то и класс создавать не стоит.
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
17.10.2013, 17:02
я как то писал небольшую статью по UML в которой немного раскрывается этот вопрос
articleUML
как будет время поправлю ссылки в статье. (там просто теперь в ссылках "http" нужно заменить на "https" в самом начале, возможно также нужно убирать "www.")

Добавлено через 8 минут
можно обратиться к сообществу системных аналитиков(сайт uml2_ru) они вас быстро научат точно определять требования к системе и определять цели пользователей.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
17.10.2013, 18:14
в реальности четкую границу между овощами и фруктами не провести. поэтому предлагаю упростить задачу, сделав некоторые допущения и упрощения.
пускай базовый класс (продуктпитания) умеет отвечать на вопрос о калорийности и названии.
овощ может иметь методы, например, "сколькодлясалата", "сколькодлясупа", "скольковарить"
фрукт - "насколькосладкий", "насколькокислый".

понимаю, что кислота или сладость овощей нас может также интересовать, но для такой из пальца высосаной задачи лучшего в голову не идет.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.10.2013, 18:49
Цитата Сообщение от novi4ok Посмотреть сообщение
овощ может иметь методы, например, "сколькодлясалата", "сколькодлясупа", "скольковарить"
способ приготовления (рецепт) никакого отношения к овощам не имеет

Добавлено через 24 секунды
Цитата Сообщение от novi4ok Посмотреть сообщение
фрукт - "насколькосладкий", "насколькокислый".
относительно чего? по какой шкале?
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
17.10.2013, 19:00
у тебя есть хорошие идеи по поводу того, что может овощ такого, чего не могут ни фрукт, ни абстрактный продукт питания? выложи, а мы посмеемся.
0
34 / 34 / 5
Регистрация: 25.02.2013
Сообщений: 221
18.10.2013, 19:32  [ТС]
Задача решилась в 2 класса. Абстрактный Products и класс наследник ConcreteProduct. К слову сдал на отлично, с небольшими оговорками. Всем спасибо кто принимал участие.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2013, 19:32
Помогаю со студенческими работами здесь

Использование объектной модели html-документа
Здравствуйте, у меня есть необходимость парсить html-документа получаемый с помощью классов HttpWebResponse, HttpWebRequest. С помощью них...

Word: Цикл по элементам объектной модели
Добрый день! Второй год изучаю программирование VBA в Wорде. В основном изучал его по книгам, так сказать схватывал на лету, однако...

Доступ к объектной модели AutoCAD из внешней СИ-программы
Доступ к объектной модели AutoCAD из внешней СИ-программы Перенос темы в раздел АутоКАД - на усмотрение модераторов. Но все же это о...

Нумерация страниц посредством объектной модели Ворда
Приветствую ! Подскажите, как с помощью объектной модели ворда можно пронумеровать страницы ? Также интересуеь вопрос генерации оглавления...

Спроектировать иерархию исключительных ситуаций для объектной модели
Есть класс public abstract class Aviacompany { public static void main(String args) throws IOException { Aviacompany...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru