|
|
  |
Вопрос по С++ |
|
|
|
Dec 23 2011, 08:55
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (sasamy @ Dec 22 2011, 13:42)  Потрудитесь книжки почитать Спасибо. Опять никакой конкретики привести не можете. Печально. "Слив засчитан". QUOTE (sasamy @ Dec 22 2011, 19:29)  Эти возможности вообще нихрена не могут в кодогенерации по сравнению с макросами Чем конкретно этот макрос, будучи использован в С++, доставит "головную боль" и почему этой головной боли не будет с этим же макросом, но в C-программе? Только не надо отсылать к литературе. Это ваш конкретный пример и будьте добры, отвечайте конкретно.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 23 2011, 09:53
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(XVR @ Dec 23 2011, 11:28)  Весь этот ужас с макросом CMDLINE_DEVICE_CHOOSE замечательно ложится в тривиальный класс С++ (либо шаблонный, либо с парой виртуальных функций - как понравится) Это как раз говорит о том что вы как всегда несете чушь на протяжении этой темы - в шаблонах вы дальше типов не уедете, синтаксис вы не измените и то что этот пример может и не совсем удачный ничего не меняет (я его не писал специально - готовый пример - копипаста) - достаточно внести здесь условную компиляцию например в зависимости от устройства, платформы, конфига добавлять определенный код как ваш "тривиальный" класс превратится в месиво а у меня все будет как прежде ясно и кратко. Цитата либо с парой виртуальных функций да вы вообще похоже не догоняете - у меня код автоматически генерируется а вам с вашими виртуальными ф-ми его вручную набивать надо будет для всех вариантов. CMDLINE_DEVICE_CHOOSE(ssp1, mmc, spi1) CMDLINE_DEVICE_CHOOSE(ssp2, nand_mfc, spi2)
Сообщение отредактировал sasamy - Dec 23 2011, 10:23
|
|
|
|
|
Dec 23 2011, 10:45
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123

|
Цитата(sasamy @ Dec 23 2011, 13:53)  да вы вообще похоже не догоняете - у меня код автоматически генерируется а вам с вашими виртуальными ф-ми его вручную набивать надо будет для всех вариантов. CMDLINE_DEVICE_CHOOSE(ssp1, mmc, spi1) CMDLINE_DEVICE_CHOOSE(ssp2, nand_mfc, spi2) Если вы не знаете как это сделать красиво, просто и надежно - так и скажите. Это не значит что этого нельзя сделать вообще. Есть такой паттерн проектирования - стратегия называется, с его помощью такое очень легко и красиво реализуется, и без единой директивы условной компиляции. Реализовать его можно как с помощью виртуальных функций, так и на шаблонах. Выбор-же нужной стратегии удобно осуществлять в билд системе.
Сообщение отредактировал neiver - Dec 23 2011, 10:48
|
|
|
|
|
Dec 23 2011, 11:26
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123

|
Цитата(sasamy @ Dec 23 2011, 15:10)  А теперь подумай хорошенько - стоит ли применять паттерны проектирования в ООП там где это ну совсем нафик не нужно. Это зависит от критериев "ну совсем нафик не нужности". А это штука уж очень субъективная. А если судить более-менее объективно, то имеем следущее: - есть методика, которая позволяет решить задачу средствами выбранного языка; - устойчива к ошибкам кодирования; - гибка и расширяема; - не несет в себе каких либо нежелательных расходов; - без нее можно, впринципе, обойтись с некоторой потерей безопасности и удобочитаемости. - ее нужно знать. Выбор использовать ее или нет каждый делает сам для себя...
|
|
|
|
|
Dec 23 2011, 14:12
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(sasamy @ Dec 23 2011, 15:10)  А теперь подумай хорошенько - стоит ли применять паттерны проектирования в ООП там где это ну совсем нафик не нужно. Вам - не нужно. А вменяемые люди применяют Цитата в шаблонах вы дальше типов не уедете, Да ну??? Цитата синтаксис вы не измените До некоторой степени можно изменить. Цитата и то что этот пример может и не совсем удачный ничего не меняет Это точно, пока вы несете пургу и ни одного удачного примера не привели Цитата достаточно внести здесь условную компиляцию например в зависимости от устройства, платформы, конфига добавлять определенный код Давайте, продемонстрируйте. Цитата как ваш "тривиальный" класс превратится в месиво То, что вы не знаете С++ мы уже поняли, зачем же об этом продолжать так надрывно кричать? Цитата а у меня все будет как прежде ясно и кратко. Да уж, макросы на пол-страницы - это 'ясно и кратко'
|
|
|
|
|
Dec 23 2011, 18:34
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(XVR @ Dec 23 2011, 22:26)  Это вы к чему? Там один клоун пример просил использования макросов - но мне самому что-то не хочется больше писать. Цитата Если вы не в курсе, то boost - это С++ библиотека, а не С Об это даже в заголовке написано по ссылке - не думайте что все кругом совсем дебилы, по себе не судите. Я мог бы вам дать ссылки на исходники ядра Linux где макросы очень эффективно используются - вызововы syscall, микроассемблер для mips и проче но вы же ответите в своем стиле - я это напишу красиво - один класс с парой виртуальных ф-ций при этом не приводя ни строчки своего кода, поэтому я вам дал ссылку на библиотку С++ - можете начать отсюда http://www.boost.org/doc/libs/1_48_0/libs/.../doc/index.html
Сообщение отредактировал sasamy - Dec 23 2011, 21:17
|
|
|
|
|
Dec 23 2011, 18:42
|
Cундук
    
Группа: Участник
Сообщений: 1 478
Регистрация: 13-11-06
Из: Ростов-на-Дону
Пользователь №: 22 269

|
Цитата(dxp @ Dec 23 2011, 09:55)  Это вряд ли. Скорее это зависит соотношения "сложность задач/доступные ресурсы (время/трудоёмкость). Попробуйте, например, GUI написать на С и С++, разницу поймёте сразу. Ну я, конечно, не большой поклонник С++, но не настолько. И вообще, есть целый класс задач и условий труда программиста, когда без ООП - никуда. Мы это уже обсуждали, и тогда Вы меня убедили. Цитата(dxp @ Dec 23 2011, 09:55)  Тут уместно другое сравнение. Вот в С структуры уместно использовать? ... Для работы со структурами используются функции... ... Это самое первое приближение, которое часто называют "С с классами" (эту идеологию реализовывал первый компилятор Страуструпа). Это понятно. И при правильной эксплуатации вполне логично. Цитата(dxp @ Dec 23 2011, 09:55)  Как видно, ничего сложного тут нет, всё получается логично и по здравому смыслу, к кактусам в голове программиста отношения не имеет. Имеет и еще какое. Но об этом ниже. Цитата(dxp @ Dec 23 2011, 09:55)  Концепция класса даже в таком приближении даёт качественное преимущество перед обычной структурой - она позволяет описывать законченные объекты со своим поведением - т.е. позволяет думать уже не на уровне переменных и агрегатов, а на уровне объектов (аналогов объектов реального мира) и их интерфейсов - актуальность этого растёт по мере усложнения программы, а также предоставляет возможность отделения интерфейса от реализации (когда реализацию можно безопасно менять без риска порушить взаимодействие объекта с внешним окружением). Вот здесь мы и расходимся. У меня в этом мире нет ни одного объекта, совпадающего с другим, кроме искусственных, созданных программно. А это всего лишь часть задач, предлагаемых к решению. И здесь, ПМСМ, кроется некое противоречие. Любители ООП ломают задачу под себя. При этом они абстрагируются от архитектуры вычислителя и от от реального объекта, упрощая его своей моделью в виде класса. При этом создается некая искусственная среда, зачастую включающая в себя ОС там, где это не является необходимостью. А вот на этой благодатной почве и расцветают все кактусы. Поскольку Ваша искусственная среда естественным образом не совпадает с моей. И я, желая использовать Ваш код, вынужден разбираться в Вашем восприятии реальных объектов. А это для меня практически не осуществимо. Есть иная концепция. Когда программист приспосабливает вычислитель к реальным объектам без искусственной среды. При этом считается, что каждый объект уникален. Цитата(dxp @ Dec 23 2011, 09:55)  Вы слишком общо задали условия. Уточните, что должны делать оные "электрические машины", какие общие и частные свойства иметь, как применяться? Встречный вопрос. Сколько потребуется Ваших вопросов, чтобы Вы смогли приступить к созданию класса? Лично я считаю, что для управления реальными объектом, искусственный промежуточный программный объект не нужен. Иначе это дело разрастется в систему классов, подобную той, что нужна для GUI.
|
|
|
|
|
Dec 24 2011, 06:44
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (Прохожий @ Dec 24 2011, 01:42)  Вот здесь мы и расходимся. У меня в этом мире нет ни одного объекта, совпадающего с другим, кроме искусственных, созданных программно. Речь идёт не о прямом соответствии - понятно, что объекты реального мира всегда сложнее, разнообразнее, шире и подробнее. Программно создаются только модели этих объектов с разной степенью подробности тех или иных аспектов реального объекта. Вот о моделях и речь. При проектировании гораздо проще и удобнее оперировать более-менее законченной моделью, нежели сонмом переменных и функций, составляющих эту модель. QUOTE (Прохожий @ Dec 24 2011, 01:42)  Встречный вопрос. Сколько потребуется Ваших вопросов, чтобы Вы смогли приступить к созданию класса? Дык задал уже все вопросы в прошлый раз. Для проектирования надо чётко представлять себе предметную область. А из одного термина "электрические машины" лично мне не понятно, что имеется в виду. Электродвигатели? Генераторы? Или что ещё? Какие свойства представляют интерес для моделирования? Какие операции применимы к этим машинам (запустить, остановить и т.д.)? Какие типы машин (коллекторные, синхронные, асинхронные...), какие операции применимы к каждому из типов. Например, если речь идёт об электрической машине вообще, то там вижу только пару действий: включить и выключить. Если рассмотреть конкретно двигатели, то у тут появляется ещё, например, функция управления скоростью вращения, моментом. Вот тут можно на бумажке взять и набросать модели, определив основные свойства и действия. CODE class TElectricalMachine // абстрактный базовый класс, не может иметь объектов { public: virtual void turn_on() = 0; // чистая виртуальная функция, задаёт интерфейс virtual void turn_off() = 0; };
class TMotor : public TElectricalMachine { public: TMotor() { ... } ... // другие конструкторы, если нужны
virtual void trun_on(); virtual void trun_off(); virtual void set_rotary_speed(int x);
protected: int RotarySpeed; };
class TCommutatorMotor : public TMotor { TCommutatorMotor() { ... } ... // другие конструкторы, если нужны
virtual void trun_on() { ... } // конкретная реализация включения virtual void trun_off() { ... } // конкретная реализация выключения virtual void set_rotary_speed(int x) { ... } // конкретная реализация управления скоростью
private: ... // частные свойства коллекторного двигателя };
class TBrushlessMotor : public TMotor { .... }; // всё по аналогии class TAsychronuosMotor : public TMotor { .... }; // всё по аналогии ...
// использование TCommutatorMotor Motor1; TCommutatorMotor Motor2; ... TBrushlessMotor Motor5; ... TAsychronuosMotor Motor11; ... // и т.д.
TElectricalMachine *Machines[] = { &Motor1, &Motor2, ... &Motor5, ... &Motor11, }; ...
for(int i = 0; i < sizeof(Machines)/sizeof(Machines[0]); ++i) { Machines[i]->turn_on(); // включить все машины, каждая включается по-своему } Можно легко добавить сюда генераторы с их свойствами, можно сделать несколько групп (массивов указателей) по типам, причём, если у какого-то типа есть индивидуальное действие/операция, то это отражается в наличии у базового класса этого типа соответствующей виртуальной функции, и автоматически классифицирует объекты этого типа - например, если шаговый двигатель имеет функцию удержания вала в неподвижном положении, то этот класс двигателей имеет и соответствующую функцию, и невозможно будет по ошибке включить и использовать в этой группе двигатель другого типа - контроль осуществляется на основе правил языка. Если программа предназначена не для мелкого МК, а для РС, то группы удобно организовывать на основе STL. Если же всё это писать на уровне переменных и функций, то это будет гора неструктурированного кода, где все связи между объектами (переменными и функциями) будут жить только в голове у программиста (вот где раздолье для кактусов  ). А код, который организует управление этими объектами будет очень похож на то, что в зарубежной литературе называют "spaghetti code". Развивать такой проект - требует изрядно сил и внимания на удержание в фокусе всех этих мелких и не очень объектов и нюансов их взаимодействия, а сопровождение такого кода ужасно. QUOTE (Прохожий @ Dec 24 2011, 01:42)  Лично я считаю, что для управления реальными объектом, искусственный промежуточный программный объект не нужен. Вы почему-то подразумеваете тут какой-то дополнительный объект, а на самом деле это (модель) то, что просто заменяет пачку переменных и функций, с помощью которого вы в программе контролируете поведение реального объекта.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Dec 24 2011, 08:06
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(dxp @ Dec 24 2011, 10:44)  Если же всё это писать на уровне переменных и функций, то это будет гора неструктурированного кода, где все связи между объектами (переменными и функциями) будут жить только в голове у программиста (вот где раздолье для кактусов  ). А код, который организует управление этими объектами будет очень похож на то, что в зарубежной литературе называют "spaghetti code". Развивать такой проект - требует изрядно сил и внимания на удержание в фокусе всех этих мелких и не очень объектов и нюансов их взаимодействия, а сопровождение такого кода ужасно. Какое заблуждение. Взгляните на исходники какой-нибуть ОС http://prex.sourceforge.net/src/S/252.htmlВсе четко и структурировано. На чистом С. Каркас ОС пишется вообще безотносительно - какие устройства есть на целевой платформе.
|
|
|
|
|
Dec 24 2011, 12:09
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(Flexz @ Dec 24 2011, 15:32)  Остальные основаны на число плюсовых фишках. Ищите по-лучше - там много где макросы используются. Цитата PS а за вами все еще пример где С++ уступает С. Одного мало ? Кстати - если макросы совсем не нужны в С++ - на кой хрен в C++11 включили поддержку variadic macro из стандарта C99 ? В общем кому нужен С++ - используйте на здоровье - мне он не нужен, может только иногда
Сообщение отредактировал sasamy - Dec 24 2011, 12:41
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|