Обновить
85
0
Ilya Kaznacheev@Color

Consulting Cloud Architect, GDE on Cloud

Отправить сообщение

Да все на абапе реализуемо, как и на любом другом языке. Мы делали тул для автоматизации регрессионного тестирования, который запускал скрипты на питоне с тестами на селениуме, и потом все это забирал обратно в сап и обрабатывал (например).


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


Опенсорс — это какие-то либы и подобные инструменты. Проекта с "боевым" кодом вы не найдете, потому что это энтерпрайзный код, который ни одна контора не разрешит опенсорсить.

Запустить просто так не получится. Либо иметь под рукой SAP, либо зарегистрировать себе демо акк SAP Cloud Platform.


Опенсорс проекты — посмотрите тут, только те, что посвежее.

И тем не менее бизнес-логику на нем тоже пишут.


По поводу go-linq — нужно смотреть бенчмарки, есть предположение, что из-за рефлексии он будет очень медленный. Но спасибо, интересное решение.

Ну вот сейчас пишу на Go, и там такого даже рядом нет :)

Есть для и этого решения, но лично я с этим не работал, поэтому не могу сказать, насколько это хуже/лучше какого-нибудь S3 :)

Откройте какой-нибудь опенсорс проект на абапе и почитайте.


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


Из-за самого языка никто не страдает, страдают только из-за закрытости инфраструктуры SAP.

SORT users BY name.

В целом базовый функционал примерно такой же, как в SQL:


SORT itab BY col1 ASCENDING col2 DESCENDING.

Хотите полный функионал — смотрите доки.


Ради примера, вот кусочек более сложной динамической сортировки оттуда же:


  SORT itab BY VALUE abap_sortorder_tab(
       ( name       = 'TABLE_LINE'
         descending = SWITCH #( direction
           WHEN 'UP'   THEN ' '
           WHEN 'DOWN' THEN 'X'
           ELSE THROW cx_illegal_direction( ) )
         astext     = 'X ' ) ).

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

Вопрос не в функционале, а то, что это уже встроено в синтаксис. Можно и на си такое же реализовать, но чисто работать с этим будет очень многословно и неудобно. А тут под это уже все заточено из коробки, вот и все.

Да много чего, на самом деле. Если помнить, что таблица в ABAP — это массив структур, в них есть:


  • удобный механизм сортировок (практически как в SQL, даже более функциональный);
  • создание индексов для таблиц в приложении, и работа по ключам этих индексов (похоже на SQL, только в рантайме и с указанием конкретного индекса);
  • достаточно удобные циклы по таблицам, со встроенными группировками (то есть можно делать цикл в цикле по сложному условию, это встроено в синтаксис);
  • специальный тип (mesh) для древовидных структур данных, где каждая нода — таблица, и различные переходы между нодами по условиям и по путям (в цикле или без);
  • несколько типов таблиц (простая (индексный доступ), сортированная (доступ по первичному ключу), хешированная (доступ по ключу), + для первых двух можно строить индекс по вторичному ключу);
  • механизмы агрегации, упрощающие подсчет агрегатов по всей структуре строки, не по одному полю;
  • в целом таблица и структура (строка) — базовые типы в абапе, и на них много чего построено.
  • бонус: недавно завезли возможность выполнения SQL над локальными данными силами сервера приложений.

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

На самом деле основная претензия к ABAP — дедовский синтаксис из кобола (который потехоньку уходит в прошлое с новыми релизами), хотя большинство тех же ФП языков страдают тем же.


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


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

  1. Смысл не в defer а в том, что тикер нужно остановить, иначе он будет бесконечно крутиться. Это логично, но если для кого-то не очевидно, то есть в доках. defer помогает только в том, чтобы выполнить его гарантированно при выходе из функции, а так можете где угодно вызывать, главное, чтобы он был вызван. Некоторые линтеры проверяют вызов функций Close(), кстати.
  2. "safe for concurrent use" подразумевает вызов функций как таковых, а не относительной последовательности. Если вы закроете thread-safe канал в одной рутине, а в другой будете в него писать — будет паника, и это ожидаемо.
  3. зависит от разработчика, для этого и делается кодревью.

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


Golang blog вам в помощь, можете начать отсюда, отсюда, отсюда и отсюда.

Обычно такие вопросы задают в чате про Go где-нибудь в телеграме или слаке, а не тут.


  1. В каком случае он не останавливается? Если при ticker.Stop() дожно останавливаться, в примере из документации так и написано: defer ticker.Stop(). Более того, там еще и словами написано: "Stop the ticker to release associated resources". Или вы что хотите чтобы он сделал?
  2. Приведите пример, о чем пишите. Thread-safety означает, что тип позволяет использовать определенную операцию параллельно, не боясь словить панику при одновременной записи или чтении, например, а не то, что можно использовать разные операции в каком угодно порядке. Это ничего не говорит о том, что если состояние было изменено в одной горутине (например, канал закрыт), то это не аффектит другие места.
  3. Если не сказано другого, sync.Mutex относится к полю структуры, идущему сразу же за мьютексом. Не помню, где конкретно про это написано, но теперь вы знаете.

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


P.S.: документация в го очень хорошая и подробная, также не забывайте про примеры в документации (которые есть исполняемые тестовые файлы) и про юнит тесты тоже.


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

Очевидно, что цифры и буквы мировое правителсьтво придумало для того, чтобы людей дурачить!

Для защиты от ядерного взрыва нужны ламповае роутеры и свичи.

Злободневно. Нужно продавать как ЦОД с защитой от рейдерства.

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

А где, простите, связь между разработкой и реверс-инженирингом?

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность