2009-12-06 5 views
10

Ich habe keinen Grund für die Existenz einiger der App Engine-Klassen gefunden. Es gibt eine PhoneNumber, einen Link, eine PostalAddress, ein GeoPt, ein Rating, etc. Warum werden diese speziell behandelt? Sie scheinen keine Klugheit zu haben - z.B. Geo-Suche. Ich weiß, Link hat mehr Platz als eine String-Eigenschaft, aber der Rest?App Engine - warum gibt es PhoneNumber, Link, Rating usw.?

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

Antwort

7

Diese Typen sind 'semantische' Typen. Sie sind in der Java-API für die Parität mit der Python-API vorhanden. In der Python-API, sie spezielles Verhalten in Bezug auf die .to_xml() -Methode definieren - zum Beispiel serialisiert ein PhoneNumberProperty wie folgt aus:

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

Würden Sie sagen, dass die Verwendung von Vorteil ist? Müssen wir die Klassen in Abfragen importieren? –

+2

Ich würde mich nicht mit ihnen beschäftigen, persönlich. Abfragen verwenden die Klassen überhaupt nicht, soweit mir bekannt ist. –

+0

Großartig, danke. –

2

Ich denke, sie sind meist nur dort gemeinsame Fälle abzudecken und Entwicklern Zeit zu sparen. Wenn viele Apps ein Telefonnummernfeld verwenden, warum sollte jeder Entwickler sie schreiben müssen? Ein Entwickler kann immer noch seine eigenen schreiben, wenn sie es brauchen/wollen.

+0

Einverstanden, außer die Kosten scheint Junk zu der API mit sehr wenig Nutzen hinzugefügt werden. Wir brauchen keinen Telefon-Typ - String funktioniert einwandfrei und jetzt müssen wir den PhoneNumber aus der Telefonnummer rausholen. –

+0

Wirklich? Kann String die Unterschiede zwischen US- und UK-Telefonnummern ohne externen Code behandeln? Haftungsausschluss: Niemals benutzt Diese Klassen können also nicht sagen, ob sie es auch tun. – Macha

+1

Macha, leider nicht, was der springende Punkt ist. Sie sind nur Wrapper für Strings. – Domchi

1

Grundsätzlich ist dieser Typen in Ihre Modelle können mit hinzuzufügen indirekten Meta-Daten zu Ihrem Code. Dies kann nützlich sein, wenn Sie mit einem beliebigen universellen Renderer für Ihre Modellklassen arbeiten oder wenn Sie die Benutzereingabe für Ihre Modelle überprüfen.

Wenn Sie zum Beispiel PhoneNumber für ein Feld mit dem Namen userNumber verwenden, kann Ihr reflektionsbasierter Renderer verstehen, dass er dem Textfeld, das ihn darstellen soll, automatisch den entsprechenden Validator zuweisen sollte.

Grüße, Pavel.

2

Nicht sicher java, aber in Python das folgende Modell/Code (auf dev-Server getestet) wird BadValueError werfen, mit der Meldung "Ungültige URL: stackoverflow.com"

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

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

While:

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

Funktioniert gut.

Ich habe nicht getestet, aber die anderen Eigenschaften können oder auch nicht Validierung.

Verwandte Themen