2009-12-06 2 views
10

Non ho trovato alcuna ragione per l'esistenza di alcune delle classi di App Engine. C'è un numero di telefono, un link, un indirizzo postale, un GeoPt, un rating, ecc. Perché questi vengono sottoposti a un trattamento speciale? Non sembrano avere alcuna intelligenza - ad es. ricerca geografica. So che Link ha più spazio di una proprietà String, ma il resto?App Engine: perché ci sono classi PhoneNumber, Link, Rating etc?

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

risposta

7

Questi tipi sono tipi "semantici". Sono presenti nell'API Java per la parità con l'API Python. Nel API di Python, essi definiscono il comportamento speciale per quanto riguarda la .to_xml() il metodo - per esempio, un PhoneNumberProperty serializza come questo:

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

Diresti che c'è qualche vantaggio nell'uso? Dobbiamo importare le classi in query? –

+2

Non mi preoccuperei di loro, personalmente. Le query non utilizzano affatto le classi, per quanto ne so. –

+0

Ottimo, grazie. –

2

penso che siano per lo più solo lì per coprire i casi più comuni e risparmiare tempo agli sviluppatori. Se molte app utilizzano un campo numero di telefono, perché richiedere a ogni sviluppatore di doverle scrivere? Uno sviluppatore può ancora scrivere da solo se ha bisogno/vuole farlo.

+0

Concordato, tranne il costo sembra essere spazzatura aggiunto all'API con pochissimo vantaggio. Non abbiamo bisogno di un tipo di telefono - String funziona perfettamente e ora dobbiamo ottenereValore dal PhoneNumber. –

+0

Davvero? Stringa può gestire le differenze tra numeri di telefono statunitensi e britannici senza codice esterno? Disclaimer: Mai usato Quelle classi quindi non posso dire se lo fanno entrambi. – Macha

+1

Macha, sfortunatamente no, che è il punto. Sono solo involucri per archi. – Domchi

1

In sostanza utilizzando questo tipi nei modelli permette di aggiungere metadati indiretti alla tua codice. Questo può essere utile se stai lavorando con qualsiasi tipo di renderizzatore universale per le tue classi modello o se stai eseguendo la convalida dell'input dell'utente sui tuoi modelli.

Ad esempio, se si utilizza il tipo PhoneNumber per un campo denominato userNumber, il renderer basato su reflection può comprendere che esso deve assegnare automaticamente il validatore corrispondente al campo di testo che lo rappresenterà.

Cordiali saluti, Pavel.

2
Non

sicuro di Java, ma in python il seguente modello/codice (testato su server di dev) getteranno BadValueError, con il messaggio "URL non valido: stackoverflow.com"

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

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

Mentre:

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

Funziona bene.

Non ho provato, ma le altre proprietà possono o non possono anche fare convalida.