Подскажите, пожалуйста, как опубликоваться.
От: Atz Россия  
Дата: 07.08.07 16:42
Оценка:
Зарегестрировался на Вашем сайте и хочу опубликовать на сайте (и возможно, в журнале) код разработанной мной Finest C++ State Machine. Но что-то то-ли я стал слишком стар... то-ли сайт стал слишком велик и запутан... не могу найти на RSDN- е ссылку, как опубликовуать свою статью — и всё тут!

Админы, помогите, плиз: почта моя у Вас есть.

---- cut ----

Finest State Machine.
(C++ infinite State Machine)

Все найденные автором машины состояний (в первую очередь рассмотренные на сайте RSDN, но также и
найденные в Интернете) имеют несколько недостатков: они либо созданы для генерации из UML
(и требуют ручного кодирования всех классов состояний, если UML не используется), либо динамические
и имеют высокие накладные расходы. Первый недостаток особенно заметен, когда в машине состояний не
сотни классов, а всего десяток. Второй — когда машина применяется для критичных приложений, типа
компьютерных игр.

Автор поставил задачу разработать машину состояний, удовлетворяющую следующим требованиям:

1) Отсутствие необходимости ручного кодирования классов состояний
2) Минимальные накладные расходы
3) Машина должна придавать состояния любому произвольному классу, задаваемому как параметр.

Требования 1 и 2 удалось реализовать. Первое — применением техники метапрограммирования:
в предлагаемой машине все классы состояний создаёт сам компилятор. Второе — применением
техники Виртуального Конструктора (реализуется через placement синтаксис оператора new:
область памяти с переменными меняет свой класс, сохраняя значение). Накладные расходы —
одна переменная типа int и таблица виртуальных функций в классах состояний.
При переходах выполняется только перенастройка этой таблицы (состояния меняют тип, оставаясь
на том же блоке памяти, который занимает класс с переменными). В прилагаемом примере переменной
класса (которая сохраняет своё значение при переходах) является count.

Третье требование — сделать из машины универсальный библиотечный шаблон — не удалось реализовать
по следующей причине: C++ не поддерживает наследование интерфейса. Точнее то, что обычно называют
наследованием интерфейса в C++ это буквально необходимость самому заново объявить в производном классе
весь "унаследованный" интерфейс и — определить его. А должно быть — именно дословно: наследование
интерфейса, т.е. те методы, которые определены как наследуемые в базовом классе, должны требовать
реализации во всех производных классах, но — не должны требовать повторного объявления в них.
Представьте интерфейс класса верхнего уровня иерархии из тысячи классов, каждый из которых добавляет
по одному методу! Концепция ООП в C++ ущербная и неполная, до mainstream-а замечательные в замысле
вещи часто доходят в виде пакетика с супом, который отличается от самого супа тем, что он полуфабрикат,
из которого высушили весь вкус. Впрочем, она такая везде, и вообще — надо питаться японской кухней.

Поэтому машина состояний представляет собой именно паттерн: её надо взять и сделать три вещи:

1) В заголовочном файле задать имя машины и переменные класса, который будет иметь состояния;
2) Объявить в файле реализации enumerator с именами состояний;
3) Там же (в файле реализации) закодировать все переходы и все действия для каждого состояния.

Действия представлены функциями doit(), переходы — функциями transitions(), состояния —
переменными целочисленного типа (их необязательно засовывать в enum, но они должны быть константами
целого типа и этапа компиляции). Есть фиктивное состояние EndingPseudoState, которое фактически
представляет собой количество состояний машины (и ничего больше), поэтому в нём никакие переходы
и действия не реализуются. Остальные состояния можно использовать по своему усмотрению.

Динамическое добавление состояний "на лету" не предусмотрено, однако предусмотрено удобство
ручного добавления новых состояний, в частности — кодирование функций переходов в произвольных
точках трансляции (говоря человеческим языком, функции могут быть где угодно — и в разных местах,
т.е. для расширения машины достаточно дописать ещё состояний и где-то определить дополнительные
функции перехода, причём объявлять их не нужно, равно как и классы состояний — только их имена).

Машина начинает свою работу с какого-то одного состояния, и повинуясь внешним вызовам transitions(),
переходит в другие состояния (см. пример). Так реализованы переходы по внешней синхронизации.
Если нужно сделать несколько выходов из состояния, то в transitions() просто пишется условный оператор.
Триггеры переходов реализуются аналогичной проверкой внутри этих функций.
Если нужно остаться в текущем состоянии, то функция transitions() должна вернуть this.
Для завершения работы машины возвращаемое переходом значение — 0 (см. цикл функции main).

Александр Т.Звягин

---- cut ----

Код приложится, если это будет интересно сайту и журналу.
Re: Подскажите, пожалуйста, как опубликоваться.
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 07.08.07 17:04
Оценка:
Здравствуйте, Atz, Вы писали:

Atz>Зарегестрировался на Вашем сайте и хочу опубликовать на сайте (и возможно, в журнале) код разработанной мной Finest C++ State Machine. Но что-то то-ли я стал слишком стар... то-ли сайт стал слишком велик и запутан... не могу найти на RSDN- е ссылку, как опубликовуать свою статью — и всё тут!


сверстать статью в нашем шаблоне
Автор(ы): Брусенцев Виталий, Чистяков Владислав Юрьевич
Дата: 22.06.2011
Статья описывает шаблон для Microsoft Word предназначенный для верстки статей и преобразования их в формат RSDN ML. В статье рассматриваются вопросы использования шаблона.
и прислать на
... << RSDN@Home 1.2.0 alpha rev. 694>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.