Pull to refresh

Comments 7

Мне очень ограниченной показалась работа с моделями. По сути, это тоненькие классы, которые делают кучу работы, но никакую из этих частей не делают полностью. Укажу, что бросилось в глаза:
1) Нет геттеров/сеттеров
2) Не можем создать пустой экземпляр
3) Нет состояний модели (isNew, isDeleted, isModified)
4) Нет понятия коллекции
5) Нет связей между моделями
6) Статические методы get_all или find_by_pk не должны реализовываться в самой модели
7) Методы save/delete, насколько я понял, надо в каждой модели реализовывать самому.
8) Модель должна сама уметь делать запросы к БД, а не пользоваться реализацией абстрактного DataProvider-а
Писал в два часа ночи, если что-то не так понял — извините.
Спасибо за комментарий

В статье описывается базовый класс для моделей. Для моделей, хранящихся в БД, есть специальный класс ActiveRecord, для которого несправедливы ваши пункты 3, 5, 7, 8 Для ActiveRecord статья еще готовится, поэтому примерно посмотреть что это можно только в неполной документации к нему

По поводу геттеров сеттеров: для атрибутов можно легко их задать таким образом:
model._.attr_name.get = function( descriptor ){}
подробнее описано здесь AutodafePart._ А чаще всего атрибутам достаточно фильтров, которые записываются в их описании (об этом написано в статье)

Понятия коллекций пока действительно нет.

Поясните, пожалуйста, что мешает создать пустой экземпляр?
Если мы захотим отвязаться от АР нам придется отказаться от состояний (на самом деле, это именно состояния модели, никак не связанные с конкретной реализацией хранилища), нам придется описывать в абстрактной модели реализацию CRUD. И еще много чего — по ощущению, модели очень завязаны на АР, а хочется наоборот. Про пустой класс: хочется что-то вроде
var u = new User();
u.setName(«vasya»).setAge(14);
if (smth) u.setLastname(«pupkin»);
u.save();
А не пихать хэш в конструктор, который будет не очень удобно собираться. Если хотите, могу показать реализацию М одного очень грамотного парня, которую мы сейчас используем. Но уже завтра.
Пожалуй Вы правы, из АР в модель надо вытащить некоторые вещи. Спасибо за свежий взгляд.

Аналог на Autodafe про Ваш пустой класс:
var u = new this.models.user;
u.name = «Vasiliy»;
u.age = 14;
if (smth) u.lastname = «Pupkin»;
u.save();

Посмотреть модели грамотных парней всегда хорошо, так что конечно поделитесь, если можете.
github.com/maxmaximov/wader/blob/master/AModel.js
Тут у него не самая свежая версия — чуть позже выйдут в паблик некоторые крутые штуки. Правда, этот фреймворк клиентский и отчасти завязан на jQuery (но не сильно критично, я именно о внутренностях), и вот там как раз используется DataProvider, реализующий CRUD-интерфейс и легко поддающийся смене хранилища данных и тестированию (легко подменить mock-экземпляром).
И да, я всё-таки за сеттеры/геттеры, а не «сырые» свойства объекта — программисту видно интерфейс, который предоставляет объект, он заметит опечатку + в сеттеры можно сунуть превалидацию какую-то.
Спасибо за код.

Там не просто свойства, а как раз гетткры и сеттеры, которые выглядят как задание свойств. Реализуются при помощи родного Object.defineProperty

Задать сеттер на лету можно вот так:
user._.name.set = function(value, descriptor){ descriptor.value = do_something_with( value ); }

и использовать соответственно просто как свойство:
user.name = 'Vasya';

Ну или можно в самом классе переопределить метод set_attribute и задавать атрибуты вобще как душе угодно, при этом использоваться они все равно будут как свойства.
Ну у того проекта выше и преимущество и недостаток в том, что он может быть и клиентским (пока под сервер-сайд не затачивался, но сделать это будет просто), поэтому там не получается нативные геттеры/сеттеры использовать
Sign up to leave a comment.

Articles