Salve in occasione della manutenzione della mia applicazione (un gioc) ho deciso di fare le cose per bene questa volta cercando di rispettare tutte le regole di buona programmazione. Ora dopo essermi letto una marea di guide sulla programmazione ad oggetti, mi è sorto un dubbio, ovvero come devo dividere il mio progetto perchè rispetti tutte le regole ? vado subito al concreto con un'esempio:

Codice PHP:
class Utente{
    public function 
__construct($id)
    
//Funzioni Per manipolare la tabella Utente
    
public function getSoldi();
    public function 
setSoldi($soldi);
    
//ecc.
}
abstract class 
Item{
    public function 
__construct();
}

class 
Arma extends Item{
    public function 
__construct($user); //Ipotesi 1 passo l'oggetto utente
    
public function getListaWeapon(); //Resituisce un array con le armi comprabili dall'utente
    
public function buyWeapon($id_arma); //Compra un'arma
    
public function getEquipedWeapon();//Restituisce l'arma equipaggiata dell'utente
    
public function hasBoughtWeapon($id_arma); //Restituisce true se l'utente ha comprato già l'arma
    
private function canBuyWeapon($id_arma); //restituisce true se può comprare l'arma
   //ecc.
}

class 
Armatura extends Item {
    
//Come arma

Ora il dubbio in concreto è chi si deve occupare del comprare l'arma/armatura ad esempio ? La classe utente o classe Arma ? In teoria le due cose dovrebbero essere staccate ovvero la classe utente dovrebbe occuparsi dell'utente (e magari di comprare l'oggetto) e la classe Arma di manipolare l'oggetto arma...ma come interegaiscono tra di loro le due classi in concreto? Passare per riferimento l'oggetto arma (magari inizializzato con l'id dell'arma da comprare) non mi sembra un buon modo di farle interagire in quanto rende dipendenti le due classi l'una dall'altra e a sto punto oltre tutto non solo Arma diventerebbe quasi inutile (in quanto terrebbe giusto una funzione che restituisce i dati dell'arma) ma poichè alla fine l'applicazione è basata solo sulle iterazioni che l'utente compie se applicassi il prinipio di sopra mi ritroverei ad avere solo funzioni nella classe Utente a questo punto.

Grazie in anticipo e scusate la lunghezza