29.05.2019, 12:50 | #1 |
Участник
|
ax3,ax4,ax2009,ax2012: Есть ли красивый способ передать packable объект между клиентом и сервером?
вопрос по ax3,ax4,ax2009,ax2012
предположим, у нас есть объект с правильно реализованным интерфейсом SysPackable (есть правильные pack/unpack) Сейчас, чтобы передать объект с клиента на сервер и обратно, приходится подпрыгивать с методами newOnServer, newOnClient, вручную проверять ObjectOnServer, вызывать pack/unpack и прочие некрасивости. Есть ли красивый способ передать packable объект между клиентом и сервером? |
|
29.05.2019, 15:59 | #2 |
Участник
|
Вынести подпрыгивания в свой статический метод?
X++: public static client SysPackable copyToServer(SysPackable _object) { return MyCoolClass::createOnSever(getClassID(_object), object.pack()) } private static server SysPackable createOnServer(ClassID _classID, container _packed) { SysPackable ret = new SysDictClass(_classID).makeObject(); if (!ret.unpack(_packed)) { throw error(Error:wrongUseOfFunction(funcname()); } return ret; } |
|
29.05.2019, 23:56 | #3 |
Участник
|
Цитата:
Сообщение от mazzy
предположим, у нас есть объект с правильно реализованным интерфейсом SysPackable (есть правильные pack/unpack)
Сейчас, чтобы передать объект с клиента на сервер и обратно, приходится подпрыгивать с методами newOnServer, newOnClient, вручную проверять ObjectOnServer, вызывать pack/unpack и прочие некрасивости. |
|
|
За это сообщение автора поблагодарили: trud (1). |
30.05.2019, 13:24 | #4 |
Участник
|
Что именно "все" уже реализовано в RunBase?
Как изменится ответ на исходный вопрос? |
|
04.06.2019, 16:05 | #5 |
Участник
|
Вот это вот всё:
Цитата:
Цитата:
Таким образом, ответ на исходный вопрос может кардинально отличаться в зависимости от того, о какой конкретной задаче исходно идет речь. Банально, потому что постановка задачив моем понимании очень отличается от постановки задачиЯ, к примеру, не понимаю сходу, зачем один и тот же packable объект передавать обратно с сервера на клиента, если это что-то, выходящее за рамки возможностей, уже реализованных в RunBase. Импортированный файл передать на сервер и потом обратно или что? И если надо все же передавать данные в обе стороны, то точно ли это будет один и тот же packable объект? Даже если речь про сферический packable объект в вакууме, и стоит задача разработки некоего универсального фреймворка для благодарных потомков, то и тогда не помешало бы озвучить сценарии использования, на которые фреймворк будет рассчитан. |
|
|
За это сообщение автора поблагодарили: Zabr (4), EVGL (4), sukhanchik (4), ax_mct (2). |
04.06.2019, 19:42 | #6 |
Участник
|
Цитата:
ответ? достал чаёк, щас буду наслаждаться профессиональным ответом по делу. Цитата:
Сообщение от gl00mie
Есть целый ряд людей, которые задают очень и очень общие вопросы или весьма "широко" формулируют задачу, имея в виду весьма конкретный частный случай. Этим любят заниматься и разработчики, и консультанты, и пользователи. Но когда начинаешь задавать уточняющие вопросы, часто оказывается, что их частный случай, который они имеют в виду, формулируя общую проблему, имеет с этой формулировкой не так уж много общего.
могу добавить, что существуют люди, которые задают вопросы, хотя сами знают ответы. вот гады, да? особенно удручает, когда они влазят на чистый и спокойный форум, на котором давно уже на все вопросы ответили. Банально постановкой вопроса, которая в понимании людей может отличаться и можно дать разные ответы. Цитата:
(шепотом заговорщика)расскажи где ты это увидел? (нормальным голосом) можно рассказать как передавать разные packable объекты а также можно рассказать о других способах а поговорить о красоте этих способов. при особом желании, можно поговорить не только о классических версиях аксапты, но и о современных, в которых остался только сервер, но вопрос сериализации объектов по прежнему актуален. шикарный вопрос. и каков может быть ответ на твой взгляд? Цитата:
Если у тебя есть несколько кардинально разных способов, то озвучь их. Есть ли красивый способ, работающий во всех случаях? И да, для старых версий можно использовать не только стандартный функционал, но и делать любые доработки. |
|
04.06.2019, 20:04 | #7 |
Banned
|
"The beauty is in the eye of the beholder"
Вы задали вопрос, на который принципиально нет удовлетворяющего всех ответа. Теория алгоритмов, к примеру, не оперирует понятиями красоты, а понятиями разрешимости и трудоемкости. Так что пафос неуместен. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
04.06.2019, 21:29 | #8 |
Banned
|
Цитата:
Сообщение от mazzy
вопрос по ax3,ax4,ax2009,ax2012
предположим, у нас есть объект с правильно реализованным интерфейсом SysPackable (есть правильные pack/unpack) Сейчас, чтобы передать объект с клиента на сервер и обратно, приходится подпрыгивать с методами newOnServer, newOnClient, вручную проверять ObjectOnServer, вызывать pack/unpack и прочие некрасивости. Есть ли красивый способ передать packable объект между клиентом и сервером? Здесь я не соглашусь с консультантами для которых это всего лишь побочное ремесло Красиво это xSysLastValue::saveLast(this) и xSysLastValue::getLast(). Страшная такая но суровая красота |
|
04.06.2019, 22:09 | #9 |
Участник
|
Цитата:
2. Это может быть не тот же самый клиент (типа у нас чатик или алерты какие-нибудь) Если рассматривать связанные вопросы, мне нравится и одновременно не нравится как сделано в SysOperation framework - там можно разметить свойства класса атрибутами и они сохраняются по именам - при добавлении и удалении свойств надо меньше париться версионированием. Правда нет отдельного API чтобы использовать это поведение без контроллера - приходится создавать свой контроллер (хотя бы один на вообще все такие штуки) в него запихивать контракты а потом выпихивать. А он сам - уже packable. Красота́ — эстетическая (неутилитарная, непрактическая) категория, обозначающая совершенство, гармоничное сочетание аспектов объекта, при котором последний вызывает у наблюдателя эстетическое наслаждение. Красота является одной из важнейших категорий культуры. Противоположностью красоты является безобразие |
|
04.06.2019, 22:14 | #10 |
Участник
|
Возможно Маззи практикует Ax-буддизм и это коаны:
Ученик, получивший коан от мастера, пытается решить коан всеми возможными способами и «подключает» все больше и больше сил для решения логически неразрешимой проблемы. В результате, когда «отключаются» все пять чувств, ученик находится на стадии, которую в йоге именуют дхарана. В этом состоянии коан и ученик остаются один на один (плюс некоторое блуждание ума). Если ум ученика достаточно «зрелый», то однажды блуждания ума затихают и остается лишь коан. В этот момент коан и ученик — целое, ученик испытывает проблеск реальности, известный как просветление или сатори. Хлопок одной ладонью, клиентский код в пакетном задании, передача объекта туда где он уже есть (обратно на клиента). |
|
06.06.2019, 09:24 | #11 |
Участник
|
Цитата:
Цитата:
Всем, Меня искренне прикалывает, как вместо обсуждения технического вопроса, участники пытаются обсуждать автора вопроса. Повторюсь, что давным-давно этим страдали 1Сники. https://coub.com/view/1s5rp Цитата:
Но чтобы красиво использовать SaleLast c this, нужно переопределить четыре метода (или предоставить четыре параметра). SaveLast записывает данные в контейнер, следовательно никаких индексов по содержимому. А также ограничение на размер сохраняемых данных (сложности с передачей больших контейнеров). SaveLast записывает контейнер с данными как одно memo-поле, которое в SQL не пришей кобыле хвост. А можно записывать каждое значение контейнера как отдельную запись в SQL, все записи одного SaveLAst должны получить некий идентификатор сессии. Так можно получить поиск по содержимому. это что касается SaveLast. Возвращаясь к теме передачи объекта между клиентом и сервером... Как уже упоминал некий ax_mct ранее, можно записывать данные в отдельную таблицу. Можно ли запись в отдельную таблицу сделать более элегантной, нежели четыре метода для SaveLast? Можно разбивать packable контейнер на куски. Чтобы обойти ограничение на размер и уменьшить относительные накладные расходы на обслуживание клиент-серверного пакета. Можно пообсуждать за минимизацию относительного оверхеда. Я удивлен, но не увидел обсуждения стандартных классов по передаче файлов между клиентом и сервером SysFileDeploy, AifWebReferenceUtil (второй умеет как с клиента на сервер, так и с сервера на клиент). Отлично понимаю, что способ передачи файла - не идеал. Но красоту поискать можно. Можно и посравнивать с другими способами. как способ взаимодействия между клиентАМИ и серверАМИ можно рассмотреть запись в AOT\resource. Но если честно, то я скорее ожидал увидеть развитие темы в сторону клиентских и серверных кэшей. И ограничения этих способов. может еще есть какие способы? а какой из них самый красивый? в том смысле, что нравится вам? ================= А да, и mazzy обсуждать тоже можно, и о том что runbase уже есть, как и о принципиально-философской неразрешимости данного технического вопроса. Это прикольно. |
|
06.06.2019, 09:37 | #12 |
Участник
|
|
|
06.06.2019, 10:08 | #13 |
Участник
|
почему вы считаете, что он меня не устраивает?
|
|
06.06.2019, 10:39 | #14 |
Участник
|
Если устраивает то и вопроса по сути нет. Работайте с ним он есть во всех версиях и стандартен.
Последний раз редактировалось axm2017; 06.06.2019 в 10:43. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
06.06.2019, 10:45 | #15 |
Участник
|
Цитата:
Для тех, кто знает, что передача объекта между клиентом и сервером может быть вне "сценария" пользователь запустил некую обработку и понимает различие между использованием понятия и самим понятием, повторю вопрос: Цитата:
Сообщение от mazzy
вопрос по ax3,ax4,ax2009,ax2012
предположим, у нас есть объект с правильно реализованным интерфейсом SysPackable (есть правильные pack/unpack) Сейчас, чтобы передать объект с клиента на сервер и обратно, приходится подпрыгивать с методами newOnServer, newOnClient, вручную проверять ObjectOnServer, вызывать pack/unpack и прочие некрасивости. Есть ли красивый способ передать packable объект между клиентом и сервером? |
|
06.06.2019, 20:57 | #16 |
Участник
|
Цитата:
Цитата:
Сообщение от mazzy
SaveLast записывает данные в контейнер, следовательно никаких индексов по содержимому. А также ограничение на размер сохраняемых данных (сложности с передачей больших контейнеров).
SaveLast записывает контейнер с данными как одно memo-поле, которое в SQL не пришей кобыле хвост. А можно записывать каждое значение контейнера как отдельную запись в SQL, все записи одного SaveLAst должны получить некий идентификатор сессии. Так можно получить поиск по содержимому. Цитата:
- Слушай, ты разработчик. Ответь, почему разработчики всегда неправильно оценивают время на создание программ?
- Представь что тебе надо разгрузить машину, сколько времени это займет? - Пару часов - Это камаз - 8 часов - Камаз, груженый песком - 12 часов - У тебя нет лопаты и инструментов, только твои руки - 2 дня - На улице -40 - 4 дня - Камаз вообще под водой - Так же нечестно, ты постоянно придумываешь новые условия! К чему ты мне вообще все это рассказываешь? Вы, разработчики, вечно всякую фигню рассказываете! Вместо этого могли бы просто оценить правильное время на разработку. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Каким бы превосходным C++ кодировщиком ни был человек без опыта в API, он знает только около 10% того, что он должен использовать каждый день для написания кода запускаемого на API. Когда дела в экономике идут хорошо, это не имеет значения. Вы все еще имеете работу и наниматели платят стоимость вашего обучения соответствующей платформе. Но когда в экономике царит неразбериха и 600 человек подают заявления на каждую открытую вакансию, наниматели могут позволить себе удовольствие выбирать программистов которые уже эксперты в интересующей их области. Например, программистов, которые могут назвать четыре способа заслать файл по FPT из кода на Visual Basic и слабые и сильные стороны каждого из них.
|
|
07.06.2019, 08:37 | #17 |
Участник
|
Цитата:
совершенно верно, в исходной формулировке не было. Цитата:
раз уж все равно передавать надо между клиентом и сервером, то может лучше передавать не идентификатор, а сам объект? Цитата:
Цитата:
мой исходный вопрос повторить? Цитата:
Сообщение от gl00mie
У меня лично был весьма негативный опыт его использования
Цитата:
Цитата:
Цитата:
майкрософту бы в уши. Цитата:
Сообщение от gl00mie
Т.е. в одном случае предлагается резать контейнер на части, чтобы обойти ограничение на размер пакета в ax4/ax2009/ax2012, а в другом случае предлагается просто закрыть глазки ладошками и представить, что этих ограничений нет? Пускай, мол, среда времени выполнения абстрагирует нас на вставке в кэш на другой стороне от того, что есть какие-то там RPC и какие-то там maxbuffersize в настройках...
я не предлагаю способы к реалзации. я предлагаю рассмотреть различные способы и обсудить плюсы-минусы-красоту. исходный вопрос повторить? а вот это совершенно в точку. у меня нет проблем с решением практических задач. мне хотелось бы обсудить, услышать что думаю другие по данной теме, возможно, узнать что-то новое. собственно для этого публичный форум и нужен Цитата:
Сообщение от gl00mie
идет составление опросника для собеседования. Как там у Джоэла Спольски?
|
|
07.06.2019, 08:43 | #18 |
Участник
|
Цитата:
Упоминание "правильно реализованным интерфейсом SysPackable" не означает, что использовать для передачи нужно именно его. Это упоминание означает, что проблемы с циклическими ссылками в объекте либо отсутствуют, либо как-то решены. Именно эта проблема является ключевой для задач сериализации. сериализовать объект для передачи можно и другим способом. в данной ветке хотелось бы обсудить передачу объектов, которые в принципе могут быть сериализованы. |
|
07.06.2019, 20:26 | #19 |
Участник
|
Есть еще статический метод create. Если его реалзовать, то можно класть объекты в стандартные коллекции и паковать и распаковывать их (т.е. не надо будет передавать явно идентификатор класса, как я сделал в первом своем сообщении в этой ветке).
|
|
|
За это сообщение автора поблагодарили: S.Kuskov (5). |
09.06.2019, 07:40 | #20 |
Участник
|
Цитата:
1. есть в стандартных коллекциях map, list, set 2. есть хлипкое соглашение, что если реализовать статический метод, который принимает контейнер, то он должен действовать как create в стандартных коллекциях. 3. соглашение является хлипким, поскольку даже классы sys слоя нарушают это соглашение да, я видел твое первое сообщение. да, ничего на него не ответил, поскольку еще в исходном написал: Цитата:
|
|
|
|