OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 14:57

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 87 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Воскресенье, 12 Апрель, 2020 21:26 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Илья Ермаков писал(а):
Посмотрите, например, на Dart - всё там у них отлично, никакой избыточной громоздкости нет при работе с JSON через полную статику для типов узлов
Куда смотреть? Нет проблем с сериализацией из статики или десерелизацией из произвольной динамики?

Вижу динамику на выходе десериализации, но, может, я невнимателен.

С сериализацией произвольной статики тоже, вроде бы, без лишних телодвижений не обойтись
Цитата:
Only objects of type int, double, String, bool, null, List, or Map (with string keys) are directly encodable into JSON

И как здесь сохранять краткость без исключений тоже непонятно
Код:
User.fromJson(Map<String, dynamic> json)
      : name = json['name'],
        email = json['email'];

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


Последний раз редактировалось Comdiv Воскресенье, 12 Апрель, 2020 21:51, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Воскресенье, 12 Апрель, 2020 21:50 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Comdiv писал(а):
Куда смотреть? Нет проблем с сериализацией из статики?


Ну вот как в Dart реально работают с JSON-обменом - объявляют статические типы (при этом для "чужого" JSON, но структурированного статически, их мощности тоже хватает), а сериализаторы-десериализаторы генерятся автоматом:

Код:
@JsonSerializable()
class ProfileInfo {
  int id;
  String name = ''; //ФИО
  OsQual qual;
  bool status;
  PracticeType variant;
  List<PracticeType> availableVariants = [];
  List<Attachment> files = [];
  ProfileInfo({this.id, this.name, this.qual, this.status, this.variant, this.availableVariants, this.files});
  factory ProfileInfo.fromJson(Map<String, dynamic> json) => _$ProfileInfoFromJson(json);
  Map<String, dynamic> toJson() => _$ProfileInfoToJson(this);
}

@JsonSerializable()
class ExamView {
  int id;
  ExamState state;
  ExamStage stage; // этап экзамена, теоретический или практический
  String experts; //экспертная комиссия
  DateTime beginTime; //время, которое отведено на экзамен
  int profilesCount = 0;
  ExamView(
      {this.id,
      this.state,
      this.stage,
      this.experts,
      this.beginTime,
      this.profilesCount});
  factory ExamView.fromJson(Map<String, dynamic> json) => _$ExamViewFromJson(json);
  Map<String, dynamic> toJson() => _$ExamViewToJson(this);
}



@JsonSerializable порождает на этапе компиляции процедуры _$TYPEFromJson, _$TYPEToJson, которые потом программист вызывает из методов ( => - это в Dart краткий вариант тела процедуры, из одной операции).

На сервере, где нет генерации в JavaScript, можно использовать вариант с рефлексией,а не с предгенерацией.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Воскресенье, 12 Апрель, 2020 21:57 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
А подход с генерацией - это вообще другая тема, для которой шаблоны побоку. Почему это ответ на моё утверждение про гиблость соревнования с динамикой? Если достаточно гнать только из статики в статику, то это совсем другое дело

Кстати, где происходит проверка на допустимость значений?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Воскресенье, 12 Апрель, 2020 22:12 

Зарегистрирован: Пятница, 10 Апрель, 2020 04:42
Сообщения: 8
adimetrius писал(а):
Прошу прощения, про какой Lists идет речь?
https://oberoncore.ru/bbcc/subs/lists/start


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Воскресенье, 12 Апрель, 2020 22:15 

Зарегистрирован: Пятница, 10 Апрель, 2020 04:42
Сообщения: 8
Comdiv писал(а):
Проблема с шаблонами такова, что действительно хорошо их сделать в языке крайне непросто.
В Rust они отлично спроектированы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Воскресенье, 12 Апрель, 2020 22:24 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Comdiv писал(а):
А подход с генерацией - это вообще другая тема, для которой шаблоны побоку.


Так как это побоку, вот они там, родимые:
List<PracticeType> availableVariants = [];
List<Attachment> files = [];

Вместо разврата с ассоциативными массивами общими в дин. языках - культурненько всё.

Цитата:
Почему это ответ на моё утверждение про гиблость соревнования с динамикой? Если достаточно гнать только из статики в статику, то это совсем другое дело


Что вы подразумеваете под "из статики в статику"? Практически в любом реальном формате у вас состав полей известен статически (плюс-минус опциональные поля). Значения ключей, которые идут для ассоц. массивов, вообще в 99% известны статически, т.к. реально это на Map, а скриптовый аналог struct/RECORD в большинстве случаев (если только не доступ по ID/ключу, но это уже в рантайме, в форматах это обычно не передаётся).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Воскресенье, 12 Апрель, 2020 22:37 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
berona писал(а):
В Rust они отлично спроектированы.
Нет, но это долгий разговор. Хотя, как я уже писал, важно чтобы это было центральной концепцией сначала, что для Rust в силу возраста и желания авторов было сделано


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Воскресенье, 12 Апрель, 2020 22:45 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Илья Ермаков писал(а):
Так как это побоку, вот они там, родимые:
...
Вместо разврата с ассоциативными массивами
Вот кодогенерации это и побоку: массивы там обычные, ассоциативные или стандартные(не произвольные) шаблоны.

Цитата:
Практически в любом реальном формате у вас состав полей известен статически
Если привыкли делать всё в статике, то да. Но с динамикой можно круто срезать на поворотах. С последствиями для контроля, естественно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Понедельник, 13 Апрель, 2020 11:34 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Comdiv писал(а):
Цитата:
Практически в любом реальном формате у вас состав полей известен статически
Если привыкли делать всё в статике, то да. Но с динамикой можно круто срезать на поворотах. С последствиями для контроля, естественно.


Это отдельные случаи - и не факт, что сильно что-то убыстрится в разработки из-за schema-free. А вот ад развития и рефакторинга обеспечен, как это и есть для JS, PHP и иже с ними.
Экономику-то для того же Dart против JS уже посчитали: на 40% меньше трудозатрат.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Понедельник, 13 Апрель, 2020 15:17 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Я (тоже) не понял, какая связь сериализации с шаблонами.

Про сериализацию: в ББ есть каркас для сериализации: модуль Stores. Он требует, чтобы производный тип явно прописывал Externalize/Internalize. Универсальной нет.

Как я понял, в JS/JSON Тоже нет универсальной:
Цитата:
Only objects of type int, double, String, bool, null, List, or Map (with string keys) are directly encodable into JSON

Object отсутствует, т.е. ссылки между объектами нужно вручную сериализовать. Как и в Stores.

В то же время, есть DevDebug, который, по сути, сериализует все языковые типы, когда делает дамп стека вызовов. Там используются метаданные - и несложно сделать каркас Superstores, который будет самостоятельно сериализовать все поля записи, кроме указателей. Преимущества: 1) строгая типизация; 2) ничего не генерируется: сериализатор прописан раз и навсегда в Superstores
А если при этом сделать двоичную сериализацию, а не строковую, то еще и производительность возрастет, и компактность.

И все это без шаблонов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Понедельник, 13 Апрель, 2020 16:06 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Допустим
Код:
TYPE T = POINTER TO RECORD ... END;
VAR a: POINTER TO ARRAY OF T;
  t: T;
PROCEDURE Append (VAR fa: ARRAY OF ANYPTR; fp: ANYPTR);

Хотелось бы иметь возможность вызвать:
Append(a, t)

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

Однако стоп, это создает брешь в типизации:
Код:
VAR u: POINTER TO RECORD ... END;
fa[i] := u

и все, строгая типизированность массива a нарушена. Собсно поэтому и считаются a и fa несовместимыми в КП.

Что можно с этим сделать?

Во-первых, если fa объявлен только для чтения (IN fa: ARRAY OF ANYPTR), то fa[i] := u невозможно, и тогда a и fa безопасно считать совместимыми. Это даст возможность сделать универсальные процедуры обхода, что уже неплохо. Но Append невозможно сделать в ограничениях IN.

Тогда, во-вторых, можно, например, сделать проверку соответствия фактических типов в присваивании, подобно проверке индексов. И при нарушении соответствия типа в fa[i] := u производить авост.
Придется ввести
  • понятие "терминального типа массива": в объявлении
    Код:
    A = ARRAY OF ARRAY OF ARRAY M OF ARRAY N OF Terminal

    Terminal будет терминальным типом типа А, причем Terminal - не массив; при вызове Append(a, t) фактическим терминальным типом fa будет T, а не ANYPTR.
  • и какое-то обозначение для него, чтобы производить проверку:
    Код:
    IF fp IS TERMINAL(fa) THEN fa[i] := p END

И не нужны дженерики )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Понедельник, 13 Апрель, 2020 16:45 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Илья Ермаков писал(а):
Это отдельные случаи - и не факт, что сильно что-то убыстрится в разработки из-за schema-free.
Вот из-за schema-free "разработка" тоже ускоряется.


Цитата:
А вот ад развития и рефакторинга обеспечен, как это и есть для JS, PHP и иже с ними.
Экономику-то для того же Dart против JS уже посчитали: на 40% меньше трудозатрат.
Всегда надо оговаривать круг задач. Естественно, я тоже за статику где только можно, причём чем жёстче, тем лучше. Но там, где динамика уместна или даже незаменима, соревноваться с ней - гиблое дело. При всей негодности языков, то, что Js и PHP стали применять там, где нужно развитие и рефакторинг, это уже не столько проблема языков, сколько проблема людей, занимающихся некорректной экстраполяцией радости от легкости в динамике решения сиюминутных или микрозадач на длительно сопровождаемые, требующие надёжности решения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Понедельник, 13 Апрель, 2020 20:01 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Comdiv (или еще кто-нибудь), если не затруднит, приведите, пож, наглядный пример, когда динамическая типизация имеет ощутимое преимущество перед статикой. Это, конечно. не совсем в тему, но мне это очень интересно, давно ищу такое. Ничего не попадалось, что не удивительно - я не работаю с динамической типизацией.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Вторник, 14 Апрель, 2020 12:54 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Peter Almazov писал(а):
Comdiv (или еще кто-нибудь), если не затруднит, приведите, пож, наглядный пример, когда динамическая типизация имеет ощутимое преимущество перед статикой.


У меня есть пример. Он связан не со schema-free (это блажь и goto-шничество в сфере данных, я так считаю).

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

Для скриптового языка естественная возможность, когда какой-то третий компонент (позже подгрузившийся скрипт, например), добавляет какое-то поле к уже существующему модулю/структуре. Например, новый метод.

Это позволяет делать такую декомпозицию, которая невозможна в стандартных class-oriented-языках - да и в Go с его утиной типизацией тоже. Когда мне нужно, как бы, многомерно декомпоновать функциональность (по измерению "тип объекта" и по измерению "тип функциональности", и ещё по какому-нибудь измерению типа "примесь" или "аспект"). Если это декомпонировать, вводя композиции классических объектов, то происходит взрыв количества типов и громоздкости.

Конкретный пример: есть промышленный объект и SCADA. Есть иерархическая модель объекта (да хоть представьте её как иерархию RECORD/struct).
Базовые модули содержат описания всех разновидностей узлов объекта, структуру их компоновки.

А потом возникает задача на других уровнях дополнять эту структуру объекта - полями, методами. Например, тегами ввода-вывода и операциями рабочего цикла. Полями графического состояния и операциями визуализации. Модуль автоматической прокладки маршрута должен добавить свои поля и методы, необходимые для графовых алгоритмов.
Реально обычно в SCADA-системах всё это уже делается не на языковом уровне, а на уровне некоей модели конфигурационных данных и интерпретаторов на них.
Вот здесь я рассказывал и показывал пример кода, где такое вот динамически склеиваемое ООП у меня: https://youtu.be/v71zsKrF60Y?t=872

Про это же, в принципе, такое направление, как аспектно-ориентированное программирование.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Вторник, 14 Апрель, 2020 15:50 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
А паттерн Декоратор - это не оно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Вторник, 14 Апрель, 2020 17:11 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Peter Almazov писал(а):
Ничего не попадалось, что не удивительно - я не работаю с динамической типизацией.
Как раз наоборот - удивительно. Чем же Вы таким занимаетесь? Динамическая типизация используется повсеместно, в том числе, в статически типизированных языках. Так что очень сомнительно, что не попадалось. Ответ повсюду.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Вторник, 14 Апрель, 2020 18:24 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Интересует наглядный пример, в котором "динамический" язык показывает яркое превосходство над языком со статической типизацией, вместе с его динамическими плюшками.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Вторник, 14 Апрель, 2020 19:57 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Валерий Лаптев писал(а):
А паттерн Декоратор - это не оно?


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

Но в описанном случае количество деклараций отдельных типов вырастает N-кратно.
А случай, характерный и для задач моделирования (родственным которым является, в общем, SCADA), и для задач GUI, кстати (особенно в варианте с веб-страницей и DOM, который как раз является такой центральной структурой данных, вокруг которой "скачут" "зайчики-модули", ничего друг про друга не знающие).

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Четверг, 16 Апрель, 2020 17:41 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Peter Almazov писал(а):
Интересует наглядный пример, в котором "динамический" язык показывает яркое превосходство над языком со статической типизацией, вместе с его динамическими плюшками.

Совершенно другой вопрос. И полный ответ занял бы много времени.

Как пример в микро масштабе скриптовый-динамический язык даёт несомненное преимущество для около интерактивного взаимодействия. Например, недавно мне потребовалось раскидать по каталогам сваленные в одну кучу файлы, попутно удалив части имён, становящиеся лишними в упорядоченной системе.
Код:
ls
some_linux_file.sh other_tizen_data.sh one_android_suffix.sh two_windows_64.sh file_ios_script.sh # ещё много такого

В результате на вполне себе динамическом языке, с помощью которого я работаю с файловой системой и не только, я пишу код
Код:
for os in linux android windows tizen ios; do mkdir $os; for f in *_$os*.sh; do mv $f $os/${f/_$os}; done; done
# ну или так, чтобы было понятней
for os in linux android windows tizen ios
do
     mkdir $os
     for f in *_$os*.sh
     do
          mv $f $os/${f/_$os}
     done
done

И получаю такое
Код:
ls -R
.         : android  ios  linux  tizen  windows
./android : one_suffix.sh
./ios     : file_script.sh
./linux   : some_file.sh
./tizen   : other_data.sh
./windows : two_64.sh

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

В макромасштабе может оказаться полезной возможность перенастройки. К примеру, есть немного несовместимые между собой платформы DynamicBox 1.5, 1.6, 1.7. Приходит запрос обеспечить запуск на них 100-1000 модулей, которые работают поверх некой краснодарской сборки DynamicBox. Большинство модулей нам даже недоступны, только известны свойства нестандартной сборки. Создав полифил, возможно даже скромный по размеру, мы относительно легко решаем исходную задачу в динамической среде. Со статикой было бы сложней.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не могу найти дженерики
СообщениеДобавлено: Четверг, 16 Апрель, 2020 21:45 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Comdiv писал(а):
На стандартном статически типизированном языке я бы даже не стал думать в сторону создания программы.
Любопытно, что я для таких задач также не испытываю сомнений.
Только нормальный язык!
C#, в данном случае.

Как-то раз в такой ситуации мы полезли в powershell и vbs, потом долго плевались. С тех пор -- ни-ни.
Конечно, иметь один файл удобнее, чем два (.exe и исходный код), но это вопрос дисциплины.

Полифилы, кмк, к делу не имеют отношения.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 87 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB