Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Проблема readUsing/writeUsing #82

Open
konstantin-kalinin-wizn-tech opened this issue Sep 22, 2023 · 2 comments
Open

Проблема readUsing/writeUsing #82

konstantin-kalinin-wizn-tech opened this issue Sep 22, 2023 · 2 comments

Comments

@konstantin-kalinin-wizn-tech
Copy link
Collaborator

В оригинальном фреймворке опеределены методы readUsing/writeUsing в базовом классе, что делает его доступным для любой модели, включая произвольные объекты, например аналоги dict и list, не унаследованные от MAModel.

По факту имеется две реализации: первая, базовая, работает "через аксессор", т.е. при вызове данных методов модели, происходит доступ (чтение/запись) к значению с помощью аксессора, находящегося в переданном в метод дескрипторе.

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

В Smalltalk реализации чтение-запись сводится к вызову readUsing/writeUsing объекта модели, которая как раз различным образом реализуется в зависимости от модели (обычная - вызывается метод базового класса/адаптивная - переопределённый метод MAAdaptiveModel). Таким образом, доступ через аксессор не является универсальным.

В питон-реализации мы создали класс MAModel, реализующий readUsing/writeUsing по аксессору дескриптора, но у произвольных моделей, например dict(), нет таких методов readUsing/writeUsing.
Вместо этого сделан обёрточный вызов, MAModel.readUsingWrapper/MAModel.writeUsingWrapper, проверяющий наличие метода а данной переданной модели, вызывающий в первую очередь найденный метод, если есть, а если метода нет, то доступ будет сделан через аксессор дескриптора.

Возможно, стоит реализовать немного иначе, имеются такие идеи:

  • Реализовать доступ к MAAdaptiveModel через её Null аксессоры, тогда не будет нужно отдельное поведение для MAAdaptiveModel. Далее упростить за счёт этого стек вызовов read/write/readUsing/writeUsing.
  • Расширить "базовый объект" аналогично Smalltalk, если возможно.
  • Отказаться от методов readUsing/writeUsing у моделей (убрать их из api) и всегда пользоваться только wrapper-функциями.
@Assargadon
Copy link
Owner

Возможная альтернатива MAAdaptiveModel - это порождение классов по дескриптору с помощью type.

@Assargadon
Copy link
Owner

Расширение объектов возможно. Называется Monkey Patching. Строго говоря, таким образом можно патчить любые классы, не только системные.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants