Как стать автором
Обновить

Введение в v-agent ориентированное программирование

Время на прочтение5 мин
Количество просмотров13K
Всего голосов 11: ↑2 и ↓9-5
Комментарии214

Комментарии 214

010? 020? И это что, типа красиво и понятно?

В чистой теории, для спецов, вроде, и так все понятно о чем и к чему я все это придумал. Картинки взяты из моего курса для школьников. Детям по картинкам (комиксам) легче про эту методологию программирования рассказывать.
Ключи _010, _020 "ленивые" школьники уже заменили на массив
[
'comment line_10',
'comment line_20',

]

Это не методология программирования. Это результат истории про то, как ниасилятор нормального программирования с грехом пополам сочинил для себя костыли, но как и большинство фриков (физика, лингвистика, ...) решил, что изобрёл «серебряную пулю» и революционную инновацию.

А полагать всерьез, что приведенный пример кода на Пайтоне существенно менее понятен, чем v-agent ориентированное программирование (VAOP) бред сивой кобылы, приведенный после него — позволяет всерьез задуматься о психическом здоровье автора. Есть, знаете ли, такая штука, как бред систематизаторства.

Это всё ведь похлеще пресловутого «визуального языка программирования ДРАКОН» будет…

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

Ну с детьми вы погорячились, мягко говоря

Как раз наоборот, на примере опросника школьники очень хорошо видят все преимущества v-agent ориентированное программирование (VAOP) в веб-программировании:


  1. Стандартный подход — https://github.com/vrakitine/eco-programming-web-without-fsm/blob/master/mysite/main.py
  2. Революционный, VAOP подход — https://github.com/vrakitine/eco-programming-webfsm01/blob/master/mysite/main.py

Все коды для "школьников" в открытом доступе. Подкачайте в pythonanywhere и сами все увидите.
Помните, учиться никогда не поздно )

Что-то вроде конечных автоматов?


Да не, шизофазия, разумеется...

Что-то вроде конечных автоматов…

Я на комменты не обижаюсь. Мне 64 и уже пора в маразм впадать. Сначала постепенно, а потом сразу ) Всё по возрасту )

Спасибо за комментарий
Мне 64 и уже пора в маразм впадать.

Ага, по статье заметно.

Спасибо, что не оставили мою статью без внимания, но мне больше всего понравился один из первых комментариев от DoctorMoriarty и я его всегда, если в маразме, показываю тем, кому объясняю основы VAOP со словами - вот Вам замечательный пример короткой и жестко аргументированной оценки моей статьи. Жаль, конечно, что только очень небольшая, русскоговорящая, часть из них могут ощутить все красоту комментария от DoctorMoriarty. Пробовали на английский этот комментарий перевести, но Вы же сами понимаете что это, увы, невозможно ) Вся его красота пропадает. Эту статью, вообще, стоило написать только ради того, чтобы заслужить такой Комментарий.

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

Статья, действительно ужасно непонятная и была написала не сколько с целью чтобы кто-то чего-то понял, а с целью застолбить в рускоязычном ресурсе наш российский приоритет в VAOP и застолбит новую терминологию - VA-script, VA-box и т.л. для этой совершенно новой методологии программирования

Напомню Вам, что Методология программирования — это совокупность идей, понятий, принципов, способов и средств, определяющая стиль написания, отладки и сопровождения программ.

Представление апгоритма работы программного продукта в форме "v-agent script", понятной всем участникам разработки — заказчику, программисту и исполняющей среде (компьютеру)

Нет, ни заказчику, ни программисту такая запись не понятна. Задача не выполнена.

Самое интересное, что это статья не теоретическое измышление, рожденное на ровном месте, а результат обобщения автором конкретных применений этого подхода в своей практике, начиная с 1981 года. Откуда Вы взяли, что непонятно. Всегда было всем и все понятно )
Откуда Вы взяли, что непонятно.

Оттуда, что я прочитал вашу запись сначала как программист, а потом как заказчик, и оба раза непонятно.

Странно
Я с декабря 2020, по воскресеньям в 10 утра (по торонтовскому) в google meeting провожу бесплатный онлайн мастер класс по v-agent ориентированному программированию (VAOP) для всех желающих.
Могу прислать Вам приглашение
Присоединяйтесь к мастер классу через t.me/joinchat/UIPhWUe2Yx1mnYxn

А зачем мне? Никакую мою задачу эта "парадигма" не решает.

Значит Вы что-то поняли в VAOP если пришли к такому выводу?
Хотя, как нет универсальной отвертки, так и «парадигмы».
Существенным отличием VAOP от OOP (Object Oriented Programming), например, является то, что алгоритм задачи записывается в особой форме VA script, а как будет реализован VA-box зависит от конкретной среды. OOP, как и многое подходы, вообще на берут во внимание сам алгорим и это ведет ко многим проблемам при поддержании и модернизации продукта. VAOP одна из немногих методологий программирования, которая заботится о Будущем и, в целом, сильно снижает затраты заказчика в перспективе.
Это я к тому, что если Вас, как, впрочем, и почти всех программистов не интересует будущее Вашего программного творения, то у Вас всё отлично, поздравляю!

VAOP — это более широкий взгляд на создание софта, поднимающий проблему активного включения всех субъектов этого процесса — Заказчика (алгоритмо-задатчика), Программиста (алгоритмо-кодировщика) и Программной среда (алгоритмо-исполнителя)

Взгляд на весь процесс создания ПО новый, непривычный. В этом и проблема понимания…

Мы, три представителя российской школы программирования, выиграли тендер, когда использоволи VAOP, при создании онлайн-системы приема заказов для kpn.com в 2009 году потому, что за ночь смогли внести необходимые изменения в бизнес логику, которую они специально сменили, чтобы могла выиграть нужная фирма. Но не на тех нарвались )
Но это не главное. Система настольно гибная и неубиваемая, что до сих пор они ее модернизируют без особых проблем. Представляете, сколько денег они съэкономили. Повезло ребятам…
Значит Вы что-то поняли в VAOP если пришли к такому выводу?

Я прочитал ваш пост и ваши примеры, и не увидел ни одной моей задачи, которую бы они решали лучше, чем уже доступные мне инструменты.


а как будет реализован VA-box зависит от конкретной среды.

Проще говоря, интерпретатор языка. И что?..


OOP, как и многое подходы, вообще на берут во внимание сам алгорим

Это утверждение неверно.


VAOP одна из немногих методологий программирования, которая заботится о Будущем

Это утверждение нуждается в формализации и доказательстве.


Это я к тому, что если Вас, как, впрочем, и всех программистов не интересует будущее Вашего программного творения, то все у Вас отлично!

Да нет, у меня все не отлично, но там, где у меня не отлично, ваш инструмент мне не помогает.


VAOP — это более широкий взгляд на создание софта, включающий в себя всех субъектов этого процесса

Более широкий, чем что?


Взгляд другой на весь процесс. В этом и проблема понимания…

Какой "другой"? Другой, чем что?


Мы выиграли тендер, когда использоволи VAOP, при создании онлайн-системы приема заказов для kpn.com в 2009 году потому, что за ночь смогри внести необходимые изменения в бизнес логику, которую они специально сменили, чтобы могла выиграть нужная фирма.

Вы это так описываете, как будто это что-то уникальное.


Представляете, сколько денег они съэкономили.

Нет, не представляем, потому что не знаем, сколько стоит "модернизация без проблем" системы 12-летней давности. Обычно, в моем опыте, достаточно дорого, но что я знаю...

О чем спор? Дополнительная отвертка в программировании не помешает.
Каюсь, я должен так писать — Что это самое-самое. Хотя, почему бы и нет)
Маркетинговую составляющую нашей повседневности пока никто не отменял), но Вы, я Вам зто точто обещаю, еще поспорите про VAOP и не только со мной)
Вся проблема в том, что, как показывает практика (могу показать на конкретных примерах), VAOP реально работающая штуковина, дающая кучу преимуществ и нам уже без неё не жить )
Кстати, о Ваших задачах. Может, Вы, просто не видите где можно применить VAOP. Подписывайтесь на мой бесплатный мастер класс
t.me/joinchat/UIPhWUe2Yx1mnYxn
и вместе посмотрим. У меня очень богатый опыт консалтинга.
О чем спор?

Об обоснованности ваших громких заявлений об уникальности и революционности.


как показывает практика (могу показать на конкретных примерах), VAOP реально работающая штуковина, дающая кучу преимуществ

Покажите.


нам уже без неё не жить

Я без нее прекрасно жил свои k лет в индустрии и, думаю, и дальше прекрасно проживу. Языки с сильной типизацией меня настораживают намного больше.


Может, Вы, просто не видите где можно применить VAOP.

Не вижу, да. Вот у меня есть задача: хочу, чтобы когда я меняю ПО (например, правлю где-то бизнес-логику), я был уверен — не в голове уверен, а программа давала мне гарантию — что вся остальная часть ПО, которую я не планировал менять, работала как и раньше. Как мне VAOP в этом поможет?

У Вас четыре вопроса.
1. Каюсь это маркетинговый момент. Чем меньше птичка, тем громче ей надо кричать. Хотя время покажет )
2. Мне надо подготовиться и я сделаю ссылки, а может лучше статью напишу
3. Я ниже ReDev1L, по-моему, и на это Ваше замечание ответил?
4. Мне надо больше инфы по Вашей ситуации, но на первый вскид ес лиделать все в модулях в VA box, то там как раз если вы что-то меняете в какой-то месте алгоримта (читай в секции в VA box) то в друних секциях ничего не меняется и логика перехода между VA node не изменится, если Вы ничего в VA script менять не будете.
Все, вроде, для Вас подходит. Да, вообще, не у одного у Вас такие проблемы. Внешние условия меняются и любое ПО нужно подправлять иначе не получается )
Я ниже ReDev1L, по-моему, и на это Ваше замечание ответил?

Нет.


но на первый вскид ес лиделать все в модулях в VA box, то там как раз если вы что-то меняете в какой-то месте алгоримта (читай в секции в VA box) то в друних секциях ничего не меняется и логика перехода между VA node не изменится

Создается ощущение, что с проблемами поддержки крупных систем никогда не сталкивались. Это прямо странно, учитывая заявленный вами опыт.


Вот возьмем ваш пример:


actions = {
    "Action_00":{
        "_action_description":{
            "_010":"--> init action",
            "_020":"--> Set array M, i = 0; sum = 0"
        },
        "Direction_10":"Action_10",  "_010":"Done"
    }, 
    "Action_10":{
        "_action_description":{
            "_010":"--> sum = sum + M[i]"
        },
        "Direction_10":"Action_20",  "_010":"Done"
    }, 
    "Action_20":{
        "_action_description":{
            "_010":"--> i = i + 1",
            "_020":"-->if i > len(M) - 1"
        },
        "Direction_10":"Action_END",  "_010":"Yes",
        "Direction_20":"Action_10",  "_020":"No"
    }
}

… и напишем там в Action_00 вместо sum = 0total = 0 (безобидный рефакторинг, переименовываю переменную во имя читаемости).


Останется ли программа работоспособной?


Да, вообще, не у одного у Вас такие проблемы.

Да, это типовая проблема в разработке ПО, и я хотел увидеть, какие инструменты для ее решения вы предлагаете. Пока что никаких.

Да, останется, потому что это всего лишь описание, которое никак на программу не влияет. Автор пишет описание алгоритма, но все равно пишет код для исполнения этого алгоритма. В общем — изобрёл комментарии (даже не аннотации).

Wait, what?


Я думал, код генерится из этого описания. Если это не так, то все утверждения про "изменения в одном месте" — это банальное вранье.

Да где он генерится?)
И еще, цитирую Вас — "… Тогда уж надо писать язык на котором можно написать алгоритм и сгенерировать с него блок-схему и код на другие языки программирования." Может и нужно, но пока и VAOP можно успешно применять и этому у меня много примеров.

Нету никаких генераторов )
Нету никаких генераторов

Если это правда, то утверждение "она именно так и работает как записано в VA script потому, что иначе быть не может" ложно.


Впрочем, я перечитал слайды повнимательнее, и это не единственное ложное утверждение.

Что это за бред? Я не понял отличий кода, кроме как вставок-описаний и лишних управляющих конструкций. Всё это заменяется аннотациями либо комментами и выплёвывается в веб-доку в CI. А если нужно описывать алгоритм — для этого есть блок схема, понятная всем.
Тогда уж надо писать язык на котором можно написать алгоритм и сгенерировать с него блок-схему и код на другие языки программирования.
Спасибо за такие комментарии. Они позволяют мне отвечать на них и объяснять другим всю простоту и уникальность VAOP.
Все не так в реале, как вы пишите и блок-схему алгоритма не рисуют, а если и рисуют, то не подправляют потом, а программисты не комментят ничего толком, а потом добавления, изменения фунционала делают на бегу. Да все это знают…
А вот если ЕСТЬ ВОЗМОЖНОСТЬ (не всегда и не везде это удобно) использовать VA script, то все будут следовать одному алгоритму и даже через надцать лет кто-то задумает что-то изменить, то это не составит труда. Для применения VAOP не надо ничего изобретать, ведь, по сути это всего лишь логическая прослойка, некий дополнильный и очень повезный уровень абстракции… (Теоретики, да подправьте меня как это правильно назвать)

В реале никто толком не знаем что там в системе происходит и какое действие «алгоритма» выполняется в каждые момент времени.
Многие, кто используют VAOP отмечают из основных удобст возможность записи логов как переход от действия к действию, что очень помогает при сбоях понять как дошли до этого. Мне же больше всего нравиться то, что даже через много лет мне не составляет труда быстро по VA script понять как работает система. Самое главное, что она именно так и работает как записано в VA script потому, что иначе быть не может, а в VA box ничего не перемешано и каждому дейсвию соответствует своя, назависимая секция или модуль кода и если мне надо что-то поменять, то я, как программист, согласую все изменения с заказчиков, тыкая пальчиком в VA script, и вношу поправки в VA box. А если программист сменился, то без VAOP ой сколько проблем, что порой лучше все заново переписать )

И еще, цитирую Вас — "… Тогда уж надо писать язык на котором можно написать алгоритм и сгенерировать с него блок-схему и код на другие языки программирования." Может и нужно, но пока и VAOP можно успешно применять и этому у меня много примеров.

К слову о теоретиках. Один замечательный знаток предмета Dmitry Ponyatov, оставил судьбоносный комментарий к моему видео youtu.be/6xzn78onzQk где заложил теоретическую базу VAOP. Он со своей высоты увидел то, что я, как практик, делал без всякой теории. Почитайте его комментарий и Вы поймете о чем я говорю. Короче, Dmitry Ponyatov большое спасибо и респект!
то все будут следовать одному алгоритму и даже через надцать лет кто-то задумает что-то изменить, то это не составит труда.

Вы не поверите, но если использовать просто Python или просто C# или просто (еще много языков), то все тоже будут следовать одному алгоритму, и поменять что-то не составит труда.


В реале никто толком не знаем что там в системе происходит и какое действие «алгоритма» выполняется в каждые момент времени.

"В реале" в системах есть логирование, трассировка (включая распределенную) и многие другие интересные средства отладки.


Мне же больше всего нравиться то, что даже через много лет мне не составляет труда быстро по VA script понять как работает система.

Вот здесь, на самом деле, написано очень важное — вам не составляет труда понять. Вам не составляет, да. А кому-то другому будет составлять.


Точно так же, как мне не составляет труда понять, как работает система, написанная на C#. А кому-то другому будет составлять.


Самое главное, что она именно так и работает как записано в VA script потому, что иначе быть не может, а в VA box ничего не перемешано и каждому дейсвию соответствует своя, назависимая секция или модуль кода и если мне надо что-то поменять, то я, как программист, согласую все изменения с заказчиков, тыкая пальчиком в VA script, и вношу поправки в VA box.

Самое главное, что программа на C# именно так и работает, как записано в C#, потому, что иначе быть не может, а в классах ничего не перемешано, и каждому действию соответствует свой, независимый метод или интерфейс, и если мне надо что-то поменять, то я, как программист, согласую все изменения с заказчиком, тыкая пальчиком в C#, и вношу поправки в код.

я не «замечательный знаток предмета» явно — конечные автоматы в любую программу вуза по ИТ входят, просто многие упускают, или не приходится пересекаться и потом про них забывают

а что касается подходов — я на Erlang/Elixir тоже уже ссылки скидывал, там очень близко по подходам, и обработка сообщений, и FSM, + готовая отлаженная за 25+ лет полноценная инфраструктура, код синтаксически вменяемо выглядит, есть небольшое community

около-функциональщина многим конечно не заходит, но если уж применять такие синтетические подходы — готовая инфраструктура, библиотеки, и накопленная кодовая база в Erlang стоит того чтобы немножко подвинуть мышление в плане синтаксиса

ЗЫ: по книжкам наверно проще англоязычную будет достать: Saša Jurić Elixir in Action /2nd ed/
как пример, изобразил тот же КА на эликсире:
github.com/ponyatov/w/blob/3211fd253018f07da382871cf2d08b80574b72e6/vaop/lib/vaop.ex

  • по количеству строк кода получается в пару раз больше, но с комментариями — если сжать, получится примерно столько же
  • кажется более читабельным
  • показал пару фишек языка — сопостравление с образцом, полиморфные функции с гвардами

Мне кажется, вот уж для конечных автоматов-то решений предостаточно. Ну не знаю там, Akka FSM какая-нибудь.

Самое главное, что она именно так и работает как записано в VA script потому, что иначе быть не может

Ну-ну.
Всё что написано здесь:
actions = {
    "Action_00":{
        "_action_description":{
            "_010":"--> init action",
            "_020":"--> Set array M, i = 0; sum = 0"
        },
        "Direction_10":"Action_10",  "_010":"Done"
    }, 
    "Action_10":{
        "_action_description":{
            "_010":"--> sum = sum + M[i]"
        },
        "Direction_10":"Action_20",  "_010":"Done"
    }, 
    "Action_20":{
        "_action_description":{
            "_010":"--> i = i + 1",
            "_020":"-->if i > len(M) - 1"
        },
        "Direction_10":"Action_END",  "_010":"Yes",
        "Direction_20":"Action_10",  "_020":"No"
    }
}

Не имеет никакого отношения к тому что написано здесь:
    if current_action in actions:
        if current_action == "Action_10":
            sum = sum + M[i]  
            direction = "Direction_10" # Done
        if current_action == "Action_20":
            i = i + 1 
            direction = "Direction_20" # No
            if i > len(M) - 1:
                direction = "Direction_10" # Yes
        continue
    break # end of loop where 1 == 1

Вы всё равно пишете реализацию и что написано в массиве actions — не имеет никакого отношения к реализации вашего алгоритма (кроме как в вашей голове и для смены стейта в вашей реализации). Более того это просто лишнее. Стейт убираем, комментируем код — и всё становится хорошо.
Самое главное, что она именно так и работает как записано в VA script потому, что иначе быть не может, а в VA box ничего не перемешано и каждому дейсвию соответствует своя, назависимая секция или модуль кода и если мне надо что-то поменять, то я, как программист, согласую все изменения с заказчиков, тыкая пальчиком в VA script, и вношу поправки в VA box.

Код, который "v-agent box", генерится из "v-agent script", или пишется программистом самостоятельно? И если самостоятельно, то чем гарантируется соответствие этого кода тому, что написано в "v-agent script"?

человек пытается упростить, сделать понятным запись алгоритма/кода для заказчика.

но видимо не очень получается — конечный автомат концепция по уровню абстракции сильно ниже современных языков программирования, в итоге слишком много boilerplate кода и читаемость тоже как то не то

Впрочем, конечно, все, что надо знать про этот подход, описывается следующим:


Применение v-agent ориентированное программирование (VAOP) для нахождения суммы элементов массива на языке Python

actions = {
    "Action_00":{
        "_action_description":{
            "_010":"--> init action",
            "_020":"--> Set array M, i = 0; sum = 0"
        },
        "Direction_10":"Action_10",  "_010":"Done"
    }, 
    "Action_10":{
        "_action_description":{
            "_010":"--> sum = sum + M[i]"
        },
        "Direction_10":"Action_20",  "_010":"Done"
    }, 
    "Action_20":{
        "_action_description":{
            "_010":"--> i = i + 1",
            "_020":"-->if i > len(M) - 1"
        },
        "Direction_10":"Action_END",  "_010":"Yes",
        "Direction_20":"Action_10",  "_020":"No"
    }
}

А теперь то же самое на питоне (делам вид, что в питоне нет для этого встроенной функциональности):


sum = 0
for m in M:
  sum = sum + m

А теперь давайте попросим автора статьи показать код с применением VAOP, эквивалентный чему-то вот такому:


Corpus
.Documents
.SelectMany(p => p.Words)
.GroupBy(w => w, (word, words) => (word, usages: words.Count()))
.OrderByDescending(word => word.usages)
.Take(10)
Давайте лучше переведем разговор в конструтивное русло.
У меня есть, пример применения VAOP для реализации алгорима en.wikipedia.org/wiki/Top_trading_cycle
Я с заказчиком вчера поговорил и он дал согласие, что можно показать код, но не реальный входный данные. Пару лет назад писал это для него на Python.
Напишу статью про это здесь и обсудим.
Дайте мне пару недель на это.
Завтра на мастер классе обсудим эту тему.
>с заказчиком вчера поговорил

Петрик, помнится, свои «фильтры» с заказчиками тоже обсуждал. И даже продавал им какое-то время.

Ненене, подождите. Обсуждение вами же приведенных примеров из статьи — это что ни на есть конструктивное русло. Нет?


А пример, который привел я, я дольше придумывал, чем писал. Если ваш подход так продуктивен и удобен, как вы рассказываете, не должно быть проблемы представить эту последовательность операций. А если это проблема… то у вашего подхода проблема.

Да нет, там поинтересней будет, чем с примером в статье. Там драматургия своя подключится. Работа с заказчиком. Вариант кодоa без VAOP. Проблема с этим кодом. Озарение. Подключение VAOP. Реакция заказчика на VA script. Принятие его и все в этом душе в лицах, Победа над задачей. Короче, скучно не будет )

Да нет, там поинтересней будет, чем с примером в статье.

Вы начните с примера в статье и в моем комменте. Если они нерешаемы нормально, то какой смысл в вашем "интересно"?


Там драматургия своя подключится. Работа с заказчиком. Вариант кодоa без VAOP. Проблема с этим кодом. Озарение. Подключение VAOP. Реакция заказчика на VA script. Принятие его и все в этом душе в лицах, Победа над задачей.

"Вы прослушали краткое содержание курса "как продавать VAOP"". Понимаете, мне не интересны методики "как продавать VAOP". Мне интересно, какие проблемы он решает лучше, чем существующие интересы.

Вот там и расскажу как VAOP решает проблемы лучше других. В VAOP общение с заказчиком ( с тем кто формулирует задачу ) очень важный момент, который совершенно не рассматривается в других методологиях.
Статья писалась, чтобы определится с терминологией, которую я придумал неделю назад. По терминологии, VA script, box, node, вроде замечаний нет. Вот и отлично.
Еще планирую статью как VAOP я применял в веб-разработках..


А что касается Вашей задачи
Corpus
.Documents
то не могли бы Вы ее, как положено "заказчику", письменно, по пунктам сформулировать, а я попробую ее решить с применением VAOP

В VAOP общение с заказчиком ( с тем кто формулирует задачу ) очень важный момент, который совершенно не рассматривается в других методологиях.

Рассматривается. В DDD рассматривается, в Agile рассматривается.


По терминологии, VA script, box, node, вроде замечаний нет.

Нет замечаний, потому что нет определений. Что обсуждать-то? Сепулек?


то не могли бы Вы ее, как положено "заказчику", письменно, по пунктам сформулировать

Ммм, вы не можете приведенный код прочитать? Он тривиален: вернуть десять самых частых слов из корпуса документов.

Класс! Мистика какая-то. Вы меня телепортировали в 1976 год
Первый курс МИФИ. Мы тогда на языке типа Basic делали первые шаги в программировании на первом курсе. У меня курсовая была похожая — отсортировать массив в порядке убывания кратности встречающихся в нем элементов.
Ну это если значение 5, например, чаще всего встречается, то его на первое место и так далее.
Похожая задача, правда, или у Вас посложнее?

Да я сразу сказал, что задача тривиальная. Типа, на один уровень посложнее задачи "просуммировать все элементы в массиве".


Вопрос в том, как будет выглядеть запись решения этой тривиальной задачи в разных парадигмах.

А зачем это сравнивать? Это как в анекдоте — купил сын в село жигули, а отец — как же мы будем на этом сено возить))
Каждая методология под свое заточена ), как отвёртка)

А зачем это сравнивать?

Затем, что вы пишете (выделение мое): "в сравнении с другими технолониями, v-agent ориентированное программирование существенно снижает затраты как на этапе разработки, так и во время сопровождения и обновления программного продукта".


Зачем вы сравниваете разные методологии?


Каждая методология под свое заточена ), как отвёртка)

Ну вот методология, от которой этот код, заточена решать прикладные задачи бизнеса. Ваш VOAP не на это заточен? А на что?


PS Впрочем, признаюсь честно: то, что вы уже два коммента пытаетесь уйти от того, чтобы написать эквивалентный код, для меня лично очень много говорит о вашей методологии.

Если для задачи возможно написать алгоритм, то VAOP его реализует. Это видно из статьи. Терпение, мой друг, у меня есть примеры применения, VAOP.
Я сказал, что напишу две статьи. Одну про про TTC, а вторую как в веб-разработках я УЖЕ УСПЕШНО юзал VAOP.

Сначала вы сказали, что "А что касается Вашей задачи [...] а я попробую ее решить с применением VAOP", а теперь переключились на (уже две) статьи. Занятно.


Напрашивается вывод, что решать эту задачу вы или не можете, или по каким-то причинам не хотите.

Вы правы, лень. VAOP реализует любой алогоритм, если его можно записать ввиде блок-схемы или, соответственно, ввиде VA script. У меня для школьников есть примеры реализации простых алгоритмов в VAOP.
FOR_U040_60_V2.0 — это в Jypiter note
Сила VAOP в том, что это не язык программирования, а усилитель любого языка программирования, оболочка, метод, прием или, как это лучше сказать, приправа, для достижения результатов в решении поставленной заказчиком задачи )

Вы правы, лень.

Если вам лень, значит, эта задача слишком трудоемка для вашего подхода. Учитывая, что в языке, на котором пример, ее реализация проще, чем ее формулировка, это много говорит о вашем подходе.


Сила VAOP в том, что это не язык программирования, а усилитель любого языка программирования

Пока что ни в одном приведенном примере никакого улучшения не видно.

На не сложных алгоритмах, действительно, преимуществ не видно. Я подробно расскажу про сложный алгоритм в статье и покажу, что без VAOP требования заказчика было бы очень сложно осуществить и даже невозможно

На не сложных алгоритмах, действительно, преимуществ не видно.

Это значит, что утверждение "в сравнении с другими технолониями, v-agent ориентированное программирование существенно снижает затраты как на этапе разработки, так и во время сопровождения и обновления программного продукта" неверно как минимум в общем случае.

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

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


Ну просто вот скажем, сортировка — алгоритмически нетривиальная задача, но ее не надо писать самому, достаточно готовую взять. Парсинг? Все разы, когда он мне был нужен, я брал готовый (вот Sprache, скажем, прекрасно зашел, а для задачи рядом — Microsoft.Recognizers.Text; в соседнем проекте был ANTLR). Не знаю даже, что еще вспомнить. Написать сколько-то эффективный дата-пайплайн — это занятная задача, но она не алгоритмическая. И что остается?..

Мне задача попалась пару лет назад в основе которой лежит этот алгоритм
https://en.wikipedia.org/wiki/Top_trading_cycle
Довольно сложная, особенно, если всякие дополнительные условия заказчик накладывает и, главное, меняет эти условия при уже написанном коде.
Я про это в статье расскажу. У меня там как раз два подхода можно будет сравнить потому, что я сначала поленился и сделал как все, а потом, когда заказчик начал оптимизировать некоторые штуки и менять алгоритм, понял, что без VAOP не обойтись

То, что у вас в качестве примера есть ровно одна задача, которая вам попалась "пару лет назад", некоторым образом подтверждает мой тезис о том, что подобного рода задачи нечасты.

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

Я тоже так думал и сделал обычными циклами, но дьявол, как всегда в деталях. Как только заказчик начал играть "деталями" у меня все посыпалось и, самое интересное, мы уже оба через неделю глядя на код не помнили какие новые изменения мы внесли. Алгоритм весь был на рваных листочках и что делать, как двигаться дальше было непонятно. Тогда я усадил заказчика (далекого от программирования) за комп и мы вместе в текстовом редакторе начали писать VA script. К моему удивлению, после пары узлов или VA nodes он очень быстро освоился и мы за час записали весь алгоритм как VA script. Неделя у меня ушла на VA box и это с учетом того, что я юзал Python первый раз. Но не это главное. На следующий день после того, как мы закончили первый вариант VA script и я сидел и пилил VA box, заказчик звонит мне и говорит, что он тут посмотрел внимательно алгоритм и подправил чуток. Замечательно (а сам был готов бегать и орать от восторга — ЗАРАБОТАЛО), говорю, сделайте пул реквест и я посмотрю. Мы удаленно можем работать над одним алгоритмом, правда, мы с Заказчиком работает над алгоритмом, а компьтер по этому алгоритму. Все свершилось!!! Я уже начал, как обещал, статью про это писать. Самое главное, что мы сделали неубиваемую программу. Заказчику нет особых проблем ее модифицировать. VAOP позволяет заказчику без проблем сменить Программиста (меня), так как новый легко разберется или, если надо, переписать VA box под другую среду.
А все это благодаря тому, что, как я уже писал в "манифесте" VAOP:


Идеологически v-agent ориентированное программирование — добивается того, чтобы алгоритм был записан в одном месте в виде, понятном всем — заказчикам, программистам и исполняющей среде (компьютеру), что улучшает процесс взаимодействия всех при создания программного продукта и, что особенно важно, существенно снижает затраты на этапе поддержания работы и адаптации к изменению внешних условий в Будущем.

так как новый легко разберется

Ну не совсем. Если взять нового питониста, он-то более-менее разберётся в незнакомом коде на Питоне, без посторонней помощи (может, и не сразу). Но вот если новый программист увидит VOAP, он только почещет репу "что это вообще такое" :)
Откуда уверенность в том, что это проще и все сразу быстро разберутся? Кроме вас кто-то ещё с этим серьёзно работал? В собственную "родную" кодовую базу-то проще делать правки, в каком виде бы она ни была записана. Вам приходилось работать с чужим VOAP-кодом?


заказчик звонит мне и говорит, что он тут посмотрел внимательно алгоритм и подправил чуток

Ну ведь смотря какая правка. Если плюс на минус поменять, это же тривиально в любом коде, например.

самое интересное, мы уже оба через неделю глядя на код не помнили какие новые изменения мы внесли

Чтобы помнить, какие изменения внесены, используется версионироние (иногда вместе с комментариями, если нужно указать изменения относительно внешнего источника).


так как новый легко разберется или, если надо, переписать VA box под другую среду.

А точно разберется? Откуда такая уверенность?


чтобы алгоритм был записан в одном месте в виде, понятном всем

Я уже спрашивал, повторю еще вопрос еще раз: код в v-box генерится из v-script или пишется программистом самостоятельно?

  1. В идеале — да
  2. Полегче будет, ведь алгоритм в VA script есть и в VA box все экшены закодированы и по полочкам разложены
  3. Ничего там не генериться и не надо. Просто предлагается шаблон для конструирования программы.
    В статье в примере, вроде все это видно.
В статье ничего не видно. Просто показаны рядом два текста — script и box. Как одно связано с другим технически и как контролируется, что изменив script мы получим эквивалентные изменения в box и наоборот, нигде не говорится.

Спасибо. Надо будет в деталях все расписать кто и за что отвечает.
VA script за общую алгоритмическую логику отвечает, в боксе только действия закодипованы и код дирекшена определяется и та все крутится )
Вот почему я курс лекций пишу с кучей примеров для разных мест применения.

Вы хотя бы просто скажите, за счёт какой магии изменения в скрипте попадают в бокс. Этим должен заниматься сам программист вручную или есть специальный транслятор, а может прилетает фея и машет волшебной палочкой?

Никакой магии потому, что ничего никуда не надо переносить. Каждый отвечает за своё.
Все гениальное — просто )
VA script отвечает за логику переходов между Action или Действиями, а в VA box находиться код самих действий. После каждого Действия (завершения кода действия) определяется код направления — Direction, чтобы по коду текущего действия и этому коду направления определить следующее действие.


В простом примере, в статье
"_action_description":{
"_010":"--> i = i + 1",
"_020":"-->if i > len(M) — 1"
так подробно описано что делать и это вводит всех в заблуждение. Там, в реальных скриптах, коротко пишется что надо сделать в этом Action
Как например
"_action_description":{
"_010":"--> Увеличить i на единицу и проверить на конец массива"


Надо будет так пример переписать, чтобы о синхронизации изменений не было вопросов )


VAOP — это шаблон, следуя которому, даже новичек напишет отличный, всем понятный код


Вот реалный VA script
s01… это как у нас Action, а v_… это как у нас Direction


{
    "s_01_0000":
        {   
        "state_descriptions":
            {
            "_000":"==> state for - init",
            "_010":"- Set environment for tracking and logging",
            "_020":"- max_m = 200"
            },
        "v_00":  "s_01_0000",   "00":   "Init",
        "v_10":  "s_01_0010",   "10":   "Start"
        },
    "s_01_0010":
        {
        "state_descriptions":
            {
            "_000":"==> state for - check max_m and other reason to stop",
            "_010":"-check if not reached max_m || unassignedArray is empty || All site_capacity=0 || All site_balance>0",
            "_020":"-add to message to log"
            },
        "v_10":  "s_01_0020",   "10":   "ok",
        "v_20":  "s_01_0080",   "20":   "done - reached max_m or not more loop found",
        "v_30":  "s_01_0081",   "30":   "done - isUnassignedAppsArrayEmpty()",
        "v_40":  "s_01_0082",   "40":   "done - isAllSiteCapacity0() = True",
        "v_45":  "s_01_0083",   "45":   "done - isAllSiteBalanceGT0() = True",
        "v_50":  "s_01_0020",   "50":   "test"
        },
    "s_01_0020":
        {
        "state_descriptions":
            {
            "_000":"==> state for - if",
            "_010":"- Remove all sites from all applicant lists where applicant weight > capacity",
            "_020":"- Remove all applicant from all site lists where applicant in assigned",
            "_025":"- Remove all applicant from all site lists where applicant site list is empty",
            "_030":"- getFirstNotCheckedAapplicant from unassignedArray",
            "-035":"- set gl_max_jump",
            "_040":"- set gl_taken_sites_capacity_dict",
            "_050":"- set gl_checked_applicants_code_list",
            "_060":"- is last applicant?"
        },
        "v_10":  "s_01_0010",   "10":   "Yes",
        "v_20":  "s_01_0035",   "20":   "No",
        "v_30":  "s_01_0000",   "30":   "test"
        },
    "s_01_0035":
        {
        "state_descriptions":
            {
            "_000":"==> state for - --",
            "_010":"- check how many jumps",
            "_020":"- get first site from applicants list",
            "-030":"- add to gl_checked_applicants_code_list",
            "_040":"- Update gl_checked_applicants_code_list"
            },
        "v_10":  "s_01_0040",       "10":   "ok",
        "v_20":  "s_01_0020",       "20":   "- not enough capacity || site balance > 0",
        "v_30":  "s_01_0020",       "30 Error ???":   "- rank_list is empty",
        "v_40":  "Err_0035_030",    "40":   "- site does not exist",
        "v_50":  "s_01_0020",       "50":   "- if jumps > jump_m"
        },
    "s_01_0040":
        {
        "state_descriptions":
            {
            "_000":"==> state for - --",
            "_010":"- get first applicant from site's list"
            },
        "v_10":  "s_01_0050",   "10":   "ok",
        "v_20":  "s_01_0020",   "20":   "- rank_list is empty",
        "v_30":  "Err_0040_020","30":   "- applicant does not exist"
        },
    "s_01_0050":
        {
        "state_descriptions":
            {
            "_000":"==> state for - --",
            "_010":"- add to stack and check for loop"
            },
        "v_10":  "s_01_0060",   "10":   "- loop",
        "v_20":  "s_01_0035",   "20":   "- no loop"
        },
    "s_01_0060":
        {
        "state_descriptions":
            {
            "_000":"==> state for - --",
            "_010":"- check if loopArray is done"
            },
        "v_10":  "s_01_0020",   "10":   "- loop done",
        "v_20":  "s_01_0070",   "20":   "- loop not done"
        },
    "s_01_0070":
        {
        "state_descriptions":
            {
            "_000":"==> state for - --",
            "_010":"- found loop!",
            "_020":"- add applicants in loop to AssignedApplicant array ???",
            "-030":"- take  applicant in loopArray",
            "_040":"- place applicant into result_a",
            "_050":"- reduce capacity of site by applicant's weight (error if site_capacity <0)",
            "_055":"- reduce balance of applicant's home_site by weight",
            "_060":"- cleanup applicant from loopArray"
            },
        "v_10":  "s_01_0060",   "10":   "- loop done"
        },
    "s_01_0080":
        {
        "state_descriptions":
            {
            "_000":"==> state for - Final State",
            "_010":"- any applicant in unassignedArray is assigned to 0",
            "_020":"- create file of result_a",
            "-030":"- create file of result_s (code, capacityleft, balanceleft)",
            "_040":"- create short log"
            }
        },  
    "s_01_00--":
        {
        "state_descriptions":
            {
            "_000":"state for - --",
            "_010":"",
            "_020":"",
            "-030":"",
            "_040":""
            },
        "v_10":  "s_01_00--",   "10":   "",
        "v_20":  "s_01_00--",   "20":   ""
        }
}
Понятно. Скрипт — аналог рамочек и стрелок блок-схемы, а бокс — содержимое отдельных блоков схемы.
В общем, очередной способ запутать логику и раздуть код. Ничего полезного.
Даже пресловутый Дракон, и тот выглядит привлекательнее при всех своих недостатках.
P.S. А что будет, если в примере из статьи программист ошибся, и вместо
direction = "Direction_10" # Yes
написал
direction = "Direction_20" # Yes
Я так понимаю, что никаким статическим анализатором эту ошибку не отловить и придётся ковыряться разом в обоих частях вашей программы, чтобы понять, почему цикл никогда не заканчивается.

VAOP не требует ничего особенного, легко изучается и применяется. Я думаю жить будет, а почему бы и нет )
Боксов понаделаем и народ будем юзать в разный программных средах. Время покажет…
Мы здесь ошибочно замыкаемся на одном кодировании, а все сложнее и не надо забывать, что это только первые шаги вашего программного продукта. Может VAOP окажетя полезным при сопровождении и модернизации. Поговорим об этом после моей следущей статьи. Я там поднимаю этот не простой вопрос.


P.S. А что будет, если в примере из статьи программист ошибся, и вместо
direction = "Direction_10" # Yes
написал
direction = "Direction_20" # Yes
Я так понимаю, что никаким статическим анализатором эту ошибку не отловить и придётся ковыряться разом в обоих частях вашей программы, чтобы понять, почему цикл никогда не заканчивается.

Видимо вы правы, хотя по логам переходов между состояниями-действиями возможно это отловить.
Кстати, ошибки там легко искать. По логам всегда знаешь как ты дошел до контретного кода дейсвия и в нем уже ищешь ошибку. Короче, время покажет и пусть у разработчиков появится еще одна альтернатива — как писать код )

VAOP — это шаблон, следуя которому, даже новичек напишет отличный, всем понятный код

Нет, просто нет.


Вот реалный VA script

Этот пример нечитаем. Что очередной раз показывает, что ваши "понятный всем язык" ничем не подтверждены.


Там, в реальных скриптах, коротко пишется что надо сделать в этом Action

… и чем это лучше обычных требований? Неоднозначность как была, так и осталась, только теперь вы еще и не позволяете программисту сделать декомпозицию кода так, как ему удобно. А теперь программисту еще и надо следить, чтобы идентификаторы совпадали с теми, которые в скрипте.


Зачем это все нужно, когда можно просто описать FSM в коде?

Я же пишу. Время покажет. Если приживется, по народ будет пользовать. Если это ерунда, то само все отомрет )


VAOP — это шаблон, следуя которому, даже новичек напишет отличный, всем понятный код

Нет, просто нет.
Вы пишите. Я с Вами не хочу спорить, просто, давайте проверим как дело пойдет )
Через год можно вернуться к этому разговору.
Сорок лет применяю этот подход. Тендеры благодаря ему выигрывали, я лекции читал, студенты курсовые у меня писали на эту тему, а Вы мне нет да нет. Откуда такая уверенность )

Есть, понимаете ли, некоторая разница между утверждениями "Время покажет. Если приживется, по народ будет пользовать. Если это ерунда, то само все отомрет" и "v-agent ориентированное программирование инновация в разработке программных продуктов сравнимая с удобствами полученными человечеством при переходе от римской системы счисления к арабской"/"улучшает процесс взаимодействия всех при создания программного продукта и, что особенно важно, существенно снижает затраты на этапе поддержания работы и адаптации к изменению внешних условий в Будущем".


Через год можно вернуться к этому разговору

Учитывая, что вы, по вашим словам, предложили эту методику в 1981 году, то есть, на минуточку, 40 лет (!) назад, а в 2009 с ее помощью выиграли тендер, не верю, что за год что-то изменится.


Я лекции читал, студенты курсовые у меня писали на эту тему, а Вы мне нет да нет. Откуда такая уверенность

Из приведенных вами примеров — в них нет понятного кода, а это примеры, смею предположить, не новичком написанные.


я лекции читал, студенты курсовые у меня писали на эту тему

В том-то и дело, что вы лекции читали, а курсовые студенты у вас писали. Это замкнутая система без внешней оценки.


А внешняя оценка — это то, что вы видите в комментариях к этому посту.

Очень благодорен Вам и всем кого оставил неравнодушным к моей статье.
Просто, мы уже вокруг одного и того же ходим и, вроде, все все поняли и остались при своем.
Дождитесь моей второй статьи, поверьте, там будет что пообсуждать

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

Если за 40 лет для языка не появилось даже удобных инструментов, то скорее всего никогда уже не взлетит. Как минимум, можно было ожидать наличия IDE с генерацией бойлерплейта бокса по схеме, параллельной работой на схеме и в боксе, каким-никаким статическим анализом (хотя-бы наличие и достижимость состояний), отладчиком. Но, я так понимаю, ничего этого нет и не предвидится.

Что вы все на языке зациклились. Это не язык. Это как и ООП примочка к языку. И никто 40 лет ничего не развивал. Я полгода назад решил эту примочки описать и определиться с терминологией. Выкатил это все здесь и уже три дня разговариваем здесь как на разных языках )
Подождите я все растолкую. У меня пенсия через год. Мне же надо себе занятие придумать )

Что вы все на языке зациклились.

Потому что вы обещаете "понятность", а понятности без языка не бывает.


Это как и ООП примочка к языку.

В том-то и дело, что ООП — не "примочка к языку", а методология программирования.


Я полгода назад решил эту примочки описать и определиться с терминологией.

Вот любопытно: как же вы сколько-то там лет читали лекции и курсовые принимали без определенной терминологии? В моем ВУЗе за такое бы съели на первой же защите (а точнее еще на этапе подачи учебного плана).

Кто бы мог подумать, что от Ваших замечаний может быть столько пользы.
В лучший спаринг партнер для любого лектора. Буду Вас рекомендовать. Это серьезно. Я не шучу.


В том-то и дело, что ООП — не "примочка к языку", а методология программирования.
Смотрите какая замечательная идея лекции у меня родилась — сравнить разный меторологии или сравнение VAOP c другими методологиями программирования.

Берем пример из статьи. Студенты уже ее прочитали.


M = [1,2,7,1]
sum = 0
i = 0
while i < len(M):
    sum = sum + M[i]
    i = i + 1
print("\nsum is [" + str(sum) + ']')
print('\nThe End')   

и показываем его с применением VAOP методологии


actions = {
    "Action_00":{
        "_action_description":{
            "_010":"--> init action",
            "_020":"--> Set array M, i = 0; sum = 0"
        },
        "Direction_10":"Action_10",  "_010":"Done"
    }, 
    "Action_10":{
        "_action_description":{
            "_010":"--> sum = sum + M[i]"
        },
        "Direction_10":"Action_20",  "_010":"Done"
    }, 
    "Action_20":{
        "_action_description":{
            "_010":"--> i = i + 1",
            "_020":"-->if i > len(M) - 1"
        },
        "Direction_10":"Action_END",  "_010":"Yes",
        "Direction_20":"Action_10",  "_020":"No"
    }
}

# init block
M = [1,2,7,1]
sum = 0
i = 0
current_action = "Action_00"
direction = "Direction_10"

while 1 == 1:
    # define next action
    action = actions[current_action][direction]
    previous_action = current_action
    current_action = action    
    print(previous_action,direction,current_action, i, sum)
    print('------------------------')

    if current_action in actions:
        if current_action == "Action_10":
            sum = sum + M[i]  
            direction = "Direction_10" # Done
        if current_action == "Action_20":
            i = i + 1 
            direction = "Direction_20" # No
            if i > len(M) - 1:
                direction = "Direction_10" # Yes
        continue
    break # end of loop where 1 == 1

if current_action.find("END") == 0:
       print("\n\Error: current_action:[" + current_action + "]\n")
if current_action.find("END") != 0:
    print("\nsum is [" + str(sum) + ']')
    print('\nThe End')

а домашнее задание сделать этот же пример в ООП, объект создать, методы и все как полагается )


Попросить студентов обратить внимание на то, что у каждой методологии программирования есть своя ИДЕОЛОГИЯ.
Отослать студентов ко второму абзацу статьи, где представлена идеология VAOP, а если у методологии программирования есть своя идеология значит она всё всерьез и надолго.

Смотрите какая замечательная идея лекции у меня родилась — сравнить разный меторологии или сравнение VAOP c другими методологиями программирования. Берем пример из статьи.

Ничего не выйдет, потому что на примере из статьи можно показывать только императивное и декларативное программирование. Для ООП там просто слишком мало деталей.


у каждой методологии программирования есть своя ИДЕОЛОГИЯ. [...] если у методологии программирования есть своя идеология значит она всё всерьез и надолго.

У вас ошибка в рассуждениях. Не может быть "у каждой есть" и одновременно "если есть".

from goto import with_goto

M = [1,2,7,1]
i = 0

def Action_00():
    sum = 0
    i = 0
	
def Action_10():
    sum = sum + M[i]

Action_00()
Action_10()
label .Direction_20
i = i + 1
if i < len(M):
    goto .Direction_20

label .Action_END
print("\nsum is [" + str(sum) + ']')
print('\nThe End')     


Пришлось применять сторонний модуль, но это «ограничение» питона, на Java/C#/C++ будет без проблем.
Что-то у вас совсем нерабочий код получился. Он перебирает индексы не выполняя никаких полезных действий. Да и goto не нужен для FSM.
Да, я кажется не туда метку вставил. Каюсь.

Просто мне показалось что оригинальный автор видит код как-то так, а не в виде FSM.
goto я выбрал только потому что наиболее близкая конструкция которая напоминает директивные переходы между состояний в v-нотации.Хотя возможно я тут и борюсь в ветряными мельницами.

… при этом, заметим, всяких реализаций таких процессов/автоматов, на самом деле, завались. Из условно свеженького, с которым работал буквально в этом месяце — AWS StepFunctions, где и целостность/достижимость проверяются, и визуализация есть, и логи есть.

AWS StepFunctions, где и целостность/достижимость проверяются, и визуализация есть, и логи есть.

Все правильно, но это не как VAOP потому, что это не тянет на методологию программирования ))


Реализаций FSM, дейсвительно, очень много и это замечательно, но VAOP совсем не про это

Все правильно, но это не как VAOP потому, что это не тянет на методологию программирования

А какая разница, если цель в итоге достигается та же самая, функциональность лучше, а усилий с моей стороны меньше?

я лекции читал, студенты курсовые у меня писали на эту тему, а Вы мне нет да нет
А вы не пробовали поинтересоваться у бывших студентов, сколько из них за эти 40 лет использовали ваш систему в своей реальной работе? Интересно, хотя бы один процент наберётся?

В 1981 году, сразу после института, уже на работе, я толко это первый раз придумал и применил и на 20 лет забыл об этом )


А, перед переездом в Канаду, три года преподавал в институте. Больше 20 лет уже прошло. Ничего о тех студентах с тех пор не слышал.
Самому интересно узнать. Одно, точно, знаю, что когда не таким накрученным, как здесь показываешь на деле как просто, можно реализовать VAOP методологию и какие от этого преимущества обалденные то всем очень нравилось. Я имею ввиду коллег по работе, где я применял VAOP в совместной работе. Это ведь как некий шаблон, правила и он накладывается на любой язык программирования. В РНР в Zendframe я его на бекэнде втыкал, где сложная и запутанная логика была. Надо, кстати, будет этому статью посвятить. У меня там даже SPA был на VAOP сделан. Красиво, помню, получилось. Все офигели.
Повспоминать надо. К SPA помню прикрутил, когда в штатах работал. У меня тимлид Дэн, был ему очень такой подход понравился.
Надо еще повспоминать…
Для голландцев, в 2008 вообще всю систему онлайн приёма заказов сделали. Я в видео об этом упоминаю.


Дайте время, мужики, у меня есть про что рассказать )


VAOP на деле очень простая, очень полезная и удобная штучка )

VAOP на деле очень простая, очень полезная и удобная штучка

Ни один из приведенных вами примеров этого не подтверждает.

VAOP на деле очень простая, очень полезная и удобная штучка

Не простая, поскольку усложняет написание, отладку и сопровождение кода, заменяя классическую программу на конечный автомат.
Не полезная, так как увеличивает объём кода, тем самым увеличивая вероятность ошибки.
Не удобная, ибо заставляет программиста работать сразу с двумя текстами, причём без автоматического контроля согласованности изменений.
Не простая, поскольку усложняет написание, отладку и сопровождение кода, заменяя классическую программу на конечный автомат.

… при этом, заметим, конечный автомат, если я правильно помню статью в википедии — не тюринг-полная система.


Пока искал/писал примеры стейт-машин, внезапно задумался — современные языки преимущественно стараются стейт-машины прятать: foreach вместо for, генераторы вместо энумераторов, async/await. А тут автор предлагает обратно вытащить.

Зачем это все нужно, когда можно просто описать FSM в коде?

Извините, пропустил этот вопрос.
Покажите, как без всего этого, просто описать FSM в коде. Можно пример и Вы делали уже это?

Во-первых, уже есть два примера в комментах — AWS StepFunctions (да, там вырожденный случай, но его достаточно, чтобы покрыть все ваши примеры) и Akka FSM. Во-вторых, вот вам пример на F#.


А в-третьих, вот вам пример на C# (написано, опять же, на ходу минут за 5):


enum Steps {Action10, Action20};

var M = new []{1,2,7,1};
var sum = 0;
var i = 0;

Machine<Steps>
.When(Steps.Action10, () => {
  sum += M[i];
  return Steps.Action20;
})
.When(Steps.Action20, () => {
  i++;
  if (i < M.Length)
    return Steps.Action10;
  else
    return null;
})
.Run(Steps.Action10);

… и знаете, в чем отличие всех четырех приведенных вами примеров от вашего подхода? Во всех из них логика расположена действительно в одном месте.

Вот ещё реализация на PHP. К сожалению, enum пока не завезли. Заодно исправил ошибку в вашем коде. Что будет, если подать на вход вашей программы пустой массив?
<?php
class States {
    public const STOP = -1;
    public const START = 0;
    public const ACTION_10 = 10;
    public const ACTION_20 = 20;
    public const ACTION_30 = 30;
}

$state = States::START;
while ($state !== States::STOP) {
    switch($state) {
        case States::START:
            $m = [1, 2, 7, 1];
            $i = 0;
            $sum = 0;
            $state = States::ACTION_20;
            break;
        case States::ACTION_10:
            $sum += $m[$i];
            $i += 1;
            $state = States::ACTION_20;
            break;
        case States::ACTION_20:
            if ($i < count($m)) {
                $state = States::ACTION_10;
            } else {
                $state = States::ACTION_30;
            }
            break;
        case States::ACTION_30;
            print "sum = {$sum}\n";
            $state = States::STOP;
            break;
    }
}
В идеале — да

Тогда зачем нужен VAOP?


Полегче будет, ведь алгоритм в VA script есть и в VA box все экшены закодированы и по полочкам разложены

В нормальном коде тоже есть алгоритм и все разложено по полочкам.


Ничего там не генериться и не надо.

Тогда как обеспечивается согласованность VA script и VA box? Что мешает внести изменения только в один из них?


В статье в примере, вроде все это видно.

В том-то и дело, что не видно (и это иллюстрация к "понятности").

Я более чем уверен, что заказчика проще научить Питону (или хотя бы псевдокоду с синтаксисом Питона), чем вот этому вот спагетти из гламурных декларативных goto, красиво названных v-agent oriented programming.

Мне название тоже очень нравится, если учесть, что "v" это первая буква в моем имени )

Дейкстры на Вас нет с вашим Бейсиком 21-го века

Прийдет время когда саму запись его алгоритма
https://tinyurl.com/5h3xzj7a
в VA script оденут )


К слову, много авторов на хабре, которые как я с бейсика начинали в 1975 году?

Аз есьм. Еще и с продвинутого бейксика — фокала тоже начинал. Когда переходил на паскаль — очень не понятно было, как это без goto можно больше чем if a then atomic_op1 else atomic_op2 end if написать. прям взрыв мозгов был. Но, у меня оправдание есть — это был 9 класс средней школы.

На самом деле, одно дело — определенный Алгоритм. Тут, как раз, кстати, важно «структурное программирование», чтобы верификация и тому подобное.

А, другое дело, Программный Продукт. Тут уже требования, которые никакими v-scirpting-ами не решить (комнонуемость, расширяемость, универсальность (код «работает» не с числами, а с теми, что можно «складывать», например), и т.п.)

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

Я с бейсика начинал, пусть и сильно позже.

VAOP, новая методология программирования, родилось совсем недавно и не на пустом месте. Так получилось, что я применил VAOP, сам того не зная, в 1981 году при написании программы для дублирования перфолент на ЭВМ СМ-1. Согласен, что по сути, это одно из приложений теории конечных автоматов в программировании или реализаций FSM. Потом я применял опыт реализации FSM, программируя некоторые задачи на протяжении 40 лет.
Два года назад я разместил в youtube видео Бесконечные возможности конечных автоматов | Введение в "eco-programming" где рассказывал о чем планируется мой курс онлайн лекций "Введение в 'eco-programming'". Про новую парадигму программирования можно прочитать [здесь]
Год назад Dmitry Ponyatov написал судьбоносный комментарий под этим видео, который год не оставлял меня в покое, пока я не сформулировал основные принципы и идеологию новой методологии программирования. Это был совершенно другой взгляд на многочисленные реализации FSM.
Бегающий агент — как раз то, что объединяет все реализации. VA script и VA box вот все что нужно для v-agent. Все это попытка уйти от понятийной путаницы, когда мы "Что делаем" называем тем "Чем мы это делаем". Dmitry Ponyatov поставил все на свои места. Поднявшись на более высокий уровень, мы можем заметить частное в общем и наоборот при анализе конкретных "реализаций FSM" потому, что все они сделаны для написания кода с применением v-agent oriented programming (VAOP).
Они различаются инструментами по работе с VA script и реализацией VA box.


В этой статье я описываю новую методологию программирования, а не очередную реализацию FSM.
Привенные в статье примеры далеки от совершенства, хотя, вполне работоспособны )

Про новую парадигму программирования можно прочитать [здесь]

Пойти-то можно, а вот читать там нечего. Никакого адекватного описания принципов новой парадигмы там нет.


Бегающий агент — как раз то, что объединяет все реализации.

Что такое "бегающий агент"?


Все это попытка уйти от понятийной путаницы, когда мы "Что делаем" называем тем "Чем мы это делаем".

Чтобы уйти от понятийной путницы, нужно иметь строгую терминологическую систему, которой у вас нет.


наоборот при анализе конкретных "реализаций FSM" потому, что все они сделаны для написания кода с применением v-agent oriented programming (VAOP).

Это утверждение нуждается в формальном доказательстве.

Вообще, конечно, не могу не обратить внимания.


VAOP, новая методология программирования, родилось совсем недавно
[...]
Познакомимся с v-agent ориентированным программированием предложенным в 1981 году

1981 год — это недавно? По меркам программирования это приблизительно, не знаю, XVIII век.

Это понятно, что работа по причесыванию и доведению до ума только началась. Я практик и, притом, старой школы, Надеюсь молодые теоретики подключатся и помогут всем нам.
Вы обратили внимание на формулировку идеологической составляющей новой методологии?

Вы обратили внимание на формулировку идеологической составляющей новой методологии?

Нет. Я не знаю, что из вашего поста является "идеологической составляющей".

В самом начале статьи:
… Идеологически v-agent ориентированное программирование — добивается того, чтобы алгоритм был записан в одном месте в виде, понятном всем — заказчикам, програмистам и исполняюшей среде (компьютеру), что улучшает процесс взаимодействия всех при создания программного продукта и, что особенно важно, существенно снижает затраты на этапе поддержания работы и адаптации к изменению внешних условий в Будущем.

Угу. Разобьем эту "составляющую" на две части. Вторая:


улучшает процесс взаимодействия всех при создания программного продукта и, что особенно важно, существенно снижает затраты на этапе поддержания работы и адаптации к изменению внешних условий в Будущем.

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


Теперь первая:


добивается того, чтобы алгоритм был записан в одном месте в виде, понятном всем — заказчикам, програмистам и исполняюшей среде (компьютеру)

Эта часть не выполняется ни в одном приведенном вами примере (точнее говоря, она выполняется не лучше, чем если бы алгоритм был записан просто кодом).


На что тут предлагается обращать внимание?


PS Еще у вас (а) не определено, кто является заказчиком, и (б) опущены все прочие заинтересованные в процессе разработки ПО лица.


PPS Раз уж вы дали ссылку, вот это вот написано с применением VAOP или нет?

Спасибо за замечания и предложения к улучшению. Теоретикам тут есть над чем поработать. Реализаций FSM очень много и давно пора поместить их под зонтик новой методологии.
Мне для лекций это надо как можно быстрее. Понятийный аппарат нужен. Вот и пытаюсь что-то делать для этого

Реализаций FSM очень много и давно пора поместить их под зонтик новой методологии.

Нет, не пора. Зачем?


Вот и пытаюсь что-то делать для этого

Если судить по этому посту и комментариям, вы пытаетесь рекламировать свою методологию.

Нет, не пора. Зачем?

Надо народ спросить? Может мне одному надо?


Если судить по этому посту и комментариям, вы пытаетесь рекламировать свою методологию.

Нашу. Я сам до такого, точно, бы не допёр )

Может мне одному надо?

Именно.


Зачем помещать под зонтик неизвестной "новой методологии" то, что и так находится под зонтиком понятия FSM и изучается соответствующим разделом теории? Да низачем.


Нашу. Я сам до такого, точно, бы не допёр

Эмм. Процитирую еще раз:


Познакомимся с v-agent ориентированным программированием предложенным [...] Валерием Ракитиным.

Ваша консистентность меня потрясает, да.

Нашу. Я сам до такого, точно, бы не допёр

Это я из скромности ) Многие мне помогали. Вот Вы уже очень сильно помогли. Я уже многое хочу изменить в описании.
Вот и получится методология уже Наша с Вами. Я, вообще, командный игрок. В программировании без этого плохо всё получиется. Я дал линк на этот пост всем своим знакомым и они очень за меня переживали.
Спасибо, друзья за Поддержку!!!
Надо с моей кафедрой в МИФИ связаться. Отличная тема для дипломных работ.

Вот и получится методология уже Наша с Вами.

Нет, не получится.

добивается того, чтобы алгоритм был записан в одном месте в виде, понятном всем — заказчикам, програмистам и исполняюшей среде (компьютеру),
В результате получаем, что записанный в скрипте алгоритм толком непонятен никому. Ни заказчику, поскольку абсолютно не нагляден, ни программисту, поскольку всё равно требует раскрытия каждого действия в боксе, ни компьютеру, поскольку нет никаких средств автоматического перевода из скрипта в бокс.
В общем как обычно. Универсальная система, умеющая делать всё, делает всё хуже, чем несколько специализированных.

Кто бы мог подумать, что обсуждение статьи на хабре может стать для меня таким нужным и полезным. У меня это первый опыт и я в восторге.
Все по полочкам удалось разложить. Я отдельную лекцию в середине курса по VAOP посвящу детальному разбору заблуждений и тех полезностей, которые из этого можно и надо извлекать. Дам студентам все это прочитать, а потом обсудим еще раз. Короче, Всем огромное Спасибо.


Вот, например, Вы пишите:


В общем как обычно. Универсальная система, умеющая делать всё, делает всё хуже, чем несколько специализированных.

Я, не знаю как Вас благодарить! УНИВЕРСАЛЬНАЯ! Как я сразу до этого не допёр! Вы мне подсказали. VAOP, действительно, можно прикрутить в любом месте, что я и делал всегда там, где без VAOP все выходило безнадежно запутано.

Я, не знаю как Вас благодарить! УНИВЕРСАЛЬНАЯ! Как я сразу до этого не допёр! Вы мне подсказали.

Удивительно. Просто удивительно. Насколько вам пишут одно, а вы читаете совсем другое.

Мне тоже удивительно. Говорю про то, что уже успешно применяется и работает, а Вы доказываете, что это неудобно, не полнятно и не нужно.
Все последние эффектные реализации, сделаны когда я работал в Канаде и Штатах, начиная с 2005 года, а там народ, который со мной их делал не понимает по-русски.
Представляю как бы они повеселились, читая нашу переписку…
Хотя, нет, когда в 2009 для голландцев тендер выиграли, была команда из русскоговорящих канадцев. Надо им линк послать. Пусть повеселятся ))

Говорю про то, что уже успешно применяется и работает, а Вы доказываете, что это неудобно, не полнятно и не нужно.

Потому что оно неудобно, непонятно и не нужно присутствующим. А вот почему те, кто это применили, с этим работают — это им виднее.

Следующие статьи будут посвящены детальным разборам конкретных реализаций с применением VAOP. Я расскажу про реализацию Top trading cycle (TTC). Это совсем свежий пример и коды у меня есть.
Потом расскажу какие чудеса в веб-разроботках можно сотворить на ровном месте благодаря универсальности (спасибо Rsa97) VAOP.

Потом расскажу какие чудеса в веб-разроботках можно сотворить на ровном месте благодаря универсальности (спасибо Rsa97) VAOP.

Мне, знаете ли, не сложно повторить вопрос.


Раз уж вы дали ссылку, вот это вот написано с применением VAOP или нет?

Да. Это простенький пример для моего онлайн курса.
Там показано как между страницами переходить.
А это же без VAOP [жми здесь]
Во время занятий показываю все преимущества VAOP

Так вот, если это — пример ваших "чудес в веб-разработке", то не надо нам таких чудес.


Exhibit A
#s_000_v__init_state
    if state_next == 's_000_v__init_state':
        return render_template('/s_000_v__init_state.html', title='s_000_v__init_state')

#s_010_v__promt_need_instruction
    if state_next == 's_010_v__promt_need_instruction':
        return render_template('/s_010_v__promt_need_instruction.html', title='s_010_v__promt_need_instruction')

#s_030_v__instruction
    if state_next == 's_030_v__instruction':
        return render_template('/s_030_v__instruction.html', title='Instrs_030_v__instructionuction')

#s_040_v__agreement
    if state_next == 's_040_v__agreement':
        return render_template('/s_040_v__agreement.html', title='s_040_v__agreement')

Exhibit B
if 'answer_code' in request.form :
  answer_code = request.form['answer_code']
  sql = dbclasses.SQLighter()
  query = "INSERT INTO `answer_01` (`ANSW_QUESTION_CODE`, `ANSW_ANSWER_CODE`) VALUES ('" + question_code + "', '" + answer_code + "')"
  sql.insert(query)

А это же без VAOP жми здесь

А это — плохо написанный, но все равно более понятный код. Но плохо написанный, не надо так.


Это, на самом деле, прекрасная иллюстрация фундаментальной проблемы ваших примеров: вы всегда сравниваете с плохим кодом. А как только вас просят сравнить с хорошим или хотя бы приличным, вы уходите от ответа.


Во время занятий показываю все преимущества VAOP

Я не вижу там никаких преимуществ. Поясните?

Это, на самом деле, прекрасная иллюстрация фундаментальной проблемы ваших примеров: вы всегда сравниваете с плохим кодом. А как только вас просят сравнить с хорошим или хотя бы приличным, вы уходите от ответа.

Спасибо. Учту на будущее )


Я не вижу там никаких преимуществ. Поясните?

Все преимущества которые дает VAOP написаны в начале статьи — Идеологически v-agent ориентированное программирование — добивается того, чтобы алгоритм был записан в одном месте в виде, понятном всем — заказчикам, програмистам и исполняюшей среде (компьютеру), что улучшает процесс взаимодействия всех при создания программного продукта и, что особенно важно, существенно снижает затраты на этапе поддержания работы и адаптации к изменению внешних условий в Будущем.


Со студентами начинаем менять алгоритм. Например, потребовалось ввести дополнительную страницу с вопросом "Вы старше 18 лет" или что-то в этом духе и зависимости от ответа что-то там еще сделать.
Проводим изменения в двух реализациях и всем сразу понятно, что с VAOP это намного легче.


В реале же все сложнее чем в этом примере. Там еще внутри много внутренних (без экрана) действий со сложной логикой, зависящей от ответов на запросы third party (не говорил это никогда по-русски) конторам.
Садишься с заказчиком. Все это обговариваешь в VA script и вперед — кодить. Если что-то в бизнес логике поменялось. Старая у нас в VA script.
Смотрим меняем и так далее… Все всегда были в восторге! Очень просто и удобно.
Мы так тендер для голландцев выиграли. Они за день до конкурса условия поменяли, а мы за ночь без проблем внесли изменения. И все благодаря VAOP. Да и потом, когда уже над проектом работами они там постоянно бизнес логику меняли. Потом ребята еще лет пять систему поддерживали без особых проблем.
Задача для голландской kpn.com была — принять онлайн заказ на установку дома телефона, интернета и прочего. Точно, помню, начали они с запросов к одной third party конторе и при мне дошли до пяти

Все преимущества которые дает VAOP написаны в начале статьи — Идеологически v-agent ориентированное программирование — добивается того, чтобы алгоритм был записан в одном месте

Но это же не так. В этом примере прекрасно видно, что алгоритм записан не в одном месте.


Например, потребовалось ввести дополнительную страницу с вопросом "Вы старше 18 лет" или что-то в этом духе и зависимости от ответа что-то там еще сделать.

… и в скольких местах надо внести изменения для этого?


Старая у нас в VA script.

Прямо вот в вашем примере видно, что бизнес-логика — не (только) в VA script. Потому что вот она:


question_all = 0
question_with_correct_answer = 0
for question_code in hrq_data:
  if question_code != 'Q_00':
    question_all += 1
    row = sql.getByQuestionCode(question_code)
    answer_code = row[2]
    if hrq_data[question_code]['answers'][answer_code]['is_right'] == 'true':
      question_with_correct_answer += 1

percentage_of_correct_answers = (question_with_correct_answer/question_all)*100

Это — бизнес-логика. И это не VA script.


Точно, помню, начали они с запросов к одной third party конторе и при мне дошли до пяти

Подождите, это какая-то проблема, что ли? У меня в "одном проекте" используется с десяток внешних сервисов, и… что? Оно еще и асинхронное, для вящего счастья.

Прямо вот в вашем примере видно, что бизнес-логика — не (только) в VA script. Потому что вот она

Что-то Вы уже передергиваете. Иссякли? Предлагаю ничью )
Вся или не вся на 100%.
В реализации отдельных действий (состояний) там свой алгоритм и своя логика и часто там свой VAOP делают.


… и в скольких местах надо внести изменения для этого?

Алгоритм меняется в VA script, а, вообще, понятно, что саму страницу добавить надо. Как без нее )


Подождите, это какая-то проблема, что ли? У меня в "одном проекте" используется с десяток внешних сервисов, и… что? Оно еще и асинхронное, для вящего счастья.

Ну это уже вообще не туда. Мы же о разных реализациях говорим. Моя 11 лет назад с KPN была. Хотя если я посмотрю, то может и у Вас найдется где VAOP прикрутить )
Хотя я был свидетелем случаем, любителей мазахизма в параллельных проектах. Закрутят все и гордые такие сидят. Я говорю с VAOP упростим, а они нет — мы крутые и так осилим, хотя, как я потом понял им это выгодно, чтобы не уволили. Ведь только они могут разобраться что нагородили )
Вот этот фактор не последний в сдерживании VAOP (

Что-то Вы уже передергиваете.

Почему передергиваю? Это не бизнес-логика? Или это VA script?


В реализации отдельных действий (состояний) там свой алгоритм и своя логика и часто там свой VAOP делают.

Но в вашем примере этого нет. Я сужу по примеру.


Алгоритм меняется в VA script, а, вообще, понятно, что саму страницу добавить надо.

И все? Больше ничего делать не надо?


Ну это уже вообще не туда.

Я просто не понимаю, к чему вы поминаете third-party integrations. Я их десять лет прикручиваю в разные места, и как-то ни разу не видел, чтобы было нужно то, что вы предлагете в посте выше. Оркестраторы понимаю. ESB понимаю. А это — нет.


Хотя если я посмотрю, то может и у Вас найдется где VAOP прикрутить

Вы умудрились найти, где прикрутить VAOP в однострочном суммировании. Вопрос не в том, где прикрутить, а в том, где от этого будет польза.

Например, потребовалось ввести дополнительную страницу с вопросом "Вы старше 18 лет" или что-то в этом духе и зависимости от ответа что-то там еще сделать.

Да, вот давайте посмотрим на этот вопрос.


Предположим, если ответили "нет", надо показать опросник, провалидировать его, и сохранить результаты, а если ответили "да" — надо показать опросник, провалидировать его, сохранить результаты, потом предложить поучаствовать в розыгрыше.


Что и где придется поменять, чтобы это случилось?

Что и где придется поменять, чтобы это случилось?

Давайте, лучше моею третью статью подождем. Я там все про VAOP в веб-разработках расскажу и примеры приведу и все такое. Я же курс для школников пишу и сюда частично выложу Вам на "растерзание"
Ну а если срочно надо, то у меня мастер класс для русскоговорящих по Воскресеньям в 10 по торонтовскому времени [записаться]
В гугл-митинг расшерю экран и в www.pythonanywhere.com посмотрим как все работает и как делать изменения. Поверьте, не Вы первый этим интересуетесь. Интерес к VAOP растет.
Приглашаю всех желающих на часик в Торонто )

Давайте, лучше моею третью статью подождем.

Вы пока даже вторую не написали. Думаю, что третьей мы просто не дождемся.


В гугл-митинг расшерю экран и в www.pythonanywhere.com посмотрим как все работает и как делать изменения.

Ммм, вы же не большой знаток питона, какой смысл что-то на нем показывать?

Это Вы уже не по делу пишите, а у меня анекдот в тему:
Верблюда спрашивают, почти как Вы меня:
— Почему у тебя спина кривая?
— А, скажите, что у меня ровное?


Вот так и живем )

Это вы намекаете, что вы никакой язык программирования не знаете нормально?

Например, потребовалось ввести дополнительную страницу с вопросом «Вы старше 18 лет» или что-то в этом духе и зависимости от ответа что-то там еще сделать.
Проводим изменения в двух реализациях и всем сразу понятно, что с VAOP это намного легче.
При правильно выбранной архитектуре безо всякой VAOP данное изменение будет вноситься только в сценарий опроса. Код останется без каких-либо изменений.
Причём внести изменение в сценарий сможет сам заказчик, не обращаясь к разработчику и не изучая питон, поскольку сам по себе такой вопрос ничем не отличается от уже имеющихся.
Вы изначально выбрали неудачное архитектурное решение для своей задачи и теперь пытаетесь прицепить к нему VAOP вместо того, чтобы полностью его переработать.
Вы изначально выбрали неудачное архитектурное решение для своей задачи и теперь пытаетесь прицепить к нему VAOP вместо того, чтобы полностью его переработать.

Задачка очень примитивная, и все возможности ООП, не показать на простом примере. Но в задаче показаны основны подхода.
Попробуйте мысленно расширить мой "вопросник", пример для студентов eco-programming-webfsm01 до реальной задачи на три десятка экранов (видимых действий) и сложной зависимостью алгоритма от ответов пользователя и результатов оборащения к third party (не видимых действий еще с десяток или больше). Такого много надо кодить для всяких контор и правительственных сайтов, когда мы онлайн аппликации заполняем. И чтобы четко было ясен и записан алгоритм, чтобы новый программер и заказчик внесли изменения так, чтобы вся система не легла )
Да, а это пример того же опросника, по без VAOP eco-programming-web-without-fsm
Можно, просто начинать мысленно раздувать оба подхода и посмотреть, что из этого получится. Можно вместе. Приходите на мой мастер класс. Там все и обсудим.


Предложите Ваш подход. Начальные условия можно обсудить А то уже четверий день ругаете мой подход ) Думаю, всем будет интересно, как Вы сделаете, чтобы был записан где-то алгоритм, который бы заказчик мог обсудить с НОВЫМ программистом, чтобы новый программер и заказчик внесли изменения так, чтобы вся система не легла ) Я Вам уже четвертый день отвечаю, что у меня это работает в РЕАЛЬНЫХ ПРОЕКТАХ, а Вы, просто, на словах говорите, что это ерунда, какая-то. Научите как это делается на самом деле. Я открыт к диалогу.


Я совершенно не зациклился на VAOP, просто покажите мне архитектурное решение, удовлетворяющее идеологии VAOP и все встанет на свои места.
Просто не удобно получается, за Вас не удобно перед Всеми читателями этого поста. Я говорю у меня работает, а Вы говорите, что можно лучше и проще, но как это сделать не говорите.


Или вот эту задачу покажите как без VAOP можно сделать:


Два года назад я воспользовался VAOP для решения задачи типа TTC [Top trading cycle]
У меня версии с и без VAOP есть. Я VA script для TTC в комментах показывал. Можете попробовать. Хотя проверка будет не корректной потому, что сделать может Вы и сделаете и изменения заказчика в алгоритм быстра внесете (я в этом очень сомневаюсь), но потом надо проверить как без Вас кто-то другой разберется и внесет изменения. Это ведь одна из основных плюшек VAOP. С VAOP это гараздо легче, хотя, Вы правильно хотите и в этом сами убедиться ) или меня переубедить, что и без VAOP другой программист быстро поймет как работаем Ваш код )
Все почему-то забывают про поддержание продукта и уменьшение затрат на его модернизацию.


Вот и всем будет понятно — нужна VAOP или нет. Пора кончать болтавню, а показывать на что Вы способны )

Попробуйте мысленно расширить мой «вопросник», пример для студентов eco-programming-webfsm01 до реальной задачи на три десятка экранов (видимых действий) и сложной зависимостью алгоритма от ответов пользователя и результатов оборащения к third party (не видимых действий еще с десяток или больше).
Расширил. Ничего принципиально не изменилось. Пишем интерпретатор сценариев, который обрабатывает все эти вопросы, экраны, ставит и проверяет флаги, выполняет обращения к сторонним сервисам (лучше через плагины). Пишем сценарии, дополняя при необходимости интерпретатор. После нескольких сценариев 99.9% случаев будут уже в интерпретаторе и вероятность вмешательства в его код станет минимальной.
А ваш подход, когда прямо в коде делаются какие-то исключения по номеру вопроса — это тупиковый путь. Он требует переписывания кода при каждом существенном изменении в тесте.
При этом сценарий — это, в принципе, любимый вами конечный автомат, только в несколько расширенной форме. А вот в самом коде приложения никакой VAOP не нужен.
Попробуйте мысленно расширить мой "вопросник", пример для студентов eco-programming-webfsm01 до реальной задачи на три десятка экранов (видимых действий) и сложной зависимостью алгоритма от ответов пользователя и результатов оборащения к third party (не видимых действий еще с десяток или больше).

Просто берем ASP.NET Core или любой другой веб-фреймворк и делаем строго по камушкам, прямо по туториалу. Будет работать из коробки как надо.


Такого много надо кодить для всяких контор и правительственных сайтов, когда мы онлайн аппликации заполняем.

Самое сложное в "онлайн-аппликациях" — не "алгоритм", а данные. В том смысле, что надо умудриться сохранить состояние между всеми переходами. И с этим ваша VAOP вообще никак помогает, потому что данными она не оперирует.


А так-то — решение тривиально и лежит на поверхности:


class Screen
{
  string Id {get;}
  string DisplayName {get;}
  bool IsAvailable {get;}
  bool IsValid {get;}
}

class ScreenData
{
  Screen Screen {get;}
  object Model {get;}
  ModelState ModelState {get;}
}

interface IApplication
{
  IEnumerable<Screen> GetAvailableScreens(ScreenData current);
  (Screen prev, Screen next) GetNavigation(ScreenData current);
  ScreenData Apply(ScreenData current);
}

Вся бизнес-логика — внутри реализации IApplication. Весь UI сделан на метаданных от модели (ASP.NET Core MVC это уже прекрасно умеет).


И чтобы четко было ясен и записан алгоритм, чтобы новый программер и заказчик внесли изменения так, чтобы вся система не легла

А требования записываются в документ, который так и называется "требования к системе". Четко, ясно и понятно всем участникам процесса.


И… все. Простое типовое решение.

А, забыл один метод:


interface IApplication
{
  //...
  ScreenData Get(Screen screen);
}
И… все. Простое типовое решение.

Для .NET может и покатит но он не у всех, и как-то вот это не очень убедительно


А требования записываются в документ, который так и называется "требования к системе". Четко, ясно и понятно всем участникам процесса.

Не будем сказки рассказывать. Студенты мои читают. Знаю как там пишут и дополняют при изменениях. Выходит, что основное требование VAOP не выполняется.
В реале, в небольших конторах, вообще, никаних требований к системе не найдешь через пару лет, а разбираться надо. При VAOP таких проблем по определению быть не может так как вся бизнес или другая логика в VA script.
Да, и еще, как я говорю студентам — не надо вертолет вызывать и продолжим мысленно то, что нам дано в задании eco-programming-web-without-fsm

Для .NET может и покатит но он не у всех

Питон тоже не у всех. Для всех нужных в продакшне языков есть веб-фреймворки, на всех из которых это можно реализовать схожими способами.


Выходит, что основное требование VAOP не выполняется.

"Основное требование VAOP" не выполняется самим VAOP. Я же у вас уже спрашивал — чем гарантируется согласованность VA Script и VA Box?


При VAOP таких проблем по определению быть не может так как вся бизнес или другая логика в VA script.

Это утверждение, как уже неоднократно говорилось, неверно. Что мешает написать в VA Script одно условие, а в VA Box — другое?


Ну и да (и про это уже тоже говорилось), VA Script описывает только алгоритм (причем не весь, а только часть), но не описывает данные и другие занимательные вещи, которые не менее важны для разработки.


Да, и еще, как я говорю студентам — не надо вертолет вызывать и продолжим мысленно то, что нам дано в задании eco-programming-web-without-fsm

А зачем мысленно продолжать чужой плохой код, когда можно написать хороший?

Самое сложное в "онлайн-аппликациях" — не "алгоритм", а данные. В том смысле, что надо умудриться сохранить состояние между всеми переходами. И с этим ваша VAOP вообще никак помогает, потому что данными она не оперирует.

это я так сходу не могу ответить. Слишком много от среды зависит

Я про это и говорю: вы взяли и прогнорировали часть системы, которая не менее (а может быть и более) важна, нежели алгоритм.

Про алгоритмы все уже написано выше.

Важно или не важно. Не уходите от темы.
Тема: Алгоритм)

Если взять среднестатического заказчика и его требования, то он скорее будет хотеть не алгоритмы (которые он мало понимает), а возможность взаимодействия с сущностями системы (банальный crud), обвешанные инвариантами и разграничениями по правам доступа. Т.е. тут важнее данные и их взаимосвязи с представлением, а алгоритмов почти и нет. Если же заказчик прошаренный и понимает сложные алгоритмы, не проще ли ему сразу в нормальный код смотреть? Про документацию тоже момент — есть же понятие самодокументирующегося кода — если писать правильным структурированным кодом и выделять время на плановый рефакторинг, то поддержка и развитие кода не есть невыполнимая задача. Тут скорее нужно подходить со стороны процессов в организации: есть ли код-ревью, есть ли защита архитектуры/техревью, внедрение правильных практик программирования, есть ли человек, ответственный за транслирование запросов заказчика в команду разработчиков, выделяется ли время на рефакторинг. У FSM есть свои применения, но фанатично их везде вставлять это фанатизм. Вообще, таких идей-фикс много бывает разных, например, Егор Бугаенко зациклился на идее "всё есть объект", тоже доказывает уникальность и silver-bullet-ность идеи :)

Вы изначально выбрали неудачное архитектурное решение для своей задачи и теперь пытаетесь прицепить к нему VAOP вместо того, чтобы полностью его переработать.

Вот еще третья задача для проверки нужна VAOP или нет )
У меня это задача с VAOP сделана. И лекция подготовлена где все расписано по шагам.


Условие задачи (писать на Питоне).
Пользователь вводит реальное число и программа должна выделить целую и дробную части числа


-25.8 => 25 и 8
34 => 34 и 0
.312 => 0 и 315


пользовать reg нельзя
Вы можете просматривать введенную строку последовательно по одному символу слева направо, как бы имитирую анализ потока.


Не забудьте про то, что заказчик будет просить внести изменения. Не Вас, а нового программера — пробелы разрешить в начале строки, например, ну и все в этом духе.


Я так понял, Вам VAOP не нужен?
Тогда, удачи )
Попробуйте сделать ее без всемогущего VAOP )

И что тут сложного? Примитивный линейный парсер. Заняло 5 минут обдумывания, 15 минут написания кода и 1 минуту отладки.
<?php
function isSpace(string $char) : bool
{
    return $char === ' ' || $char === "\t";
}

function isDigit(string $char) : bool
{
    return $char >= '0' && $char <= '9';
}

function isSign(string $char) : bool
{
    return $char === '-' || $char === '+';
}

function isPoint(string $char) : bool
{
    return $char === '.' || $char === ',';
}

function digitValue(string $char) : int
{
    return ord($char) - ord('0');
}

function parseNumber(string $str) : array
{
    $pos = 0;
    $int = 0;
    $frac = 0;
    $sign = 1;
    $value = 0;
    $div = 1;
    $len = strlen($str);
    // Пропускаем пробелы в начале строки
    while ($pos < $len && isSpace($str[$pos])) {
        $pos += 1;
    }
    // Проверяем наличие знака
    if ($pos < $len && isSign($str[$pos])) {
        $sign = $str[$pos] === '+' ? 1 : -1;
        $pos += 1;
    }
    // Парсим целую часть
    while ($pos < $len && isDigit($str[$pos])) {
        $int = $int * 10 + digitValue($str[$pos]);
        $pos += 1;
    }
    // Проверяем наличие дробной части и парсим её
    if ($pos < $len && isPoint($str[$pos])) {
        $pos += 1;
        while ($pos < $len && isDigit($str[$pos])) {
            $frac = $frac * 10 + digitValue($str[$pos]);
            $div *= 10;
            $pos++;
        }
    }
    $value = ($int + $frac / $div) * $sign;
    return [
        'sign' => $sign,
        'int' => $int,
        'frac' => $frac,
        'value' => $value
    ];
}
$tests = ['-25.8', '34', '.312', '  +2,315'];
foreach ($tests as $test) {
    print "'{$test}' => ";
    $result = parseNumber($test);
    print "знак: {$result['sign']}, целая часть: {$result['int']}, дробная часть: {$result['frac']}, значение: {$result['value']}\n";
}
// '-25.8' => знак: -1, целая часть: 25, дробная часть: 8, значение: -25.8
// '34' => знак: 1, целая часть: 34, дробная часть: 0, значение: 34
// '.312' => знак: 1, целая часть: 0, дробная часть: 312, значение: 0.312
// '  +2,315' => знак: 1, целая часть: 2, дробная часть: 315, значение: 2.315

Песочница
Можно и на конечном автомате накидать, но особого смысла не вижу, поскольку состояния здесь меняются линейно.

Спасибо, что откликнулись не мое предложение показать мне как без VAOP можно без проблем закодировать задачи, которые я делал в VAOP и учу этой ерунде моих студентов и скоро буду и школьникам вталкивать этот бред)
С этой задачей все понятно. Я ее даю студентам и они делают так же как и Вы. Потом я начинаю проверять их код. Ввожу две точки подряд или пробел в целой или дробной части. Это не работает. Создается проблемная ситуация потому, что они начинают менять код и совсем у них все запутывается.
Как в Вашем случае (это моя вина. Я не уточнил задание)
'-2 5..8' => знак: -1, целая часть: 2, дробная часть: 0, значение: -2
'+.' => знак: 1, целая часть: 0, дробная часть: 0, значение: 0
'.312' => знак: 1, целая часть: 0, дробная часть: 312, значение: 0.312
' +2, 315' => знак: 1, целая часть: 2, дробная часть: 0, значение: 2


Короче, создается проблемная ситуация и Вы, как профессионал, правильно предложили выход из неё.


Можно и на конечном автомате накидать, но особого смысла не вижу, поскольку состояния здесь меняются линейно.

Я начинаю студентам показывать как привязать VAOP к этой задаче или как Вы правильно написали — "Можно и на конечном автомате накидать"


В итоге мы получаем VA script


# V_10 => <Sign> , 
# V_20 => <digit> , 
# V_30 => <Separator> , 
# V_40 => Carriage return (CR), 
# V_50 => <Unknown> it means something different from V_10 ... V_40

fsm_matrix = {
    "s_00":{
        "comment":"initial state",
        "v_10":"s_10",
        "v_20":"s_20",
        "v_30":"s_30",
        "v_40":"Err_10",
        "v_50":"Err_20",
   },    
    "s_10":{
        "comment":"state of sign",
        "v_10":"Err_30",
        "v_20":"s_20",
        "v_30":"s_30",
        "v_40":"Err_40",
        "v_50":"Err_20",
   },    
    "s_20":{
        "comment":"state of integer part",
        "v_10":"Err_50",
        "v_20":"s_20",
        "v_30":"s_30",
        "v_40":"END",
        "v_50":"Err_20",
   },    
    "s_30":{
        "comment":"state of separator",
        "v_10":"Err_60",
        "v_20":"s_40",
        "v_30":"Err_70", 
        #"v_30":"s_30",
        "v_40":"END",
        "v_50":"Err_20",
    },    
    "s_40":{
        "comment":"state of decimal part",
        "v_10":"Err_80",
        "v_20":"s_40",
        "v_30":"Err_90",
        "v_40":"END",
        "v_50":"Err_20",
   }    
}

** видите там в "state of separator", если остаться в состоянии "state of separator" #"v_30":"s_30", то можно сколько угодно точек вводит и ошибки не будет.


Вот так показываю студентам как в VA script задается весь алгоритм


VA box на Питоне:


# input block
real_number = input("\nInput real_number? ")

# define event code
i = 0
while i < len(real_number) + 1:
    event = "v_50"

    if i < len(real_number):
        if real_number[i] in ["+","-"]:
            event = "v_10"

        if real_number[i] in ["0","1","2","3","4","5","6","7","8","9"]:
            event = "v_20"

        if real_number[i] in ["."]:
            event = "v_30"
    if i == len(real_number):
        event = "v_40"

    # define new state
    state = fsm_matrix[current_state][event]
    previous_state = current_state
    current_state = state

    if i < len(real_number):
        print("\ni:[" + str(i) +"] | event:[" + event + "] | real_number[i]:[" + real_number[i] + "] | previous_state:[" + previous_state + "] | current_state:[" + current_state + "] ")

    if current_state in fsm_matrix:
        if current_state == "s_20":
            integer_part += real_number[i]
        if current_state == "s_40":
            decimal_part += real_number[i]
        i += 1
        continue
    break

if current_state.find("END") != 0:
       print("\n\n\nError code:[" + current_state +"]\n\n")

if current_state.find("END") == 0: 
    print("\n\ninteger_part:[" + integer_part +"] and decimal_part:[" + decimal_part + "]\n")

Получается, что без VAOP толком не получается )


Я тут посмотрел в VA script и у меня, в отличии от Вашего кода пустая строка — ошибка с кодом Err_10 потому, что сразу пришел конец строки # V_40 => Carriage return (CR),


"s_00":{
        "comment":"initial state",
        "v_10":"s_10",
        "v_20":"s_20",
        "v_30":"s_30",
        "v_40":"Err_10",   
        "v_50":"Err_20",
},

Нам все VA script говорит — какое число мы разложим на целое и дробное, а какое нет. Пробелов нельзя внутри числа, например.


'+.' => знак: 1, целая часть: 0, дробная часть: 0, значение: 0 мой VA script также обработает


Ладно, что-то я увлекся. Еще со студентами и школьниками наиграюсь.
Один, кстати предложил, что ведь очень просто менять VA script в зависимость от времени. Да обеда один юзать, а после другой, например.
Я ему говорю, что я при веб-программировании это раз применял. Очень эффектно получалось, но мы об это поговорим, когда будем VAOP применительно к веб-программированию изучать. Вот такие студенты сообразительные бывают. Не поймешь, кто кого учит ))

Ввожу две точки подряд или пробел в целой или дробной части. Это не работает.
Это и не должно работать, поскольку не было в условиях задачи.
У вас сейчас как в том анекдоте «Стоите вы в числом поле, ни кустика, ни деревца и вдруг из-за угла выезжает танк!».
Задача звучала как?
Пользователь вводит реальное число ...
Если задачу поставить как «Пользователь вводит произвольный набор символов и надо попробовать распарсить его как вещественное число, выдав ошибку, если число введено неверно.», то и решение будет несколько другим. Но все равно в нём легко можно обойтись без конечного автомата.
Но все равно в нём легко можно обойтись без конечного автомата.

Кто спорит ) И воробья в поле можно насмерть загонять ))

Вот это, кстати, прекрасный пример того, что VAOP не следует своей идеологии.


Открываем первую ноду VA Script:


"s_00":{
        "comment":"initial state",
        "v_10":"s_10",
        "v_20":"s_20",
        "v_30":"s_30",
        "v_40":"Err_10",
        "v_50":"Err_20",
   }

Во-первых, это непонятно. Есть только цифирки вида v_10 -> s_10, которые никак не объясняют, что на самом деле, если мы встретили знак, мы переходим в состояние "знак". Так что обещание "будет всем понятно" не выполнено — я, читая этот алгоритм, не знаю, какие условия должны/будут выполняться для переходов.


Во-вторых, нет гарантии консистентности. Допустим, мы запомнили, что v_10 — это знак. Что мешает программисту написать


if real_number[i] in ["+","-"]:
  event = "v_20"

Следовательно, нет никакой гарантии согласованности описанных в VA Script и VA Box действий. Что, в свою очередь, означает, что обещание "в одном месте" не выполняется.

Вот это, кстати, прекрасный пример того, что VAOP не следует своей идеологии.

Первае замечание:


Во-первых, это непонятно. Есть только цифирки вида v_10 -> s_10, которые никак не объясняют, что на самом деле, если мы встретили знак, мы переходим в состояние "знак".

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


Второе замечание не очень мне понятно. Автор делает вывод, что из-за того, что нет ГАРАНТИЙ согласованности (т.е согласованность есть, вот гарантий нет) в VA script и VA box. На основании чего автор пишет:


Что, в свою очередь, означает, что обещание "в одном месте" не выполняется.

В VAOP алгоритм в одном месте в VA script в этом главная его фишка со всеми плюсами, получаемыми от этого, и все по нему работают и его понимают. Действия, соответствующие каждому VA node, кодируются в VA box и задача программиста правильно их закодировать и "согласовать" с VA script при отладке.
Автор хочет, чтобы все было в "в одном месте", но не пойму, что и в каком?
Может автор покажет как он это себе представляет?


У меня и так все нормально работает согласно заявленному в начале статьи:


v-agent ориентированное программирование (VAOP) — это методология программирования, основанная на представлении алгоритма в виде v-agent script, который позволяет программному агенту, получившему название v-agent, выполнять операции закодированные в модулях v-agent box.

Идеологически v-agent ориентированное программирование — добивается того, чтобы алгоритм был записан в одном месте в виде, понятном всем — заказчикам, програмистам и исполняюшей среде (компьютеру), что улучшает процесс взаимодействия всех при создания программного продукта и, что особенно важно, существенно снижает затраты на этапе поддержания работы и адаптации к изменению внешних условий в Будущем.

Похоже, что автор за шесть дней нвших разговоров так этого ВНИМАТЕЛЬНО и не прочитал )

Это взято из примеров в лекции и там я все это рассказываю.

Если надо рассказывать, значит, запись недостаточна. А если вы в примерах на лекции пишете плохую запись, значит, это плохая лекция. Я это серьезно говорю, как человек с опытом преподавания.


Я уже приводил примеры реальных VA script в комментах к этой статье и все их видели

… и эти "все" написали вам, что запись нечитаема. Игнорирование подобных комментариев не красит автора, да.


В VAOP алгоритм в одном месте

Нет. В одном месте часть алгоритма.


Понимаете ли, вот это вот:


if current_state == "s_20":
  integer_part += real_number[i]
if current_state == "s_40":
  decimal_part += real_number[i]

это неотъемлимая часть алгоритма парсинга. Но этого нет в VA script (и не может там быть в виде, понятном компьютеру).


задача программиста правильно их закодировать и "согласовать" с VA script при отладке.

В таком случае, аналогично, задача программиста правильно закодировать код и согласовать его с требованиями. Поэтому ваше замечание выше, что требования не обновляются, теряет смысл.


Автор хочет, чтобы все было в "в одном месте", но не пойму, что и в каком?

В коде, конечно же.


Может автор покажет как он это себе представляет?

Уже показывал, могу повторить, мне не сложно:


Machine<Steps>
.When(Steps.Action10, () => {
  sum += M[i];
  return Steps.Action20;
})
.When(Steps.Action20, () => {
  i++;
  if (i < M.Length)
    return Steps.Action10;
  else
    return null;
})
.Run(Steps.Action10);

Или вот так:


Parser<(int left, int right)> parser =
    from sign in Parse.Char('-').Optional()
    from left in Parse.Number.Optional()
    from separator in Parse.Char('.').Optional()
    from right in Parse.Number.Optional()
    select (
      string.IsNullOrEmpty(left) ? 0 : int.Parse(left),
      string.IsNullOrEmpty(right) ? 0 : int.Parse(right)
    );

return parser.Parse(input);

У меня и так все нормально работает

То, что у вас все работает, мы уже давно поняли. Вот только у других не работает.

Я когда смотрю на все эти "v_10":"s_10, совершенно ничего не понимаю. И я не один такой здесь. Выглядит как запутанный write only код. Код (в идеале!) должен читаться сверху вниз как книга, тут же вообще не пойми что. Может быть, ваши студенты (часто упоминаете) и работали как-то с этим — но вы же их преподаватель, и у них как бы нет выбора? С горем пополам разобраться можно, но это не стоит затраченных усилий.

Выглядит как запутанный write only код.
Так именно поэтому конечные автоматы руками обычно и не пишутся. Пишется регулярная грамматика или рисуется автомат в виде графа, а потом программа генерирует таблицу и код автомата.
Например, этот КА соответствует грамматике
sign   := [+-]
digit  := [0123456789]
point  := [.]
float  := {digit}+
        | {digit}+{point}{digit}*
        | {point}{digit}+
signed_float := {sign}?{float}

Вот именно поэтому я и беру Sprache, который генерит мне работающий парсер по человекочитаемому коду.


Но это не "тру VAOP", конеееечно.

Перед тем как VA script писать мы тоже часто граф на бумаге с заказчиком нарисуем. С графом, нагляднее, но в программировании говорят, что на безрыбье сам раком станешь )

Я когда смотрю на все эти "v_10":"s_10, совершенно ничего не понимаю. И я не один такой здесь. Выглядит как запутанный write only код.

А я как удивляюсь и те кто использует VAOP как удивляются, что никто на Хабре не понимает )


При сложных алгоритмах и при парсинге этот подход очень помогает, а часто бывает единственным.
Попробуйте решить задачу о разделении реального числа на части целую и дробную и сами в этом убедитесь. Уверяю Вас все мои студенты через это непонимание прошли )

При сложных алгоритмах и при парсинге этот подход очень помогает, а часто бывает единственным.
Ок, немножко усложним задачу. Пользователь вводит арифметическое выражение, требуется вычислить результат. Для простоты оставим только однозначные числа (0 — 9). Допускается унарный минус, сложение, вычитание, умножение, деление, скобки.
Грамматика
<выражение> := <выражение> + <слагаемое>
             | <выражение> - <слагаемое>
             | <слагаемое>
<слагаемое> := <слагаемое> * <множитель> 
             | <слагаемое> / <множитель> 
             | <множитель>
<множитель> := <примитив>
             | - <примитив>
<примитив>  := <цифра>
             | ( <выражение> )
Сможете построить свой любимый конечный автомат?
Спойлер
Не сможете. Это контекстно-свободная грамматика. Она не описывается конечным автоматом, так как имеет потенциально бесконечное количество состояний. Для её описания нужен магазинный (стековый) автомат.
Сможете построить свой любимый конечный автомат?

Кажется уже пора понять, что по реализации VAOP конечный автомат. Каждой грамматике, по теории, соотвествует свой автомат. Построю, но зачеи Вам это.
Меня VAOP как методология больше волнует, а она решает более широкий круг проблем связанных с жизнью ПО, что, к сожалению, здесь так никто и не понял (

Каждой грамматике, по теории, соотвествует свой автомат.
Но не каждой грамматике соответствует конечный автомат.

Я о регулярной конечно, за 40 лет уже забыл какая она там по типу по иерархии Хомского )
Нет, сдаюсь, уже ничего об этом их лекций не помню )

она решает более широкий круг проблем связанных с жизнью ПО

Это какой же?

Это какой же?

Мы уже шестой день по кругу ходим. Один мой бывший студент, спасибо ему, хорошо мне сегодня все объяснил:


  • Вы говорите про, то как чернильницей пользоваться и карандаши учите их точить, а у них у Всех давно шариковые ручки и карандаши они не видели даже. Я, говорит, тоже смотрел на всё это как и они. Попадут в условия, где только карандашами пишут, как я попал пару раз, и еще вспомнят про Вас. Не обижайтесь на них. Они, действительно не понимают Вас… и все равно Вы уже их чему-то научили ...

Хороший парень в Калифорнии сейчас ...

Мы уже шестой день по кругу ходим.

Видимо, так объясняете.


Впрочем, если уходить от ответов на вопросы и игнорировать приводимые примеры — так и будем дальше ходить, чего тут удивительного-то.

Впрочем, если уходить от ответов на вопросы и игнорировать приводимые примеры — так и будем дальше ходить, чего тут удивительного-то.

Ухожу от ответов? Вам виднее. Главное, что совсем не ухожу ) Мне с Вами интересно ...

Вот только все показанные вами примеры — это попытки заточить перочинным ножом шариковую ручку, чтобы обмакнуть её в чернильницу.
Вот только все показанные вами примеры — это попытки заточить перочинным ножом шариковую ручку, чтобы обмакнуть её в чернильницу.

Согласен с Вами полностью. Я все же напишу еще пару статей на случай, если Вам потребуется универсальная точилка )

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


Что мне не понятно, так это почему вы этого не видите, несмотря на все отзывы. Неужели вы никогда не держали в руках хорошей удобной точилки?

Что мне не понятно, так это почему вы этого не видите, несмотря на все отзывы. Неужели вы никогда не держали в руках хорошей удобной точилки?

Куда мы все спешим, друзья. Я всего месяц назад сформулировал идеологию VAOP. Неделю мы уже обсуждаем статью. Большое Вам всем спасибо, что не остались к ней равнодушными. Повторяю — неделя всего. Что за пожар, что и как и все Вам тут же растолкуй в чате )
Это забег на дальнюю дистанцию, на годы. А то получится как у Высоцкого:


Воля волей если сил невпроворот, — а я увлёкся:
Я на десять тыщ рванул, как на пятьсот, — и спёкся!

Терпение. Я уже говорил, что напишу статью, где расскажу об опыте применения в 2019 году VAOP при кодировании Top Trade Cycle.
Не без Вашей помощи у меня появилась идея написать серию статей про программирование 40-60 лет назад под тэгом "карандашное программирование", потому, что когда я начинал в 1975 году, из тулсов мы имели только — бумагу, карандаш и ластик.
К сожалению тэг "карандашное программирование" уже заняли другим смыслом. Можно "винтажное программирование" или "vintage programming". Под этим тэгом я хочу написать статью "Истоки VAOP" из которой Вы узнаете как я в 1981 с карандашом и ластиком придумал и прикрутил VAOP при написании программы дублирования перфолент на ЭВМ СМ-1
Планов много. У нас забег не на 500 )

Я всего месяц назад сформулировал идеологию VAOP.

А как же "предложена в 1981 году", "я в 1981 с карандашом и ластиком придумал и прикрутил" "опыт применения в 2019 году", "у меня это работает в РЕАЛЬНЫХ ПРОЕКТАХ"?


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

А как же "предложена в 1981 году", "я в 1981 с карандашом и ластиком придумал и прикрутил" "опыт применения в 2019 году", "у меня это работает в РЕАЛЬНЫХ ПРОЕКТАХ"?

Не вижу противоречий. Так почти всегда получается, что сначала применят "это" для решения задачи, а потом уже подведут под "это" идеолигическую основу. Вы, кстати, знаете, что ООП имеет идеологию? Это из Википедии:


Идеологически ООП — подход к программированию как к моделированию информационных объектов, решающий на новом уровне основную задачу структурного программирования: структурирование информации с точки зрения управляемости[2], что существенно улучшает управляемость самим процессом моделирования, что, в свою очередь, особенно важно при реализации крупных проектов.

Заметьте что в идеологии ООП, а отличии от VAOP ничего не сказано что:


… что улучшает процесс взаимодействия всех при создания программного продукта и, что особенно важно, существенно снижает затраты на этапе поддержания работы и адаптации к изменению внешних условий в Будущем.

Не трудно заметить, что так оно и есть на самом деле — применяют его там где и без него можно обойтись и так все запутают своим наследием, что фиг разберешься. Стали мне статьи с наездами на ООП встречаться.


В отличии от ООП, VAOP идеологически более нацелено на жизнь продукта уже после его кодирования.


Вот кстати цитата из будущей статьи:


Для программистов все заканчивается в самом начале жизненного пути программного продукта. Родили, поставили на ноги, пошел, ушел и забыли. Это очень сложно, я понимаю, встать на место заказчика и именно под этим углом посмотрить на то, что делает VAOP для снижения затрат на этапе поддержания работы и адаптации программного продукта к изменению внешних условий в Будущем.

Я же пишу про это же в начале статьи:


Знание v-agent ориентированном подхода к программированию, будет полезно ни сколько разработчикам, которые получают деньги за не важно по какой методологии, сделанный программный продукт, а заказчикам, которые на долгие годы остаются один на один с проблемами поддержания работы программного продукта и адаптации его к изменению внешних условий ...

Ребята, там в начале статьи всего три коротеньких абзаца, а Вы и их внимательно не прочитали, и мне уже который раз приходиться к ним возвращаться.


Заказчикам будем БОЛЕЕ полезно а не разработчикам. Векторы интересов заказчиков и разработчиков расходятся.
Вот и ответ на Ваш вопрос почему мнение разработчиков о VAOP не является для меня решающим )

Так почти всегда получается, что сначала применят "это" для решения задачи, а потом уже подведут под "это" идеолигическую основу.

Вот только примеры применений основываются не на идеологии, а на реальном использовании. А вы говорите, что с ними проблема, потому что вы только что идеологию придумали.


Вы, кстати, знаете, что ООП имеет идеологию?

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


Заметьте что в идеологии ООП, а отличии от VAOP ничего не сказано что:

В процитированной вами, да. Ну и что?..


В отличии от ООП, VAOP идеологически более нацелено на жизнь продукта уже после его кодирования.

А вот это утверждение неверно. Первая попавшаяся же статья: "The goals of object-oriented programming are ease of maintenance, increased understanding, and ease of evolution".


Вот кстати цитата из будущей статьи: "Для программистов все заканчивается в самом начале жизненного пути программного продукта. Родили, поставили на ноги, пошел, ушел и забыли."

И эта цитата тоже неверна. Для каких-то программистов заканчивается, но не для всех. Есть (и их очень много) программисты, которые занимаются поддержкой ПО (я, кстати, из их числа). И есть куча литературы, как писать ПО, чтобы упрощать его дальнейшую поддержку.


Вот и ответ на Ваш вопрос почему мнение разработчиков о VAOP не является для меня решающим

А без помощи со стороны разработчиков никакой заказчик VAOP не получит, так что если вам плевать на мнение разработчиков, то можно дальше и не делать ничего.

… что если вам плевать на мнение разработчиков, то можно дальше и не делать ничего.

Спокойствие. Я писал:


… мнение разработчиков о VAOP не является для меня решающим

а про "плевать" не писал )
С разработчиками предстоит долгая работа по повышению общей культуры программирования, что и делает любая методология программирования

Я писал: "мнение разработчиков о VAOP не является для меня решающим" а про "плевать" не писал

С точки зрения наблюдаемого в этой дискуссии результата это одно и то же.


С разработчиками предстоит долгая работа по повышению общей культуры программирования

Для этого нужно, чтобы то, с помощью чего вы предполагаете "работать", предоставляло более высокую культуру программирования, не правда ли?

Для этого нужно, чтобы то, с помощью чего вы предполагаете "работать", предоставляло более высокую культуру программирования, не правда ли?

Несомненно все так, и нам есть над чем работать, и над тем "с помощью чего" надо работать.
Идеологии они ведь только основные направления движения указывают, цели, так сказать, они как высеченные в камне мечты о идеальном процессе СОЗДАНИЯ программного продукта.

Несомненно все так, и нам есть над чем работать, и над тем "с помощью чего" надо работать.

Ваша идеология, однако же, не предоставляет более высокой культуры программирования (кроме общих слов).

Ваша идеология, однако же, не предоставляет более высокой культуры программирования (кроме общих слов).

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

Идеологии этим страдают. Подключайтесь. В любой, самой никудышной идее можно найти рациональное зерно

Но зачем?


Вместо того, чтобы уже неделю все подряд критиковать, на это, кстати, много сил уходит, дали бы, лучше, совет.

Мне кажется, вам его уже давали, но мне не сложно озвучить еще раз: ознакомьтесь сначала с существующими современными методологиями и освойте на должном уровне хотя бы один современный язык программирования.

Заметьте что в идеологии ООП, а отличии от VAOP ничего не сказано что: ...
Ок. Я вам заявляю, что ООП «улучшает процесс взаимодействия всех при создания программного продукта и, что особенно важно, существенно снижает затраты на этапе поддержания работы и адаптации к изменению внешних условий в будущем». Всё, ООП резко похорошела и теперь её можно совать повсюду, где надо и не надо.
Или всё-таки суть не в громких заявлениях и трескучих фразах?
Не трудно заметить, что так оно и есть на самом деле — применяют его там где и без него можно обойтись и так все запутают своим наследием, что фиг разберешься.
И вы решили добавить к этому ещё и применяющийся где-попало и запутывающий всё VAOP.
Для программистов все заканчивается в самом начале жизненного пути программного продукта.
Да неужели? Видимо в вашем мире на каждый патч, обновление, новую версию программ создаётся новая компания с новыми программистами? А если речь о заказных программах под конкретного заказчика, то тут вопрос денег. Готов клиент платить за то, чтобы три программиста сидели наготове в ожидании заказов на доработку от него, не проблема, будут сидеть и ждать.
Вот и ответ на Ваш вопрос почему мнение разработчиков о VAOP не является для меня решающим
Ок, не проблема. Значит пусть заказчики сами и работают с вашей системой. Ну или платят в N раз больше, чем за обычную программу, учитывая, что разработчику делать в несколько раз больше работы.
… Ну или платят в N раз больше, чем за обычную программу, учитывая, что разработчику делать в несколько раз больше работы.

На все сто с Вами согласен. У меня было много неудачных попыток протолкнуть VAOP, в веб-проекты, которые начинались с нуля. Идею все быстро схватывали и, в целом одобряли, даже не смотря на мой слабый, по приезду, английский, но как только понимали, что это увеличивает сроки разработки и стоимость — давали задний ход. Было, что и получалось. Мне не удавалось убедить заказчика, что можно сейчас заплатить больше, но потом все отбить на экономии при сопровождении и модернизации. Вот свежий пример, правда, не с VAOP. Восемь лет назад начинаем рефакторинг системы, в Zend переводим. Стою на коленях — давайте добавим мультиязычность сразу. Не, у нас весь рынок в штатах и сроки. Сейчас у них встал вопрос — как язык еще один добавить? Новый клиент жирный и теперь они, вышли на меня, как разработчика front framework для них, просят оценить во что это выльется ) Что оценивать, я уже тогда знал, что это будет легче все переписать занова ) Денег, конечно, заработаю, но на душе как-то нехорошо от того, что так происходит.
Поэтому, с Заказчиками предстоит большая работа. Кто платит деньги, тот проект и танцует ),

Да неужели? Видимо в вашем мире на каждый патч, обновление, новую версию программ создаётся новая компания с новыми программистами?

Ой, за 20 лет, я здесь такого нагляделся )
Особено, когда в 2012, с месяц, в одной канадской фирме поработал. Она поднялась на .com буме и наделала кучу сайтов для всяких мелких контор и продолжала их поддерживать. Я и еще трое на этом сидели. Дают тебе очередний сайт. Там надо страничку добавить или функционал подшаманить или рефакторинг, и пока врубишься, видишь, какие вещи ребята, как будто на коленках, кто как, в начале 2000-х делали, без MVC, без ничего, кто в Перле, кто в зародышном PHP без ООП еще. До трех сайтов одновременно подправляешь. Возненавидел PHP c тех пор. Я с Перла начинал, а приходилось в течении дня не раз пересаживаться с "феррари" на "запорожец" и обратно. Сейчас PHP уже ничего так, повзрослел)


Короче, на деле, иногда бывает гараздо сложнее и "веселее")


И самая, главная проблема, когда впервые смотришь на код сайта, "алгоритм" нигде не записан. У тебя общей картины нет. Вот тогда я вспоминал о VAOP где все переходы в VA script можно проследить, а коды всех действий по полочкам в VA box разложены.
Да с VAOP быстро можно было бы разобраться.
А так приходилось тыкаться целый день, дергать за ниточки в этом "черном ящике" и никто, никто не может тебе помочь разобраться что и как там работает (

И самая, главная проблема, когда впервые смотришь на код сайта, "алгоритм" нигде не записан.

Мне вот прямо любопытно: а что же такое "алгоритм" для сайта?

Мне вот прямо любопытно: а что же такое "алгоритм" для сайта?

Мы же про "алгоритм" сайта уже говорили в начале этой недели ) на примере вопросника:
eco-programming-webfsm01
там можно видеть VA script:
/data/state_matrix.json

Это, прямо скажем, не сайт, а веб-приложение.


Вот представьте себе, не знаю, википедию. Она — сайт. Какой у нее алгоритм?

Вот представьте себе, не знаю, википедию. Она — сайт. Какой у нее алгоритм?

А так конечно никакого "алгоритма", скорее всего нет ) Он есть, наверное, у разработчиков. Переходы все жестко прописаны в коде.
Не представляю как вы в этом разбиретесь)

Вы правда про гипертекст как основу веб-сайта не в курсе, или просто не понимаете вопроса?

Вы правда про гипертекст как основу веб-сайта не в курсе, или просто не понимаете вопроса?

Что Вы от меня хотите? Можно поконкретней?

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

Чего Вы к слову "сайт" пристали. Я же сказал, что когда говорил про ту канадскую фирму видел ввиду веб приложения, конечно. С САЙТАМИ, конечно проще разобраться, но и для них VA script бы не помешал, как дополнительный абстрактный уровень.

Я же сказал, что когда говорил про ту канадскую фирму видел ввиду веб приложения, конечно.

Где сказали?


Не суть, впрочем. С веб-приложениями тоже же весело. Вот возьмем простенькое типовое веб-приложение, "заполнение анкеты на что-нибудь". Восемь страниц в анкете, пользователь может открывать их в любом порядке (и даже параллельно в разных окнах браузера), когда все заполнил и сохранил — оно улетает куда надо.


Какой тут алгоритм?


С САЙТАМИ, конечно проще разобраться, но и для них VA script бы не помешал, как дополнительный абстрактный уровень.

Какая польза от этого "дополнительного абстрактного уровня" для википедии?

Вы же программист, как и в любом другом месте "дополнительный абстрактный уровень" может пригодиться. Все ссылки получат код, вместо реального адреса, а там в VA box заменяются на реальные.
Бред, конечно, для Википедии, но там где надо часто обновлять это будет легче сделать в VA box и не лезть в сам код страницы. Я как архитектор, всегда стараюсь "уровень" добавлять если есть возможность.

Вы же программист, как и в любом другом месте "дополнительный абстрактный уровень" может пригодиться.

В том-то и дело, что я как программист хорошо знаю, что дополнительные уровни абстракции бывают лишними.


Все ссылки получат код, вместо реального адреса, а там в VA box заменяются на реальные.

Зачем для этого VAOP? Обычная адресация по таблице псевдонимов. Там нет алгоритма.


Я как архитектор, всегда стараюсь "уровень" добавлять если есть возможность.

… и когда же вы останавливаетесь?


(не могу не заметить, как вы снова выбрали из комментария один удобный вам вопрос, а остальные, видимо, неудобные, проигнорировали)

(не могу не заметить, как вы снова выбрали из комментария один удобный вам вопрос, а остальные, видимо, неудобные, проигнорировали)

Ничего личного, я продолжаю с Вами разговор исключительно в учебно-маркетинговах целях. Зачем мне отвечать на неудобные вопросы )

Это многое говорит о качестве вашей "новой парадигмы". Создается ощущение, что она тоже преследует исключительно маркетинговые цели.

Не суть, впрочем. С веб-приложениями тоже же весело. Вот возьмем простенькое типовое веб-приложение, "заполнение анкеты на что-нибудь". Восемь страниц в анкете, пользователь может открывать их в любом порядке (и даже параллельно в разных окнах браузера), когда все заполнил и сохранил — оно улетает куда надо.
Какой тут алгоритм?

Что-то я совсем перестаю Вас понимать. Давайте завтра продолжим. Я буду за рулем часа четыре ...

Вот тогда я вспоминал о VAOP где все переходы в VA script можно проследить, а коды всех действий по полочкам в VA box разложены.
Ок. Проведём эксперимент. Я тут закодировал один довольно известный алгоритм в вашем VAOP-стиле. Сможете определить, что он делает?
Код с VAOP
t = {
  "A0": {"D0": "A1"},
  "A1": {"D0": "A2"},
  "A2": {"D0": "A3", "D1": "AE"},
  "A3": {"D0": "A4"},
  "A4": {"D0": "A5"},
  "A5": {"D0": "A6", "D1": "A8"},
  "A6": {"D0": "A7", "D1": "AE"},
  "A7": {"D0": "A2"},
  "A8": {"D0": "AD", "D1": "A9"},
  "A9": {"D0": "AA"},
  "AA": {"D0": "AB"},
  "AB": {"D0": "AC"},
  "AC": {"D0": "AD"},
  "AD": {"D0": "A5"},
  "AE": {"D0": "X"}
}
         
s = "A0"
while s <> "X":
  d = "D0"
  if s == "A0":
    a = [1, 6, 12, 6, 3, 24]
  if s == "A1":
    i = len(a) - 1
  if s == "A2":
    if i < 0:
      d = "D1"
  if s == "A3":
    j = 0
  if s == "A4":
    r = True
  if s == "A5":
    if j < i:
      d = "D1"
  if s == "A6":
    if r:
      d = "D1"
  if s == "A7":
    i -= 1
  if s == "A8":
    if a[j] > a[j + 1]:
      d = "D1"
  if s == "A9":
    q = a[j]
  if s == "AA":
    a[j] = a[j + 1]
  if s == "AB":
    a[j + 1] = q
  if s == "AC":
    r = False
  if s == "AD":
    j += 1
  if s == "AE":
    print a
  s = t[s][d]
print "Done"
    

Только чур, код не запускать. Разбирайтесь в исходнике.
А вот тот же код, но в классической записи. Можете заглянуть, когда надоест разбирать переходы.
Нормальный код
def bubbleSort(arr):
  res = arr
  leng = len(res)
  for i in range(leng):
    done = True
    for j in range(leng - i - 1):
      if res[j] > res[j + 1]:
        res[j], res[j + 1] = res[j + 1], res[j]
        done = False
    if done:
      return res
  return res

result = bubbleSort([1, 6, 12, 6, 3, 24])
print result
print "Done"

Вот только все показанные вами примеры — это попытки заточить перочинным ножом шариковую ручку, чтобы обмакнуть её в чернильницу.

Про перочинный нож и шариковую ручку Всем надеюсь понятно, а про чернильницы жми сюда
Так и в программировании, ребята, Вы многое пропустили ). Жмите на мои примеры )

Так и в программировании, ребята, Вы многое пропустили
Тут, думаю, мериться можно долго. Каждый из нас что-то освоил, что-то пропустил, о чём-то даже и не знает за ненадобностью, а что-то успел забыть за давностью лет.
Жмите на мои примеры
А толку на них жать? Ни один ваш пример не показывает, как правильно писать код. Ни в одном из них нет прозрачного самодокументируемого кода, декомпозированного на небольшие, легко читаемые функции. Вы даже не потрудились нормально освоить языки, на которых написаны эти примеры, из-за чего они выглядят взятыми из 80-х годов прошлого века.
Мы уже шестой день по кругу ходим.
Один мой бывший студент...

Ну так если обсуждать не предметно, а вместо этого апеллировать к студентам (у которых заведомо нет выбора, нет опыта) или к байкам про заказчиков N лет назад (объективность историй мало известна), то далеко не уедешь :)

Вот вам вариант, возвращающий ошибку, но допускающий пробелы в начале и конце строки.
Код
def isSpace(char):
  return char == ' ' or char == "\t"

def isDigit(char):
  return char >= '0' and char <= '9'

def isSign(char):
  return char == '-' or char == '+'

def isMinus(char):
  return char == '-'

def isPoint(char):
  return char == '.' or char == ','

def isEOL(char):
  return char == 0

def digitValue(char):
  return ord(char) - ord('0')

def charReader(string):
  for char in string:
    yield char
  yield 0
  
def parseNumber(strn):
  intv = 0
  ints = ''
  fracv = 0
  fracs = ''
  sign = 1
  div = 1.
  hasDigits = False
  chars = charReader(test)
  char = next(chars)
  # Пропускаем пробелы в начале строки
  while not isEOL(char) and isSpace(char):
    char = next(chars)
  # Проверяем наличие знака
  if not isEOL(char) and isSign(char):
    if isMinus(char):
      sign = -1
    char = next(chars)
  # Парсим целую часть
  while not isEOL(char) and isDigit(char):
    hasDigits = True
    intv = intv * 10 + digitValue(char)
    ints += char
    char = next(chars)
  # Проверяем наличие дробной части и парсим её
  if not isEOL(char) and isPoint(char):
    char = next(chars)
    while not isEOL(char) and isDigit(char):
      hasDigits = True
      fracv = fracv * 10 + digitValue(char)
      fracs += char
      div *= 10
      char = next(chars)
  # Пропускаем пробелы в конце строки
  while not isEOL(char) and isSpace(strn[pos]):
    char = next(chars)
  return {
    'error': not isEOL(char) or not hasDigits,
    'sign': sign,
    'int': ints,
    'frac': fracs,
    'value': (intv + fracv / div) * sign
  }

tests = ['-25.8', '34', '.312', '  +2,00315', '+.']
for test in tests:
  result = parseNumber(test)
  if result['error']:
    print("'%s' => Error" % (test))
  else:
    print("'%s' => sign: %s, int: %s, frac: %s, value: %s" % (test, result['sign'], result['int'], result['frac'], result['value']))

Заодно исправил ошибку с возвратом дробной части. Ну и немножко магии генераторов добавил.
Как видите, конечный автомат по прежнему не обязателен.
Условие задачи (писать на Питоне).

Это почему вдруг?


Пользователь вводит реальное число и программа должна выделить целую и дробную части числа

Parser<(int left, int right)> parser =
    from sign in Parse.Char('-').Optional()
    from left in Parse.Number.Optional()
    from separator in Parse.Char('.').Optional()
    from right in Parse.Number.Optional()
    select (
      string.IsNullOrEmpty(left) ? 0 : int.Parse(left),
      string.IsNullOrEmpty(right) ? 0 : int.Parse(right)
    );

return parser.Parse(input);

(это если сделать вид, что мы не знаем про Decimal.TryParse)

Да, и код на питоне практически не отличается от PHP.
Код
def isSpace(char):
  return char == ' ' or char == "\t"

def isDigit(char):
  return char >= '0' and char <= '9'

def isSign(char):
  return char == '-' or char == '+'

def isPoint(char):
  return char == '.' or char == ','

def digitValue(char):
  return ord(char) - ord('0')

def parseNumber(strn):
  pos = 0;
  intg = 0;
  frac = 0;
  sign = 1;
  value = 0;
  div = 1.;
  leng = len(strn);
  # Пропускаем пробелы в начале строки
  while pos < leng and isSpace(strn[pos]):
    pos += 1
  # Проверяем наличие знака
  if pos < leng and isSign(strn[pos]):
    if strn[pos] == '-':
      sign = -1
    pos += 1
  # Парсим целую часть
  while pos < leng and isDigit(strn[pos]):
    intg = intg * 10 + digitValue(strn[pos])
    pos += 1
  # Проверяем наличие дробной части и парсим её
  if pos < leng and isPoint(strn[pos]):
    pos += 1
    while pos < leng and isDigit(strn[pos]):
      frac = frac * 10 + digitValue(strn[pos])
      div *= 10
      pos += 1
  value = (intg + frac / div) * sign;
  return {
    'sign': sign,
    'int': intg,
    'frac': frac,
    'value': value
  }

tests = ['-25.8', '34', '.312', '  +2,315']
for test in tests:
  result = parseNumber(test);
  print "'%s' => sign: %d, int: %d, frac: %d, value: %s" % (test, result['sign'], result['int'], result['frac'], result['value'])
  

З.Ы. На питоне пишу в первый раз.
Да. Это простенький пример для моего онлайн курса.
От просмотра кода осталось ощущение, что человек, писавший его, плохо знает JSON, слабоват в питоне, не очень дружит с SQL, не выдерживает единый стиль кода и неудачно выбирает архитектурные решения.

Да я же честно писал, что на питоне для TTC это моя первая и последняя программа. С SQL я никогда особо не дружил и в JSON не силен, да и не хочу.
На все 100% согласен с Вашей оценкой моих познаний в этом. Мне 64. Забываю уже все и новое не лезет.
Пришло время методологиями заняться )
Надо же что-то Человечеству оставить в надежде на благодарность потомков )

А зачем вы преподаете и пишете курс с использованием языка, который вы, по вашему же заверению, плохо знаете? Может быть, если нормально изучить язык, то и никакой VAOP не понадобится?

Хорошо бы конечно, но VAOP решает проблемы эффективного программирования не только на Питоне )

Так тем более, раз он решает проблемы на любом языке, так и показывайте на языке, который хорошо знаете. А то студенты будут удивляться, зачем расписывать сто строк на программу, находящую сумму массива, когда для этого в питоне есть готовая функция sum.

Никакая методология не поможет вам эффективно программировать, если вы не знаете язык.

Универсальная она только в том смысле, что универсально неудобна всем.
Для общения заказчика с аналитиком требуются одни инструменты, аналитика с разработчиком — другие, разработчика с компьютером — третьи. Попытайтесь всё это скрестить и получите гибрид ежа с ужом, полтора метра колючей проволоки, пригодной только для причинения максимального неудобства всем, имеющим дело с такой системой.

Ой, а я понял, что "универсальность" это в смысле универсального ключа потому, что работает оно везде — в разных средах, на разных языках…
Так и происходит сейчас в реале. Со мной на контакт выходят программеры со своими проблемами, когда алгоритмы сложные и везде можно прикрутить VAOP

С ужасом представляю, как прихожу к заказчику с описанием процесса визирования закупок оформленной в виде vaop. Особенно, если заказчик — большая организация. Большая это хотябы более 500 пользователей.
А еще где-то через пол-года изучения этого 100500-страничного талмуда позвонит заказчик и скажет: «А давайте в шаге v_12546 добавим переход на шаг v_8746, при условии, что выполнился шаг v_5799».
И вот тут да, сразу станет всем понятно. И сразу ощутим всю мощь vaop (на всякий случай, это был сарказм).

lair, я прочитал вот прям все вопросы и ответы автора.
Мне вот со стороны это напомнило ситуацию, когда люди очередного вероисповедания и начинают рассказывать, что их «учение/толкование» самое правильное, а все остальные от лукавого/рогатого/ползучего…
И на любые логические вопросы/доводы/объяснения ответы схожи. Без какой то конкретики/фактов/подтверждений. И «Приходите на ежевоскресную проповедь в 10-00, там все поймете».

Переубедить таких людей нельзя. Самое печальное, что какой-то кусок пирога они таки отхватят. Особенно, если будут приправлять чем-то вроде «это лучше чем ООП или 0-й порог вхождения в понимание бизнес-логики и т.д.»
Ведь автор заявляет, что у него есть последователи.

Да. Все совпадения в моем ответе с реальными людьми/событиями прошу принимать за мои шальные выдумки.
Самое печальное, что какой-то кусок пирога они таки отхватят.

Как ни странно, "кусок пирога" меня как раз пугает меньше всего. Сейчас это настолько большой пирог, что его хватает с запасом.

Плод сороколетнего труда, мамма мия! Мануал по тому, как спустить свою жизнь в никуда, делая никому не нужные и неинтересные вещи.

Напоминает "Литературное программирование" Дональда Кнута. У него пишется человекочитаемый текст со вставками кода. Потом код вырезается скриптом и компилируется. Примерно с 2006 придумали reverse literate programing, в нём куски кода вырезаются скриптом и вставляются в человекочитаемый текст.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории