|
Альтернативный вариант задания функции процесса |
|
|
|
Nov 10 2012, 13:36
|
Частый гость
 
Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318

|
Приветствую. Начал смотреть scmRTOS. Сразу начал резать глаз способ реализации функции процесса: Код typedef OS::process<OS::pr0, 300> TProc1;
namespace OS { template <> OS_PROCESS void TProc1::exec() { for(;;) { ef.wait(); PB0.Off(); } } } Необходимость реализовывать функцию процесса внутри поля имён OS, а добавление template <> вызывает некоторое удивление Подумалось, почему-бы не сделать ф-цию exec просто ф-цией своего собственного класса? На скорую руку сделал несколько изменений в исходниках scmRTOS и весь код декларации и реализации процесса превратился в: Код class TProc1 : public OS::process<TProc1, OS::pr0, 300> { public: static void exec() { for(;;) { ef.wait(); PB0.Off(); } } }; Что мы в итоге имеем? 1) Класс, в котором можно инкапсулировать данные и методы процесса. Закрытые и используемые только в TProc1 данные можно объявить в секции private класса и никто к ним не получит доступ. 2) Более привычный способ реализации ф-ции. Кто что думает на этот счёт?
--------------------
|
|
|
|
|
 |
Ответов
|
Nov 11 2012, 03:21
|

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

|
QUOTE (ArtDenis @ Nov 10 2012, 20:36)  Необходимость реализовывать функцию процесса внутри поля имён OS, Откуда взяли, что это необходимость? Не помню, чтобы у меня где-то прикладные процессы жили в пространстве имён OS. QUOTE (ArtDenis @ Nov 10 2012, 20:36)  а добавление template <> вызывает некоторое удивление  Откуда удивление? Это стандартное требование языка С++ - если не указана общая (generic) реализация, будьте добры предоставить специализацию, которую необходимо обозначить в соответсвии с требованиями языка. Функция exeс и является полной специализацией. QUOTE (ArtDenis @ Nov 10 2012, 20:36)  Подумалось, почему-бы не сделать ф-цию exec просто ф-цией своего собственного класса? На скорую руку сделал несколько изменений в исходниках scmRTOS и весь код декларации и реализации процесса превратился в: Т.е. в итоге вместо одного template<> нужно создавать каждый раз целый класс. Сомнительне преимущество. Что касается инкапсуляции, то этот принцип можно реализовать и на текущем варианте, только использовав отношение включения вместо отношения наследования, как это сделано у вас. QUOTE (AHTOXA @ Nov 10 2012, 22:59)  Во! Я всегда мечтал, чтоб можно было того, инкапсулировать  Уже обсуждали мы это. Что мешает тебе инкапсулировать, написав обёртку вокруг процесса? В данном случае я вижу появление лишней сущности. Их и так там две - TBaseProcess и process<>, но это сделано из соображений эффективности реализации. А третья добавляется только из синтаксических предпочтений.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Nov 11 2012, 05:00
|
Частый гость
 
Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318

|
Цитата(dxp @ Nov 11 2012, 09:21)  Откуда взяли, что это необходимость? Не помню, чтобы у меня где-то прикладные процессы жили в пространстве имён OS. А как тогда можно сделать без реализации функции процесса внутри namespace OS ? Я просто пока что судил по примерам, которые идут с scmRTOS. Цитата(dxp @ Nov 11 2012, 09:21)  Откуда удивление? Это стандартное требование языка С++ - если не указана общая (generic) реализация, будьте добры предоставить специализацию, которую необходимо обозначить в соответсвии с требованиями языка. Функция exeс и является полной специализацией. Я могу ошибаться, но считается, что уровень познаний в языке программиста который использует библиотеку, обычно меньше, чем уровень знаний того, кто эту библиотеку пишет. Поэтому библиотека может быть сложной внутри, но её использование должно быть простым и понятным. Лично я видел очень небольшое количество С++ библиотек, которые бы заставляли программиста писать специализацию вот таким вот образом, да и то это приходилось делать в очень исключительных случаях. Поэтому и вызывает удивление, что практически базовая функциональность реализована через требование специализации шаблонной функции, которая вызывается библиотекой. Цитата(dxp @ Nov 11 2012, 09:21)  Т.е. в итоге вместо одного template<> нужно создавать каждый раз целый класс. Сомнительне преимущество. Да, именно класс. И в этом преимущество, т.к. класс в с++ - это более универсальная вещь, чем функция. Цитата(dxp @ Nov 11 2012, 09:21)  Что касается инкапсуляции, то этот принцип можно реализовать и на текущем варианте, только использовав отношение включения вместо отношения наследования, как это сделано у вас. Можно пример? Просто я не представляю как это можно сделать без лишних телодвижений.
--------------------
|
|
|
|
Сообщений в этой теме
ArtDenis Альтернативный вариант задания функции процесса Nov 10 2012, 13:36 AHTOXA Цитата(ArtDenis @ Nov 10 2012, 19:36) Что... Nov 10 2012, 15:59 ArtDenis AHTOXA, по идее вообще никак не должно влиять на б... Nov 10 2012, 16:10 AHTOXA Ну что я могу сказать... Мне очень понравилось. Эт... Nov 10 2012, 16:31 AHTOXA Цитата(dxp @ Nov 11 2012, 09:21) Уже обсу... Nov 11 2012, 06:07 dxp QUOTE (ArtDenis @ Nov 11 2012, 12:00) А к... Nov 11 2012, 12:02 ArtDenis Цитата(dxp @ Nov 11 2012, 18:02) Я не зна... Nov 11 2012, 12:43  dxp QUOTE (ArtDenis @ Nov 11 2012, 19:43) Я с... Nov 11 2012, 13:00 AHTOXA Цитата(dxp @ Nov 11 2012, 19:00) Помещать... Nov 11 2012, 16:00 AHTOXA Йоу! Я придумал, как совместить эти два вариан... Nov 11 2012, 19:15  ArtDenis Цитата(AHTOXA @ Nov 12 2012, 01:15) Йоу... Nov 12 2012, 02:41  Сергей Борщ QUOTE (AHTOXA @ Nov 11 2012, 21:15) Я при... Nov 12 2012, 07:13   AHTOXA Цитата(Сергей Борщ @ Nov 12 2012, 13:13) ... Nov 12 2012, 07:48    Сергей Борщ QUOTE (AHTOXA @ Nov 12 2012, 09:48) Не по... Nov 12 2012, 07:56     AHTOXA А может мои пламенные речи уже переубедили его? Nov 12 2012, 10:25   ArtDenis Цитата(Сергей Борщ @ Nov 12 2012, 13:13) ... Nov 12 2012, 15:08 ReAl Цитата(ArtDenis @ Nov 11 2012, 07:00) Лич... Nov 11 2012, 20:07 dxp QUOTE (AHTOXA @ Nov 11 2012, 23:00) Вообщ... Nov 13 2012, 06:20 AHTOXA Цитата(dxp @ Nov 13 2012, 12:20) В общем,... Nov 13 2012, 14:06 ArtDenis Цитата(dxp @ Nov 13 2012, 12:20) Ни разу ... Nov 13 2012, 15:59 ReAl Цитата(Сергей Борщ @ Nov 12 2012, 09:13) ... Nov 13 2012, 15:31 Сергей Борщ QUOTE (ReAl @ Nov 13 2012, 17:31) А как и... Nov 13 2012, 16:34 dxp QUOTE (AHTOXA @ Nov 13 2012, 21:06) Прове... Nov 13 2012, 16:52 AHTOXA Ладно, раз уж у Гарри такая идиосинкразия к этому ... Nov 13 2012, 17:04 ReAl Цитата(dxp @ Nov 13 2012, 18:52) Отождест... Nov 13 2012, 18:44 ArtDenis Цитата(dxp @ Nov 13 2012, 22:52) Вы путае... Nov 14 2012, 03:33  ReAl Цитата(ArtDenis @ Nov 14 2012, 05:33) В о... Nov 14 2012, 13:45   ArtDenis Цитата(ReAl @ Nov 14 2012, 19:45) Ну да.
... Nov 14 2012, 14:00    ReAl Цитата(ArtDenis @ Nov 14 2012, 16:00) voi... Nov 14 2012, 15:01     ArtDenis Цитата(ReAl @ Nov 14 2012, 21:01) -Wredun... Nov 14 2012, 15:21 dxp QUOTE (AHTOXA @ Nov 14 2012, 00:04) Ладно... Nov 14 2012, 01:17 Сергей Борщ QUOTE (dxp @ Nov 14 2012, 03:17) Почему т... Nov 14 2012, 07:29  Сергей Борщ QUOTE (Сергей Борщ @ Nov 14 2012, 09:29) ... Nov 14 2012, 08:46   AHTOXA Давайте я сюда добавлю ссылки на уже придуманные в... Nov 14 2012, 09:17    Сергей Борщ QUOTE (AHTOXA @ Nov 14 2012, 11:17) вот в... Nov 14 2012, 11:25     AHTOXA Я вот что подумал. В момент вызова TBaseProcess::i... Nov 15 2012, 19:49 AHTOXA Цитата(dxp @ Nov 14 2012, 07:17) Э-э, мы,... Nov 14 2012, 07:47 dxp QUOTE (Сергей Борщ @ Nov 14 2012, 15:46) ... Nov 14 2012, 11:57 ReAl Цитата(dxp @ Nov 14 2012, 13:57) Кстати, ... Nov 14 2012, 12:51 ArtDenis Всё-таки расставлю точки над i по поводу текущего ... Nov 14 2012, 13:43 ReAl Не надо адрес функции-члена... Слова C++ extension... Nov 15 2012, 20:19 ArtDenis AHTOXA, Указатель на нестатическую функцию член кл... Nov 16 2012, 03:41 AHTOXA Цитата(ArtDenis @ Nov 16 2012, 09:41) AHT... Nov 16 2012, 19:41 AHTOXA Я так понимаю, никто не впечатлился?
Да, это оч... Nov 17 2012, 20:10 Vasya777 Предлагаю другой вариант
Пользовательские классы
... Mar 20 2013, 16:59
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|