App Engine - почему существуют классы PhoneNumber, Link, Rating и т.д.?

Я не нашел причин для существования нескольких классов App Engine. Там есть PhoneNumber, Link, PostalAddress, GeoPt, Рейтинг и т.д. Почему эти специальные обращения? У них, похоже, нет никаких умений - например. гео-поиск. Я знаю, что Link имеет больше места, чем свойство String, но остальное?

См: http://code.google.com/appengine/docs/java/datastore/dataclasses.html

Ответ 1

Эти типы являются "семантическими" типами. Они присутствуют в Java API для контроля четности с API Python. В API Python они определяют особое поведение в отношении метода .to_xml() - например, PhoneNumberProperty сериализуется следующим образом:

<property name="foo" type="gd:phonenumber"><gd:phoneNumber>12345-678</gd:phoneNumber></property>

Ответ 2

Я думаю, что они в основном просто предназначены для покрытия распространенных случаев и экономят время разработчиков. Если в большом количестве приложений используется поле номера телефона, зачем требуется, чтобы каждый разработчик писал их? Разработчик все еще может написать свои собственные, если им нужно/нужно.

Ответ 3

Не уверен в java, но в python следующая модель/код (протестированная на dev-сервере) выкинет BadValueError с сообщением "Invalid URL: stackoverflow.com"

class foo(db.model):
    link = db.LinkProperty()

bar = foo()
bar.link = 'stackoverflow.com'

В то время как:

bar.link = 'http://stackoverflow.com'

Прекрасно работает.

Я не тестировал, но другие свойства могут или не могут также выполнять валидацию.

Ответ 4

В основном использование этих типов в ваших моделях позволяет добавлять косвенные метаданные в ваш код. Это может быть полезно, если вы работаете с любым универсальным рендерером для своих классов моделей или если вы выполняете проверку ввода пользователя на своих моделях.

Например, если вы используете тип PhoneNumber для поля с именем userNumber, ваш рендеринг, основанный на отражении, может понять, что он должен автоматически назначать соответствующий валидатор текстовому полю, которое будет его представлять.

С уважением, Павел.