Classi ORDA per gestire il modello di dati

Tradotto automaticamente da Deepl

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:

blank

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!

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert è entrata a far parte del team 4D Product come Product Owner nel 2017. In qualità di Product Owner, è incaricata di scrivere le storie degli utenti e di tradurle in specifiche funzionali. Il suo ruolo è anche quello di assicurarsi che l'implementazione della funzionalità fornita soddisfi le esigenze del cliente.Marie-Sophie si è laureata presso la scuola di ingegneria ESIGELEC e ha iniziato la sua carriera come ingegnere presso IBM nel 1995. Ha partecipato a vari progetti (di manutenzione o di costruzione) e ha lavorato come sviluppatrice Cobol. In seguito ha lavorato come progettista UML e sviluppatore Java. Ultimamente i suoi ruoli principali erano l'analisi e la scrittura dei requisiti funzionali, il coordinamento dei team di business e di sviluppo.