реклама на сайте
подробности

 
 
> Альтернативный вариант задания функции процесса
ArtDenis
сообщение Nov 10 2012, 13:36
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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 <> вызывает некоторое удивление wacko.gif

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

Код
class TProc1 : public OS::process<TProc1, OS::pr0, 300>
{
public:
    static void exec()
    {
        for(;;)
        {
            ef.wait();
            PB0.Off();
        }
    }
};


Что мы в итоге имеем? 1) Класс, в котором можно инкапсулировать данные и методы процесса. Закрытые и используемые только в TProc1 данные можно объявить в секции private класса и никто к ним не получит доступ. 2) Более привычный способ реализации ф-ции.

Кто что думает на этот счёт?


--------------------
http://ufa-darts.ru/ - собираем дартс-лигу в Уфе
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dxp
сообщение Nov 11 2012, 12:02
Сообщение #2


Adept
******

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



QUOTE (ArtDenis @ Nov 11 2012, 12:00) *
А как тогда можно сделать без реализации функции процесса внутри namespace OS ? Я просто пока что судил по примерам, которые идут с scmRTOS.

Я не знаю, какие примеры вы смотрели, в моих примерах этого нет и никогда не было, мне даже в голову не приходило помещать функцию процесса в пространство имён OS - ведь функция процесса - это уже прикладной код, а не код ОС. Исключение составляет фоновый процесс Idle, он целиком помещён в пространство имён OS.

QUOTE (ArtDenis @ Nov 11 2012, 12:00) *
Я могу ошибаться, но считается, что уровень познаний в языке программиста который использует библиотеку, обычно меньше, чем уровень знаний того, кто эту библиотеку пишет. Поэтому библиотека может быть сложной внутри, но её использование должно быть простым и понятным. Лично я видел очень небольшое количество С++ библиотек, которые бы заставляли программиста писать специализацию вот таким вот образом, да и то это приходилось делать в очень исключительных случаях. Поэтому и вызывает удивление, что практически базовая функциональность реализована через требование специализации шаблонной функции, которая вызывается библиотекой.

Всё правильно, так и есть. И насколько мне известно, scmRTOS использует много людей, которые в плюсах не особенно подготовлены (а немало из них не особенно и стремится постичь глубины С++), им вполне достаточно знать базовый синтаксис использования, основное из которого - это обращение <ObjectName.MemberName>. И уж написать один раз перед функций template<> никакого труда не составляет, при этом совершенно нет необходимости напрягаться по поводу специализаций и прочего.

Вы же предлагаете вариант с созданием класса да ещё и не самым тривиальным способом (наследование от шаблона по методу стратегии), тут у пользователя, который писал, пишет и собирается продолжать писать в С-стиле, вопросов возникнет куда больше - ему придётся врубаться в синтаксис определения классов и наследования, создавать свои определения классов и т.д. - словом, писать свой код в С++ стиле по полной программе. Это совсем не то же самое, что просто создать определение функции по образцу и использовать её в привычном С-стиле. Вас смущает слово template<>? А слово OS_PROCESS, которое используются там же, вас не смущает?

QUOTE (ArtDenis @ Nov 11 2012, 12:00) *
Да, именно класс. И в этом преимущество, т.к. класс в с++ - это более универсальная вещь, чем функция.

А если в ряде случаев эта универсальность не нужна? Тогда накладяки на пустом месте. Процесс должен предоставлять отдельный асинхронный поток управления, он это делает - предоставляет функцию exec. Больше он ничего не должен. Зачем его нагружать в базовом исполнении, мотивируя гипотетическими фичами? Лишнее это. База есть. Если кому мало - вэлком, можно расширять.

QUOTE (ArtDenis @ Nov 11 2012, 12:00) *
Можно пример? Просто я не представляю как это можно сделать без лишних телодвижений.

Очень просто. Если вам или кому-либо ещё хочется иметь функциональность процесса инакпсулиированной в объекте, определите этот объект, сделайте его "процессную" функцию встраиваемой (чтобы вызова не было) и вызывайте её из process<>::exec(). Всё.

Существующий подход предоставляет бОльшую гикость и простоту. Можно сделать так, а можно эдак. Далее, по проектированию. Хороший стиль проектирования подразумевает: "одна сущность - один класс". Один процесс очень часто участвует в реализации далеко не одной сущности, поэтому запихивание всех реализаций в один класс процесса выглядит просто данью парадигме программирования. Вышеописанный способ (определение класса и вызов его "процессной" функии из функции процесса) свободен от этого недостатка - можно создать несколько классов этим способом и вызывать их функции из exec. Инкапсуляция на месте, искусственных "привязок" "класс-процесс" нет.

QUOTE (AHTOXA @ Nov 11 2012, 13:07) *
Да, обсуждали. В тот раз я не смог тебя убедитьsm.gif

Приводимыми агрументами и не удастся. sm.gif Контрагументы, имхо, сильнее.

QUOTE (AHTOXA @ Nov 11 2012, 13:07) *
Зачем писать обёртку, если можно инкапсулировать всё прямо в классе процесса? Вот как раз-таки обёртка - это лишняя сушность.

Не более лишняя, чем определение класса в предлагаемом варианте. Скажи, чем отношение наследования лучше отношения включения? В данном конкретном случае. Чем хуже, уже говорилось: в текущем варианте можно юзать функцию процесса, как есть, в С-стиле, можно включить в другой класса, причём двумя способами - отнаследовашись от process<> или вызывая из process<>::exec() функции других классов, которые реализуют принципы инкапсуляции и абстракции, в то время, как предлагаемый вариант предоставляет только один способ - безальтернативно включить весь код процесса в один класс.

QUOTE (AHTOXA @ Nov 11 2012, 13:07) *
Существующий подход позволяет пользователю специализировать только функцию exec(). А предложенный - позволяет полноценно наследовать класс процесса. Какой вариант гибче?

Что мешает тебе наследовать от process<>? Хотя я бы так не делал - лучше написать отдельный класс и вызывать его функцию (или функции) из exec.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ArtDenis
сообщение Nov 11 2012, 12:43
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318



Цитата(dxp @ Nov 11 2012, 18:02) *
Я не знаю, какие примеры вы смотрели, в моих примерах этого нет и никогда не было, мне даже в голову не приходило помещать функцию процесса в пространство имён OS - ведь функция процесса - это уже прикладной код, а не код ОС

Я смотрел примеры AVR и Cortex3 для GCC. Там везде ф-ция процесса реализована в namespace OS.

Сообщение отредактировал ArtDenis - Nov 11 2012, 12:43


--------------------
http://ufa-darts.ru/ - собираем дартс-лигу в Уфе
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - dxp   QUOTE (ArtDenis @ Nov 10 2012, 20:36) Нео...   Nov 11 2012, 03:21
|- - ArtDenis   Цитата(dxp @ Nov 11 2012, 09:21) Откуда в...   Nov 11 2012, 05:00
|- - AHTOXA   Цитата(dxp @ Nov 11 2012, 09:21) Уже обсу...   Nov 11 2012, 06:07
|- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 02:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01436 секунд с 7
ELECTRONIX ©2004-2016