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

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

А может не надо превращать хабр в непонятно что.

Вы так уверены, что обрывки кода, написанные на экзотическом на данный момент языке и для весьма узкой и специфичной задачи кому то интересны?

А вы уверены, что заходить в пост, под не интересующим вас тегом разумная идея?

Экзотический язык? Вы серьёзно? Давно на сайте embarcadero были?

Когда эти грёбаные кассы научат общаться по json? Что проще - отправить строки с позициями, ценами и количеством?

Давно научились. uses REST.Json;
var ZXReport := TJSON.JsonToObject<TZXReport>(JSON); одна строка заменяет пелену перечисления и парсинга полей

Я о том, чтобы это нативно поддерживалось, и любое ПО могло отправить этот json кассе-серверу.

Прочитал слово "кассы" как "классы". Мой косяк)

ааа!!!
0. const в параметрах придумали не зря...
1. длинный неразделяемый код.
2. JSON умеет по другому!
2.1. JSON умеет сразу с типизацией GetValue<double>('') без StrToFloat, а сколько копий сломано о дробном разделителе я молчу...
2.2. JSON умеет JPath: не надо StrToFloat(TJSONObject(json_data.GetValue('EndNonNullable')).GetValue('Sell').Value);
делай так: GetValue<double>('EndNonNullable.Sell')
3. as ЗЛО!!!! как и free неинициализированных переменных
для парсинга JSON обычно достаточно типов TJSONValue (GetValue<double>, GetValue<TJSONArray>) и TJSONArray
4. Delphi славится своей RTTI - ни капли рефлексии не увидел, хотя подобный парсинг легко ложится в RTTI маршализацию
5. проверка наличия объекта с поиском по имени, и потом его повторный поиск для использования - да кто эти такты считает!
if (json_response.GetValue('Data') <> nil) then begin json_data := (json_response.GetValue('Data') as TJSONObject);

Добавлю ещё, что я как минимум в одном месте вижу, что не освобождается объект json.
Функция Check, переменная json_obj. И в целом код не очень хороший. Вы многие проблемы описали, но очевидно их ещё больше, но вникать не очень хочется.
- Ошибки в ShowMessage - тоже не лучшая идея.
- Список Sell в классе TZXReport создается извне, а не в конструкторе, при чем ещё и не типизированный (вероятно ТС вообще не умеет работать с дженериками).
- Парсинг json_response := (TJSONObject.ParseJSONValue(response) as TJSONObject);
Вообще может привести к прямой ошибке, т.к. парсинг пустого ответа вернёт nil, а "as" добьёт.
Здесь должно быть
json_response := TJSONObject.ParseJSONValue(response);
if Assigned(json_response) then
try
// а приводить json_response к TJSONObject не имеет смысла
finally
json_response.Free;
end;
Проверять полученное значение через GetValue тоже не обязательно, есть TryGetValue, что более удобно и наглядно.

Код можно сократить и упростить в 2, 3 или даже 4 раза.

Ещё, я бы использовал не Indy клиент, а System.Net.HttpClient или вообще сразу RESTClient

Господа, несколько оффтоп, но не посоветуете - где можно обзорно хотя бы почитать про все возможности Delphi?

Поясню. Я не программист по специальности, но по работе мне постоянно приходится решать задачи разного уровня сложности через программирование (от работы с видео до работы с REST API видеосерверов). На паскале сижу уже больше 30 лет (от турбо паскаля через все версии Delphi). И очень часто просматривая свой же код двух-трёх летней давности я с огорчением обнаруживаю, что там я изобрёл очередной велосипед, который штатно решается средствами самого Delphi.

То есть мне не нужно детальное описание всего - мне нужно иметь понимание в общих чертах - если мне понадобятся детали реализации нужного - дальше я уже нагуглю.

Как всегда - у владельца языка самая полная информация. Другой вопрос, что она там не очень удобно подается и не вся. Приходится лазить по всяким блогам и влогам :)

Не очень удобно - это очень мягко сказано. Нет общей системы. Нет обзора фич.

Ну вот, пример. Я много лет постоянно использую TList и TThreadList. И всё время удивлялся - почему нельзя сразу указать тип объектов, хранящихся в листе, чтобы потом при каждом обращении не указывать тип объекта. И лишь где-то год назад совершенно случайно нашёл, что оказывается есть collections, в котором можно писать TList<TObjectType>. Причём из хелпа на TList нет никаких указаний на такую возможность - то есть должен просто знать. И я подозреваю, что подобных велосипедов я изобретаю ещё множество - просто по незнанию. Изучать полный справочник по языку - ну то ещё занятие. Вот было бы где-то что-то обзорное, без деталей....

Я уже 8 лет работаю с Делфи и до сих пор встречаю как в языке, так и в стандартной библиотеке или среде что-то, что ещё не использовал.
Многое нахожу сам, когда пытаюсь реализовать что-то и копаюсь в библиотеке. Например, многие приемы и вещи можно подсмотреть у самих разработчиков, ведь их код библиотек доступен сразу в среде. Как они сделали вот это, а как то и т.д.
Если нужно, пишу в чаты в ТГ, там и происходит обмен опытом.
Справкой или же онлайн wiki пользуюсь уже тогда, когда сам предмет известен и нужно почитать подробнее как он работает.
Например, совсем недавно узнал о том, что в Делфи есть кроссплатформенная система сообщений System.Messaging, которая позволяет подписываться на сообщения, в которых могут приходить объекты и прочая информация. К сожалению, она не потокобезопасна пока.

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

Да, последнее время очень много добавлено в RTL.
Например,
System.Hash
- THashMD5
- THashSHA1
- THashSHA2
System.JSON
- работа с JSON (в том числе инструменты форматирования)
System.Diagnostics
- TStopwatch
System.IOUtils
- TFile - работа с файлами (быстро прочитать/записать, найти, переименовать и т.д.)
- TPath - работа с путями (системные пути, модификация путей и т.д.)
- TDirectory - работа с папками (получение, поиск, модификация и т.д.)
REST.Json
- Сериализация/десериализация объектов в json (очень полезная вещь)
System.NetEncoding
- Base64
- Работа с URI
System.Threading
- Таски, пулы, очереди, асинхронное исполнение и т.д.
System.Zip
- Тут понятно, работа с архивом zip
System.RegularExpressions
- Работа с регулярками, при чем с упрощенным доступом
System.SyncObjs

- Мьютексы, семафоры, локи, мониторы, критические секции
System.Net
- Нативный HTTP клиент, кроссплатформенный, качественно работающий
- Другие клиенты и сетевые протоколы (ftp, socket и т.д.)

И ещё много всякого

Помимо этого, в самой среде много инструментов, которыми не пользуются люди:

  • Инструменты рефакторинга

  • Ctrl + Shift + C - автозавершение класса

  • Ctrl + Shift + A - поиск модуля для выделенного типа и его автоматическое добавление

и т.д.

Рекомендую Marco Cantu - Object Pascal Handbook. Современная (2020 г.), обзорная (начинает с самых основ) книга с примерами (есть гитхаб).

Если хочется чего-то более глубокого, то есть сборник разнородных рецептов Daniele Teti - Delphi Cookbook, есть гайд по паттернам и параллельности Nick Hodges - More Coding In Delphi. Есть еще целая серия книг от Dalija Prasnikar.

По многопоточному программированию есть хорошая бесплатная книга на русском - https://github.com/loginov-dmitry/multithread.

Также рекомендую полностью прочитать блог GunSmoker'а - очень полезно.

Спасибо огромное

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

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

Публикации

Изменить настройки темы

Истории