Evita la ripetizione del codice nelle operazioni CRUD

2

Sto sviluppando un'applicazione PHP e mi trovo a fare praticamente lo stesso codice per, ad esempio, creare un oggetto basato su un modulo compilato dall'utente.

Gli oggetti sono di classi diverse, ma il processo è per lo più lo stesso: prendi i dati dal modulo, applica la convalida, salva / restituisci l'errore.

C'è un modo per automatizzare questo processo? Chiedo anche perché intendo scrivere un'API pubblica e utilizzare lo stesso codice per eseguire tali operazioni, invece di limitarsi a copiare / incollare.

Ho pensato di creare una specie di modello Metodo di fabbrica che riceve il tipo e i dati dal modulo ( o qualsiasi array), creare un'istanza e impostare i dati, testando successivamente la convalida (ogni oggetto sa come convalidare i propri campi). E quello per ognuna delle altre operazioni CRUD.

È fattibile / buona pratica? Dovrei semplicemente ripetere il codice simile? Ci sono altri modi per farlo?

Per la cronaca, sto già usando ORM (Doctrine). Tuttavia, penso che un sacco di create funzioni con praticamente lo stesso codice (un mucchio di set* ) sia qualcosa di troppo ripetitivo.

    
posta George Marques 11.03.2014 - 03:20
fonte

1 risposta

7

Se non stai già utilizzando un ORM, probabilmente stai sbagliando, perché non stai sfruttando la leva che un ORM può fornire alla pratica della scrittura dei metodi CRUD.

Tuttavia, c'è un po 'di storia in tutto questo, quindi ora ti racconterò una breve storia della buonanotte.

All'inizio esistevano database SQL e la vita era buona. I siti Web erano piuttosto rari, e tutti andavano d'accordo scrivendo a mano il codice di accesso ai dati.

Poi sono arrivati i mammut woll.

No,nonquelmammutlanoso.

Questomammutlanoso.Databasecheracchiudonouninterodominioaziendale:

All'improvviso, il codice di accesso ai dati scritto a mano non lo ha più tagliato. Così abbiamo inventato i programmi di generazione di codice di ORM che producevano una classe per ogni tabella, completa di metodi CRUD. È un sacco di codice, ma non hai dovuto scriverlo, vero?

Grande storia, eh bro? Beh, non esattamente.

Vedi, qualcuno è arrivato e ha detto "Perché ho bisogno di conoscere la teoria dei database, quando potrei semplicemente scrivere le mie lezioni e poi farmi generare i miei tavoli da ORM?"

OK, ma ora dovrai scrivere tutte quelle lezioni a mano, vero?

Che ci porta alla domanda che hai posto, che essenzialmente è questa: perché non posso semplicemente scrivere una funzione che accetta un tipo T e restituisce un oggetto di tipo T, come questo?

public T Read(int id); // C#, for those of you so challenged.

Sigh. Beh, puoi, in realtà. Si chiama un deposito generico. Se vuoi scoprire come costruirne uno, puoi guardare qui . Inizia con qualcosa di simile:

public function select($table, $where = '', $fields = '*', $order = '', $limit = null, $offset = null)
{
    $query = 'SELECT ' . $fields . ' FROM ' . $table
           . (($where) ? ' WHERE ' . $where : '')
           . (($limit) ? ' LIMIT ' . $limit : '')
           . (($offset && $limit) ? ' OFFSET ' . $offset : '')
           . (($order) ? ' ORDER BY ' . $order : '');
    $this->query($query);
    return $this->countRows();
}

... e si basa su quell'umile inizio (e su altre funzioni per completare il CRUD) per creare un repository generico completo. Aggiungi un po 'di IoC e avrai qualcosa che qualsiasi Astronauta di Architettura considererebbe degno di portare nello spazio interstellare.

    
risposta data 11.03.2014 - 06:57
fonte

Leggi altre domande sui tag