LINUX.ORG.RU

[C++] Вопрос по дизайну программы

 


0

1

Бесполезного эстетства псто.
Допустим, есть такая задача (это просто абстрактный пример, реальная задача другая): из точки А в точку Б отправляется колонна автомобилей, для каждого автомобиля через каждые 100 метров пути нужно расчитывать различные параметры: скорость, остаток топлива, марку автомобиля и ещё с десяток. Параметры могут быть одинаковыми для всех машин или быть уникальными только для одной. Как бы это всё красиво описать? Проще всего было бы сделать кучу классов параметров, пронаследовав их от общего предка, для каждого автомобиля завести вектор указателей на эти параметры, и просто пробегать по нему, вызывая виртуальный метод расчёта в зависимости от пройденного пути, но такой вариант отпадает, т.к. параметры имеют разный тип. В голову приходят варианты а-ля паттерн «Посетитель» или что-то совсем жуткое с RTTI. ООП владею плохо, а сделать хочется красиво и расширяемо. Использовать можно только стандартный С++, никаких бустов, Qt и т.д.

★★★★

Ответ на: комментарий от yoghurt

Я к тому, что если все параметры (что написано в ОП) отнаследованы от одного класса, и для каждого АМ будет вектор _указателей_ на экземпляры базового класса, то тут уже пофигу на конкретный тип параметра.

yoghurt ★★★★★
()
Ответ на: комментарий от ugoday

А я не вижу здесь множественной диспетчеризации (ну, разве что тип автомобиля <--> тип параметра, но это не оговорено)

yoghurt ★★★★★
()

Визитор, мультиметоды или pattern-matching. А т.к. в плюсах нет ни 2го, ни 3го — остается только визитор.

Sectoid ★★★★★
()
Ответ на: комментарий от yoghurt

> И что?
Виртуальный метод расчёта должен что-то возвращать, это «что-то» будет иметь разный тип. В С++ не работает, даже если базовый тип сделать шаблоном.

Gvidon ★★★★
() автор топика
Ответ на: комментарий от Gvidon

>Виртуальный метод расчёта должен что-то возвращать

Пусть возвращает объект класса value, от которого отнаследовано ещё всякой белиберды.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Считай это моей догадкой. Тут многое неоговорено, но если кто-то хочет pattern Visitor, то скорее всего (хотя и не обязательно) он хочет именно эмулировать множественную диспетчеризацию, но не знает об этом.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Кстати да, если так посмотреть, то уже указанное мною отношение в задаче вполне имеет место :)

yoghurt ★★★★★
()

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

anonymous
()
Ответ на: комментарий от yoghurt

Спасибо, попробую поиграться с covariant return types. Множественная диспетчеризация - это интересно, но, к сожалению, в C++ в ближайшее время не предвидится.

Gvidon ★★★★
() автор топика
Ответ на: комментарий от val-amart

Надо же суровым сишникам как-то взаимодействовать с внешним миром.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

> ООД хотел темы автор.

не, автор хотел:

сделать красиво и расширяемо

korvin_ ★★★★★
()

(=

Попробуйте написать сначала некрасиво)))

Расчёт общих параметров - работа над числами и не более... Существует формула или константа скорости расходования топлива, то есть в принципе - это метод, который будет работать почти одинаково....

Марка автомобиля уж точно рассчитываться не будет =)

Какие ещё визиторы, если это суть однородно всё...автомобили да автомобили...да хоть форма жизни с уровнем энергии... Пожалуйста, приведите примеры параметров с разными рассчитываемыми типами...

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

Жуткого пока ничего не вижу.

А вот вектор обычных указателей - уже плохо.

m4n71k0r
()
Ответ на: комментарий от val-amart

ок. но зачем??

IO - незачем, а всё остальное - бессмысленно

jtootf ★★★★★
()
Ответ на: комментарий от ACR

> все сишники знают что если нужно сделать «красиво и расширяемо» то нужно писать на python

fixed. сишник-питонист.

val-amart ★★★★★
()
Ответ на: (= от m4n71k0r

Разные типы - это целые числа, строки и числа с плавающей запятой. Классы «автомобилей» мне трогать нельзя, к сожалению. Ладно, не суть, в общем. Буду копать. Сделать «чтоб работало» не проблема, но хочется сделать так, чтобы когда меня через год, например, попросят что-то изменить, не хотелось отрубить себе руки.

Gvidon ★★★★
() автор топика
Ответ на: комментарий от Gvidon

=)

Всё ясно, тогда надо реализовывать всякие там «бортовые процессоры». Регистрация «приборов» и «парметров» в «бортовом процессоре», при вызове конструкторов. «Бортовой процессор» знает про все «приборы», и «приборы» могут сообщить «бортовому процессору», какие методы в них доступны. Потом можно наваять систему управления «бортовыми процессорами»....а потом машины захватят Землю =)

m4n71k0r
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.