In un precedente post del blog, vi abbiamo introdotto nel mondo delle classi del modello di dati ORDA. Ora è arrivato il momento di sporcarci le mani e di saperne di più!
Sapete già che la struttura di ORDA(datastore, classe di dati, entità, selezione di entità) è costituita da oggetti. Ma non si tratta di semplici oggetti, bensì di oggetti fortemente tipizzati, collegati a specifiche classi di ORDA. Ciò significa che è possibile scrivere funzioni per nascondere la complessità dell’implementazione fisica dei dati.
È quindi molto più facile esporre il database come API, soprattutto se si espone il database come server REST. Questo aiuta anche a evitare problemi, come quando si deve modificare un pezzo di codice scritto anni fa o scritto da qualcun altro. Nascondere la complessità riduce gli errori e accelera il processo di sviluppo!
HDI: Esempi di utilizzo delle classi ORDA
panoramica delle nuove classi ORDA
Le classi ORDA sono automaticamente disponibili con i progetti, vediamo un esempio. Ecco un semplice database (chiamato LearningSystem) contenente una tabella Students tabella.
Possiamo verificare che 4D ha creato automaticamente le seguenti classi:
- Archivio dati
- Students (classe DataClass)
- StudentsEntity (classe Entity)
- StudentsSelection (classe EntitySelection)
Per riassumere, in un database locale sono presenti:
- Una singola classe datastore
E ogni tabella ha:
- Una classe dataclass (in questo esempio: Students)
- Una classe entità (in questo esempio: StudentsEntity)
- Una classe di selezione delle entità (in questo esempio: StudentsSelection)
Ogni oggetto ORDA(datastore, classe di dati, entità, selezione di entità) è un’istanza della corrispondente classe del modello di dati e può richiamare qualsiasi funzione definita nella classe.
All’interno di una funzione, This designa l’istanza dell’oggetto ORDA.
Vediamo un esempio concreto. Ecco il modello di dati che utilizzeremo:
la classe datastore
Questa classe viene utilizzata per implementare le funzioni relative al datastore.
Di seguito è riportata l’implementazione della classe DataStore.
Abbiamo una funzione getDescription() che restituisce informazioni generali sul datastore.
Class extends DataStoreImplementation
.
Function getDescription
C_TEXT( ) :="Sistema di apprendimento che copre "+ ( . . . )+" studenti"$0
$0StringThisStudentsall()length
Ecco il codice che richiama la funzione:
C_TEXT($dbName)
$dbName :=ds.getDescription() // $dbName is "Learning system covering 200 students"
Poiché l’oggetto datastore restituito dal comando ds è un’istanza della classe DataStore, possiamo usarlo per chiamare la funzione getName().
la classe dataclass
Questa classe viene utilizzata per implementare le funzioni relative alla classe di dati.
Di seguito è riportata l’implementazione della classe Schools. Abbiamo una funzione registerStudent() per creare un nuovo studente in una scuola.
La funzione riceve i dati di uno studente in un oggetto e controlla se il livello di inglese dello studente soddisfa il livello minimo richiesto dalla scuola. Se tutto è a posto, la funzione crea e salva l’entità Studente.
Non è necessario preoccuparsi dell’implementazione del modello di dati,basta costruire l’oggetto e chiamare la funzione.
Class extends DataClass
Function registerStudent
C_OBJECT($1;$data;$student;$school;$result;$0)
$data :=$1
$school :=ds.Schools.query("nome = :1";$data.schoolName).first()
$result:=New object("successo";True)
If ($data.englishLevel < $school.minAcceptedEnglishLevel)
$result .success:=False
$result .statusText:="Il livello di inglese non è abbastanza alto"
$0 :=$result
End if
If ($result.success)
$student :=ds.Students.new()
$student .fromObject($data)
$student .school:=$school
$result :=$student.save()
$0 :=$student
End if
Ecco il codice che richiama la funzione:
Form.result:=ds.Schools.registerStudent(Form.data)
//Form.data is
// {"englishLevel":4,"firstname":"Mary","lastname":"Smith","schoolName":"Math school"}
Poiché l’oggetto dataclass ds.Schools è un’istanza della classe Scuole, possiamo usarlo per chiamare la funzione registerStudent().
la classe entità
Questa classe viene utilizzata per implementare funzioni relative a un’entità.
Di seguito è riportata l’implementazione della classe StudentsEntity.
Abbiamo una funzione getFirstAhead() che restituisce gli studenti che hanno una classifica migliore dello studente corrente.
Class extends Entity
Function getFirstAhead
C_OBJECT($0;$ahead)
C_LONGINT ($1;$sliceSize)
$sliceSize :=$1
//Get the $sliceSize Students having a better rank
$ahead :=This.getDataClass().query("rank < :1";This.rank).orderBy("rank desc")
$0 :=$ahead.slice(0;$sliceSize)
Ecco il codice che richiama la funzione:
C_OBJECT($student;$ahead)
$student :=ds.Students.query("lastname= :1"; "Smith").first()
$ahead :=$student.getFirstAhead(3)
//$ahead is an entity selection (Students) containing the three Students ahead the student Smith
Poiché l’oggetto entità $student è un’istanza della classe StudentsEntity, possiamo usarlo per chiamare la funzione getFirstAhead().
Si noti che la classe StudentsEntity estende la classe Entity, che contiene tutti i metodi membri disponibili per un oggetto entità(ad esempio , getDataClass(), ecc.). Pertanto, questi metodi membri possono essere richiamati con This nella funzione.
la classe di selezione delle entità
Questa classe viene utilizzata per implementare le funzioni relative alla selezione di un’entità.
Di seguito è riportata l’implementazione della classe StudentsSelection.
Abbiamo una funzione setFinalExam() che aggiorna una selezione di entità di studenti. L’attributo finalExam è impostato sul valore indicato.
Class extends EntitySelection
Function setFinalExam
C_TEXT($1;$value)
C_OBJECT($0;$status;$student)
$value :=$1
For each ($student;This) Until (Not($status.success))
$student.finalExam:=$value
$status :=$student.save()
End for each
$0 :=$status
Ed ecco il codice che richiama la funzione:
C_OBJECT($result)
)
$result :=ds.Students.all().setFinalExam("Passato"
// All the students have their finalExam attribute set to "Passed"
Poiché l’oggetto di selezione dell’entità ds.Students.all() è un’istanza della classe StudentsSelection, possiamo usarlo per chiamare la funzione setFinalExam().
E il resto del server?
Prossimamente verrà pubblicato un altro post sul blog per spiegare come chiamare le funzioni delle classi ORDA nelle richieste REST. Restate sintonizzati!
Nel frattempo, scaricate l’HDI per iniziare a scoprire le nuove classi ORDA e consultate la documentazione per maggiori dettagli!