App Engine - почему существуют классы PhoneNumber, Link, Rating и т. Д.?
Я не нашел никаких причин для существования нескольких классов App Engine. Есть PhoneNumber, ссылка, почтовый адрес, GeoPt, рейтинг и т. Д. Почему к ним применяется особый режим? Кажется, у них нет никаких умов - например, гео-поиск. Я знаю, что у Link больше места, чем у свойства String, но остальное?
См. http://code.google.com/appengine/docs/java/datastore/dataclasses.html
4 ответа
Эти типы являются "семантическими" типами. Они присутствуют в API Java для паритета с API Python. В Python API они определяют специальное поведение в отношении метода.to_xml() - например, PhoneNumberProperty сериализуется следующим образом:
<property name="foo" type="gd:phonenumber"><gd:phoneNumber>12345-678</gd:phoneNumber></property>
Я думаю, что они в основном только для того, чтобы покрыть общие случаи и сэкономить время разработчиков. Если во многих приложениях используется поле номера телефона, почему каждый разработчик должен написать их? Разработчик может по-прежнему писать свои собственные, если они хотят / хотят.
Не уверен насчет java, но в python следующая модель / код (протестированный на сервере dev) выдает BadValueError с сообщением "Неверный URL: stackru.com"
class foo(db.model):
link = db.LinkProperty()
bar = foo()
bar.link = 'stackru.com'
В то время как:
bar.link = 'http://stackru.com'
Работает отлично.
Я не проверял, но другие свойства могут или не могут также сделать проверку.
В основном использование этих типов в ваших моделях позволяет добавлять косвенные метаданные в ваш код. Это может быть полезно, если вы работаете с любым видом универсального рендерера для ваших классов моделей или если вы выполняете проверку пользовательского ввода в ваших моделях.
Например, если вы используете тип PhoneNumber для поля с именем userNumber, ваше средство рендеринга на основе отражений может понять, что оно должно автоматически назначить соответствующий валидатор текстовому полю, которое будет его представлять.
С уважением, Павел.