Комментарии 7
Мне очень ограниченной показалась работа с моделями. По сути, это тоненькие классы, которые делают кучу работы, но никакую из этих частей не делают полностью. Укажу, что бросилось в глаза:
1) Нет геттеров/сеттеров
2) Не можем создать пустой экземпляр
3) Нет состояний модели (isNew, isDeleted, isModified)
4) Нет понятия коллекции
5) Нет связей между моделями
6) Статические методы get_all или find_by_pk не должны реализовываться в самой модели
7) Методы save/delete, насколько я понял, надо в каждой модели реализовывать самому.
8) Модель должна сама уметь делать запросы к БД, а не пользоваться реализацией абстрактного DataProvider-а
Писал в два часа ночи, если что-то не так понял — извините.
1) Нет геттеров/сеттеров
2) Не можем создать пустой экземпляр
3) Нет состояний модели (isNew, isDeleted, isModified)
4) Нет понятия коллекции
5) Нет связей между моделями
6) Статические методы get_all или find_by_pk не должны реализовываться в самой модели
7) Методы save/delete, насколько я понял, надо в каждой модели реализовывать самому.
8) Модель должна сама уметь делать запросы к БД, а не пользоваться реализацией абстрактного DataProvider-а
Писал в два часа ночи, если что-то не так понял — извините.
+1
Спасибо за комментарий
В статье описывается базовый класс для моделей. Для моделей, хранящихся в БД, есть специальный класс ActiveRecord, для которого несправедливы ваши пункты 3, 5, 7, 8 Для ActiveRecord статья еще готовится, поэтому примерно посмотреть что это можно только в неполной документации к нему
По поводу геттеров сеттеров: для атрибутов можно легко их задать таким образом:
model._.attr_name.get = function( descriptor ){}
подробнее описано здесь AutodafePart._ А чаще всего атрибутам достаточно фильтров, которые записываются в их описании (об этом написано в статье)
Понятия коллекций пока действительно нет.
Поясните, пожалуйста, что мешает создать пустой экземпляр?
В статье описывается базовый класс для моделей. Для моделей, хранящихся в БД, есть специальный класс ActiveRecord, для которого несправедливы ваши пункты 3, 5, 7, 8 Для ActiveRecord статья еще готовится, поэтому примерно посмотреть что это можно только в неполной документации к нему
По поводу геттеров сеттеров: для атрибутов можно легко их задать таким образом:
model._.attr_name.get = function( descriptor ){}
подробнее описано здесь AutodafePart._ А чаще всего атрибутам достаточно фильтров, которые записываются в их описании (об этом написано в статье)
Понятия коллекций пока действительно нет.
Поясните, пожалуйста, что мешает создать пустой экземпляр?
0
Если мы захотим отвязаться от АР нам придется отказаться от состояний (на самом деле, это именно состояния модели, никак не связанные с конкретной реализацией хранилища), нам придется описывать в абстрактной модели реализацию CRUD. И еще много чего — по ощущению, модели очень завязаны на АР, а хочется наоборот. Про пустой класс: хочется что-то вроде
var u = new User();
u.setName(«vasya»).setAge(14);
if (smth) u.setLastname(«pupkin»);
u.save();
А не пихать хэш в конструктор, который будет не очень удобно собираться. Если хотите, могу показать реализацию М одного очень грамотного парня, которую мы сейчас используем. Но уже завтра.
var u = new User();
u.setName(«vasya»).setAge(14);
if (smth) u.setLastname(«pupkin»);
u.save();
А не пихать хэш в конструктор, который будет не очень удобно собираться. Если хотите, могу показать реализацию М одного очень грамотного парня, которую мы сейчас используем. Но уже завтра.
0
Пожалуй Вы правы, из АР в модель надо вытащить некоторые вещи. Спасибо за свежий взгляд.
Аналог на Autodafe про Ваш пустой класс:
var u = new this.models.user;
u.name = «Vasiliy»;
u.age = 14;
if (smth) u.lastname = «Pupkin»;
u.save();
Посмотреть модели грамотных парней всегда хорошо, так что конечно поделитесь, если можете.
Аналог на Autodafe про Ваш пустой класс:
var u = new this.models.user;
u.name = «Vasiliy»;
u.age = 14;
if (smth) u.lastname = «Pupkin»;
u.save();
Посмотреть модели грамотных парней всегда хорошо, так что конечно поделитесь, если можете.
0
github.com/maxmaximov/wader/blob/master/AModel.js
Тут у него не самая свежая версия — чуть позже выйдут в паблик некоторые крутые штуки. Правда, этот фреймворк клиентский и отчасти завязан на jQuery (но не сильно критично, я именно о внутренностях), и вот там как раз используется DataProvider, реализующий CRUD-интерфейс и легко поддающийся смене хранилища данных и тестированию (легко подменить mock-экземпляром).
И да, я всё-таки за сеттеры/геттеры, а не «сырые» свойства объекта — программисту видно интерфейс, который предоставляет объект, он заметит опечатку + в сеттеры можно сунуть превалидацию какую-то.
Тут у него не самая свежая версия — чуть позже выйдут в паблик некоторые крутые штуки. Правда, этот фреймворк клиентский и отчасти завязан на jQuery (но не сильно критично, я именно о внутренностях), и вот там как раз используется DataProvider, реализующий CRUD-интерфейс и легко поддающийся смене хранилища данных и тестированию (легко подменить mock-экземпляром).
И да, я всё-таки за сеттеры/геттеры, а не «сырые» свойства объекта — программисту видно интерфейс, который предоставляет объект, он заметит опечатку + в сеттеры можно сунуть превалидацию какую-то.
0
Спасибо за код.
Там не просто свойства, а как раз гетткры и сеттеры, которые выглядят как задание свойств. Реализуются при помощи родного Object.defineProperty
Задать сеттер на лету можно вот так:
user._.name.set = function(value, descriptor){ descriptor.value = do_something_with( value ); }
и использовать соответственно просто как свойство:
user.name = 'Vasya';
Ну или можно в самом классе переопределить метод set_attribute и задавать атрибуты вобще как душе угодно, при этом использоваться они все равно будут как свойства.
Там не просто свойства, а как раз гетткры и сеттеры, которые выглядят как задание свойств. Реализуются при помощи родного Object.defineProperty
Задать сеттер на лету можно вот так:
user._.name.set = function(value, descriptor){ descriptor.value = do_something_with( value ); }
и использовать соответственно просто как свойство:
user.name = 'Vasya';
Ну или можно в самом классе переопределить метод set_attribute и задавать атрибуты вобще как душе угодно, при этом использоваться они все равно будут как свойства.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Фреймворк Autodafe — работа с моделями