Progetto di strutturazione (refactoring) [closed]

0

Sto lavorando a un progetto che richiede da parte mia di creare una struttura di codice modulare ed estensibile. Questo codice dovrebbe essere in grado di supportare più client. La buona notizia è che il codice non dovrebbe fare nulla di spettacolare. Spiegherò questo più in dettaglio più avanti nella domanda.

Quindi ora ho circa 30 filiali per circa 60 clienti. Alcuni clienti avevano bisogno di un proprio ramo perché al momento era più semplice separare il proprio codice da tutti gli altri in modo che nel tempo diventassero 30 codici separati, che sono molto simili.

Quindi ora l'architettura non potrebbe essere più semplice. La richiesta proviene dal client in formato XML e quindi procedo a restituire XML. La parte del processo è principalmente CRUD. Nulla di bello. Ho due front controller uno per le azioni (INSERT, UPDATE, DELETE) e uno per le richieste (SELECT). Quindi quel controller anteriore include solo lo script richiesto dal cliente. Ogni richiesta e ogni azione ha il proprio script dedicato. Non ci sono una singola classe nel progetto. Tutto è scritto in modo procedurale.

Quindi nella nuova struttura dell'app l'obiettivo è avere un ramo principale che tutti i client utilizzeranno e sarà gestito da un file conf.

Ti sto dicendo tutto questo perché non sono sicuro di come strutturare tutto. Non ho molta esperienza con OOP. Conosco i concetti e la teoria ma è più difficile quando si tratta di codifica effettiva in quello stile.

La mia idea ora è. Sto lasciando due front controller per azione e richiesta perché non richiede alcun cambiamento dal lato client dell'applicazione e per ora è importante. Ora serviranno solo come ottenere la richiesta e ricambiarlo. Chiameranno anche ActionController e RequestController. Saranno un po 'più intelligenti. Sapranno riconoscere quali richieste / azioni client inviate e quindi faranno di nuovo oggetto di quella classe.

Ogni azione / richiesta ha alcuni passi che deve fare. Quindi penso che ogni classe abbia bisogno di un metodo pubblico "esegui" che chiamerà semplicemente il metodo di quella classe secondo l'ordine di cui ha bisogno, ma temo che, anche questo sia un modo di pensare procedurale, semplicemente non lo sarà punteggio globale ma in Classe.

$client_request = new $fullClassPath(new $mapperClassPath);
$response = $client_request->execute($request);

Inoltre Come gestire il Database, probabilmente dovrei fare azioni sul database il più astratto possibile.

Il file di configurazione sarà molto importante, quindi non so se è la soluzione per creare classi per ogni funzione e includere le classi se quel campo funzione è impostato su true nel file di configurazione?

Ogni azione ha una propria risposta al client e può essere un xml piuttosto pesante. Qual è la soluzione lì. Dovrei avere una classe di risposta che gestirà questo. Ho paura che la lezione sia abbastanza pesante perché ci sono circa 20 azioni e 5 richieste e ognuno ha una risposta xml diversa.

Quindi ogni aiuto è apprezzato con qualcuno che ha esperienza con progetti simili, anche alcuni link a buoni articoli non farebbero male.

Dovrei menzionare che il linguaggio con cui sto lavorando è vanilla (semplice) PHP.

    
posta madeye 30.03.2015 - 14:52
fonte

2 risposte

2

Sembra che essenzialmente il problema sia che hai 30 processi simili ma che variano in modo incoerente e vuoi evitare di duplicare il codice il più possibile mentre sei ancora in grado di cambiare qualsiasi aspetto se necessario.

In tal caso, il modello di metodo del modello può essere molto utile.

L'idea di base è che dovresti implementare una classe base / astratta che funzioni più o meno nel modo più comune, quindi per ogni cliente crei una classe figlio che sovrascrive solo i metodi che devono essere modificati.

Ad esempio:

abstract class BaseCustomer {

    protected $someValue = 5;

    protected function someProcess() {
        return $this->someValue * 2;
    }

    public function execute() {
        return $this->someProcess();
    }

}

class FirstCustomer extends BaseCustomer {
    protected $someValue = 10;
}

class SecondCustomer extends BaseCustomer {
    protected function someProcess() {
        return $this->someValue + 2;
    }
}

Chiamando ->execute() restituirai 20 per FirstCustomer e 7 per SecondCustomer .

Un ulteriore passo che puoi fare è usare la composizione in combinazione con un modello di modello per separare i diversi componenti dei tuoi moduli.

Ad esempio, supponiamo che tu abbia processi che inviano un file CSV in 5 diversi formati tramite e-mail, FTP o HTTP a seconda del cliente. Puoi avere due gruppi di moduli: uno per il formato file e uno per il metodo di trasporto.

Quindi vai a qualcosa tipo:

$format = new CustomerOneCSVFormat($data);
$transport = new FTPModule();
$transport->send($format);

In questo esempio potresti supportare 15 combinazioni diverse da solo 8 classi (più la classe base / astratta).

Quando si progetta la tua classe base è importante mantenere le funzioni interne corte e divise secondo le linee di quello che è probabile che cambi cliente per cliente, il che eviterà di dover copiare grossi pezzi di codice in classi figlio solo per cambiare alcune righe.

    
risposta data 03.04.2015 - 02:01
fonte
3

È difficile dire come strutturare la tua applicazione senza conoscere le differenze tra ogni "ramo". Quello che vorrei fare è confrontare la funzionalità di ogni ramo e distillare i denominatori comuni. Metti questi in classi che usi per ogni cliente. Le parti che differiscono da client a client verranno quindi inserite in adattatori o strategie che condividono (in modo ottimale) un'interfaccia comune.

Abbiamo avuto lo stesso problema con un codebase che ho ereditato. Alcuni suggerimenti che ho usato in quel progetto:

  • Uso intensivo di adattatori o strategie.
  • Uso dell'input della dipendenza per scambiare diverse classi per diversi client.
  • Se un client ha bisogno di un'eccezione speciale, vedi se può essere invece aggiunto alle classi generiche usando qualche configurazione.
risposta data 30.03.2015 - 15:06
fonte

Leggi altre domande sui tag