Perché la funzionalità ORM persist () usa i riferimenti per popolare insert_id e non restituisce?

1

Capisco come funziona ORM persist :

//ORM "persist" oversimplification
function persist(&$entity)
{
    ...
    $insertId = api_actual_db_insert(...);
    $entity->setId($insertId);
}

//usage of ORM later ...
$this->getEntityManager()->persist($entity);
print $entity->getId();  //prints ID of newly inserted record

Ma perché no ...

function persist($entity)
{
    ...
    $insertId = api_actual_db_insert(...);
    return $insertId;
}

//later ...
$insertId = $this->getEntityManager()->persist($entity);
$entity->setId($insertId);
print $entity->getId();

Entrambe le modalità funzionano. Il mio problema è con "riferimenti". Posso forse vedere un po 'il perché e qual'è il motivo dietro il quale gli ORM funzionano in questo modo, ma la mia domanda deriva dallo scrivere la mia funzionalità specifica di dominio che ho deciso di imitare dopo i concetti di ORM e sto avendo "problemi" "con l'utilizzo di riferimenti. Questioni non tecniche ma questioni di scienze morali e informatiche, per quanto riguarda il ragionamento e le motivazioni per utilizzarle in questo contesto.

Per essere precisi, esaminando il codice di Doctrine (la mia scelta di ORM), non ho visto un riferimento esplicito di Entity passato, quindi la meccanica di un ORM può usare qualche altra tecnica diversa. La mia domanda rimarrà comunque indipendentemente dal metodo. Quello che mi interessa è che Entity è popolato con insert_id , e insert_id non viene restituito esplicitamente.

Il mio codice

Ho un concetto di Selection oggetto che contiene un sacco di cose. Forse più tardi potrebbe diventare un vero Entity , ma al momento non lo è (un sacco di lavoro di refactoring da fare prima che sia pronto), quindi devo gestirlo manualmente, senza il supporto ORM. Ho scritto la mia funzione persist che è simile e la mia domanda è fondamentalmente ciò che ho già detto sopra. Posso capire perché un ORM funziona in questo modo ma non capisco se dovrei implementare il mio storage allo stesso modo o meno .

Domanda

Per essere espliciti ... c'è qualche motivo particolare o particolare per cui un ORM userebbe questa tecnica specifica di popolamento di Entity con insert_id senza un'istruzione esplicita return , opposta a restituire insert_id esplicitamente tramite return dichiarazione al chiamante? Se scelgo di restituire insert_id esplicitamente, cosa mancherò / spezzerò?

    
posta Dennis 25.05.2016 - 22:04
fonte

1 risposta

1

Stai affrontando le sfide inerenti a un ORM. Gli ORM sono per definizione astrazioni che perdono. Martin Fowler ha un eccellente articolo che affronta le tue "questioni morali e informatiche". link

La verità è che gli ORM sono un dolore e non si sentono mai giusti, specialmente per i puristi. Questo perché semplicemente non sono puri. Per definizione, non sono una pura astrazione (persistente / sincronizzazione dei dati in un archivio esterno), ma un dettaglio di implementazione (in particolare, persistente / sincronizzazione dei dati in qualche archivio di dati relazionale ).

Per quanto riguarda la tua preoccupazione "se dovessi implementare il mio storage allo stesso modo o no", Il punto di base di Fowler è che a un certo punto, per programmare bene un database, è necessario rendersi conto che il database relazionale è in realtà parte del dominio e quindi deve riflettersi nel modello di dominio. Prima riuscirai a fare i conti con questo concetto, prima avrò un senso.

Con tutto ciò detto, è semplicemente più codice da scrivere:

id = perist(entity);
entity.id = id;
print entity.id;

che scrivere

persist(entity);
print entity.id;

E il secondo è più chiaro e più leggibile. Se c'è qualcosa che ti manca sarà la chiarezza.

    
risposta data 26.05.2016 - 12:34
fonte

Leggi altre domande sui tag