Имя:    Пароль:      Помнить меня       
Unsorted   ~  Software  ~  Development and Design  ~  Объектно-ориентированное программирование проблемы и решения
На страницу «  1, 2, 3  »
chaser
Сообщение  03 Апр 2007, 21:07  Ссылка : Ответить с цитатой
Возраст: 35 Пол: Мужской 
C нами с 04.02.2005
Репутация: 121.3

Ну, в C++ есть еще typeinfo. Будет достаточно в контейнере реализовать механизм [псевдо]итераторов, и никаких проблем с проектированием базового класса не будет.

Ну а если без typeinfo, можно сделать метод типа "get_fruit_type" и присвоить каждому виду фруктов свой номер.
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : JabberID
MajorQ
Сообщение  03 Апр 2007, 21:39  Ссылка : Ответить с цитатой
Пол: Мужской  Доверенный пользователь
C нами с 09.06.2005
Репутация: 548.8

chaser, это все тоже фейк... Любая конструкция типа if(e.IsA()), или if(e.getType()==e.Type), или if(e is Type) - все это криво... Уж лучше выносить алгоритмы за пределы класса и виртуальными методами создавать объекты-процессоры для каждого типа фруктов. Паттерн не вспомню, книжку кому-то дал почитать... Смайлик
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : Сайт
chaser
Сообщение  03 Апр 2007, 22:26  Ссылка : Ответить с цитатой
Возраст: 35 Пол: Мужской 
C нами с 04.02.2005
Репутация: 121.3

Ну понятно, что в идеале виртуальные функции должны заниматься такими делами. "Все это криво" — все-таки не исчерпывающее объяснение, почему так делать не стоит. Про isApple(), isOrange() и т.п. я безусловно соглашусь — это в любом случае кривая архитектура.

Но о getType() — вдруг иногда все-таки нужно? Вдруг программа будет столь специфической, что это будет наиболее приемлимым вариантом? Typeinfo с dynamic_cast'ом, наверное, не просто так в C++ добавили (я не пользовался, правда, ими ни разу).

Алгоритм, кстати, в предложенном мной способе предполагается реализовать отдельной шаблонной функцией.
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : JabberID
MajorQ
Сообщение  03 Апр 2007, 23:18  Ссылка : Ответить с цитатой
Пол: Мужской  Доверенный пользователь
C нами с 09.06.2005
Репутация: 548.8

typeinfo мне тоже не пришлось использовать почему-то, что уже забавно, что нам обоим это не понадобилось... Подмигивание Видимо, есть варианты обойтись без него обычно. Потому и считаю, что криво, раз есть пути обхода. Как ни крути, но это имеет ограниченное применение, некий частный случай. Любой новый класс в иерархии вполне вероятно потребует модификации такого кода. А если он разбросан по большому проекту? Тогда все это превращается в большой геморрой!
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : Сайт
Madlax
Сообщение  05 Апр 2007, 0:57  Ссылка : Ответить с цитатой
 
C нами с 25.01.2005
Репутация: 97.3

продолжение ;)

в ресторане есть склад, на котором хранятся фрукты

в ресторане работает повар, который умеет готовить фруктовые салаты по известным рецептам

рецепт прост:
для приготовления фруктового салата вам понадобятся 3 яблока и 2 груши
все это помыть, почистить и нарезать
перемешать и охладить

помогите грамотно реализовать на ООП без использования фэйка? ;)
В начало
Профиль : Личное Сообщение
MajorQ
Сообщение  05 Апр 2007, 1:17  Ссылка : Ответить с цитатой
Пол: Мужской  Доверенный пользователь
C нами с 09.06.2005
Репутация: 548.8

Склад - объект-фабрика, умеющая производить некое ограниченное количество объектов-фруктов, т.е. объектов классов Яблоко, Груша и т.д., реализующих общий интерфейс Фрукт. Типа, получитьЯблоко(кол-во) и т.д. На кухне есть объект-фруктопроцессор, который имеет методы нарезать(Фрукт), помыть(Фрукт) и т.д., которые в результате выдают набор (массив, список, кучу) объектов-кусочков. Этот набор (заметьте, уже не важно кусочков какого именно фрукта или овоща!) передается в объект миксер, а оттуда в объект-холодильник. Т.е. вся специфика и типозависимость алгоритма прячется в один-единственный метод, инкапсулирующий вызовы Склад, производящие фрукты и овощи в нужном количестве и помещающий их в соответсвующие процессоры. Потом уже различий не существует, мешалке и холодильнику не важно что и в каком количестве мешать...

PS: тут еще сделано предположение, что фрукторезка и фруктомойка это специализированные процессоры. Допустим, они не столь жестоко обращаются с объектами резки/мойки, нежели овощерезки/овощемойки, например. А ведь можно и совместить фрукты с овощами. Можно продолжать и дальше: можно завести объект-салат, который содержит в себе метод, реализующий этот самый процесс получения ингридиентов в нужном количестве. Сумбурно, правда все тут. Роли распределены через задницу, но для примера сойдет... Язык
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : Сайт
Madlax
Сообщение  05 Апр 2007, 23:00  Ссылка : Ответить с цитатой
 
C нами с 25.01.2005
Репутация: 97.3

про кухню ты здорово написал ;)

проблема заключается в том, как реализовать склад

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

управляющий складом следит (перидически проверяет) за тем, чтобы на складе был достаточный запас фруктов разных типов
управляющий складом анализирует, сколько съедено, сколько осталось, сколько каких фруктов нужно заказать, чтобы хватило до следующей закупки
дальше он составляет перечень покупок и делает заказ
В начало
Профиль : Личное Сообщение
MajorQ
Сообщение  05 Апр 2007, 23:07  Ссылка : Ответить с цитатой
Пол: Мужской  Доверенный пользователь
C нами с 09.06.2005
Репутация: 548.8

А понятие "абстракция" зачем в ООП существует? Вот я от всего этого и абстрагировался в соответсвии с поставленной задачей! Подмигивание
Позже придумаем и остальное. Вот только зачем оно надо? Кухня была иллюстрацией способа. Не буду же я всю архитектуру на халяву в качестве примера строить! Весело

PS: Может проще взять книжку Гр. Буча "Объектно-ориентированное проектирование" и книжку Банды 4-х "Паттерны проектирования" и все все прочитать самому? Подмигивание
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : Сайт
Petro
Сообщение  06 Апр 2007, 18:00  Ссылка : Ответить с цитатой
Возраст: 39 Пол: Мужской 
C нами с 04.05.2006
Репутация: 63.9

Madlax писал(а):
есть фрукты: яблоки, груши и апельсины
есть корзинка, в которой хранятся фрукты
после того, как в корзинку сложены разные фрукты, из нее невозможно достать одни только яблоки Подмигивание

то есть в идеальной ООП клиент видит все объекты в корзинке как фрукты и не может отлечить яблоки от груш Подмигивание

кто знает, как решается?

Честно говоря проблемы не увидел Смайлик
Очень просто решается...
Создается класс корзина. У класса несколько свойств:
Коллекция объектов "яблоко", коллекция "груши", коллекция мандаринов итп. Нужно нам определить вес яблока, пишем к примеру
float Весяблока = Korzina.AppleCollection[0].AppleWeight;
Вот и все...
В начало
Профиль : Фотоальбом : Личное Сообщение : Сайт : ICQ
chaser
Сообщение  06 Апр 2007, 20:25  Ссылка : Ответить с цитатой
Возраст: 35 Пол: Мужской 
C нами с 04.02.2005
Репутация: 121.3

Petro, ну, это, простите, не очень тянет на ООП. Больше похоже на C без суффикса "плюс плюс" Улыбочка

MajorQ писал(а):
Видимо, есть варианты обойтись без него обычно. Потому и считаю, что криво, раз есть пути обхода.

Здесь с тезисом "криво, раз есть пути обхода" не могу согласиться. Ведь так можно отказаться, например, и от классов. Пример тому — семейство библиотек GTK+/Glib/Gobject, написанное на C. В них происходит "эмуляция" ООП — пользователь динамически регистрирует класс и т.д. С помощью указателей на функции реализован полиморфизм. На самом деле, ужасная вещь, если глубоко ковырять. (Если интересно, домашняя страница — http://gtk.org, исходники можно скачать у нас в сети).
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : JabberID
MajorQ
Сообщение  06 Апр 2007, 21:17  Ссылка : Ответить с цитатой
Пол: Мужской  Доверенный пользователь
C нами с 09.06.2005
Репутация: 548.8

chaser, я, конечно, выразился криво... Имел ввиду, что все эти typeinfo не вписываются в концепцию "трех китов ООП": абстракция, инкапсуляция, полиморфизм. Сугубо ИМХО, но динамическая информация о типе - это костыли для неумелых проектировщиков...
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : Сайт
chaser
Сообщение  06 Апр 2007, 22:01  Ссылка : Ответить с цитатой
Возраст: 35 Пол: Мужской 
C нами с 04.02.2005
Репутация: 121.3

MajorQ, если RTTI используется при изначальном проектировании — да, это скорее костыли, здесь я соглашусь. А что, если есть готовая библиотека, которую надо использовать, но уже нельзя перепроектировать? Кстати, рассуждения по этому поводу можно найти в 14-ой главе "Дизайна и эволюции" — очень рекомендую.
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : JabberID
Petro
Сообщение  06 Апр 2007, 23:57  Ссылка : Ответить с цитатой
Возраст: 39 Пол: Мужской 
C нами с 04.05.2006
Репутация: 63.9

chaser писал(а):
Petro, ну, это, простите, не очень тянет на ООП. Больше похоже на C без суффикса "плюс плюс"
chaser, Если коллекция объектов это не ООП, тогда чтоже это? ))
Корзина - объект, фрукт - объект, яблоко объект унаследованный от фрукт..

P.S. А причем тут плюсы? Мыже вроде об ООП говорим как концепции... Пример кстати на С# Подмигивание
В начало
Профиль : Фотоальбом : Личное Сообщение : Сайт : ICQ
MajorQ
Сообщение  07 Апр 2007, 0:25  Ссылка : Ответить с цитатой
Пол: Мужской  Доверенный пользователь
C нами с 09.06.2005
Репутация: 548.8

Petro, коллекция объектов это еще не ООП. Про "три столпа" я уже написал. В коллекции от них есть только один - инкапсуляция. Советую у Буча вчитаться в их объяснение и хорошенько понять их...
В начало
Профиль : Фотоальбом : Блог : Личное Сообщение : Сайт
Petro
Сообщение  07 Апр 2007, 1:23  Ссылка : Ответить с цитатой
Возраст: 39 Пол: Мужской 
C нами с 04.05.2006
Репутация: 63.9

MajorQ писал(а):
Petro, коллекция объектов это еще не ООП. Про "три столпа" я уже написал. В коллекции от них есть только один - инкапсуляция. Советую у Буча вчитаться в их объяснение и хорошенько понять их...
MajorQ, Тогда как получается, что если в коде нету чего-то одного (инкапсуляции, наследования или полиморфизма), то программа не считается объектно ориентированной?! Подмигивание
ООП не должен быть ради ООПа... Если есть задача, её надо решать исходя из здравого смысла. Можно сделать все методы виртуальными и говорить, что мой код офигенно полиморфный... только толку от этого не будет.
В начало
Профиль : Фотоальбом : Личное Сообщение : Сайт : ICQ
Показать сообщения:   
На страницу «  1, 2, 3  »

Unsorted   ~  Software  ~  Development and Design  ~  Объектно-ориентированное программирование

Ответить на тему

Перейти:  





Powered by phpBB   © Unsorted Team  support@unsorted.me  promo@unsorted.me  Полезные скрипты