Incapsulamento: separare le funzioni per variabili separate o restituire una tabella? [PHP]

0

Ho creato un sito Web con PHP e ho alcune classi, finora nessuno di loro segue realmente le regole di incapsulamento di OOP. Diciamo che ho una classe utente in questo modo:

class User{
    public $username;
    public $uid;
    public $date;
    public $location;
    public $bio;
    public $avatar;    
    public function __construct($user, $uidOr){
        $this->username = $user;
        $this->uidOr = $uidOr;
    } .

    public function getUser(){
        if($this->uidOr){
            $which = "uid";
        } else { $which = "username"; } 
// /\ I know the above is bad
        $getUserInfoQuery = new Database();
        $getUserInfoQuery->fetchAll("users", array($which, $this->username));

        foreach ($getUserInfoQuery->result as $value) {
            $this->username = $value['username'];
            $this->uid = $value['uid'];
            $this->date = $value['date'];
            $this->location = $value['location'];
            $this->bio = $value['bio'];
            $this->avatar = $value['avatarurl'];
        }
    }
}

Ovviamente questa è una pratica terribile di OOP, giusto? Dovrei aggiungere funzioni come getUserUsername (); che restituisce il nome utente dell'oggetto utente o devo creare una funzione che restituisca una tabella di informazioni. Cosa sarebbe meglio? Grazie! PS: mi dispiace per il mio codice cattivo, sono nuovo di OOP.

    
posta DribbleUI 28.07.2014 - 20:35
fonte

2 risposte

2

La tua funzione getUser sarebbe probabilmente denominata populateFromDB , o forse initFromDB . Se il nome della funzione è getUser , mi aspetto che venga restituito un oggetto Utente. Quello che succede qui è che alcuni membri sono popolati ma per quanto posso dire non viene restituito nulla.

Avere getter e setter separati per membri privati, ove necessario, è una pratica comune. Se davvero non pensi di averne bisogno, puoi invece avere una singola funzione chiamata getUserFields che potrebbe restituire un array contenente tutti i diversi campi.

Nel tuo esempio, hai completamente infranto l'incapsulamento rendendo tutto pubblico. Quindi potresti anche voler rendere privati tutti i membri e quindi aggiungere tutte le funzioni getter / setter necessarie (o una singola funzione che restituisce tutto in un array).

    
risposta data 28.07.2014 - 20:51
fonte
1

Vostro diritto che una grande parte di OOP è l'incapsulamento. Corri il rischio che qualsiasi codice possa modificare le tue variabili di istanza quando le dichiari tutte pubbliche. L'utilizzo di variabili pubbliche ti incoraggia anche a non incapsulare la tua logica aziendale. Ad ogni modo, non sei interessato al motivo per cui è sbagliato dichiarare variabili di istanza pubbliche.

La semplice risposta alla tua domanda è sì, è una cattiva pratica dichiarare variabili pubbliche. Devi dichiarare le tue variabili come private e restituirle in base alle necessità. Se è necessario accedere a una variabile, accedervi. Se si desidera restituire una serie di informazioni contemporaneamente, quindi restituire l'oggetto contenente le informazioni. L'intero punto di quell'oggetto è contenere le informazioni di cui hai bisogno. Restituire tutte le informazioni sconfigge lo scopo di avere un oggetto.

È comune utilizzare le proprietà per rappresentare le variabili di istanza in un oggetto dominio. Una proprietà può essere letto o meno in base al suo utilizzo. Ecco un esempio del tuo codice scritto usando le proprietà.

class User {
    private String username;

    public String Username() {
        return username;
    }

    public void Username(String value) {
        username = value;
    }
}

Se si desidera rendere una sola variabile di lettura sola, omettere il setter. Se non si desidera che una variabile sia leggibile, non includere getter e setter. Le persone si riferiscono anche a questi sono mutatori e accessori.

Ecco un esempio di mutatore PHP e accessor in uso. Questo collegamento fornisce anche una sintassi specifica per PHP che include scorciatoie. I collegamenti sono belli perché puliscono il tuo codice e sono universalmente comprensibili.

link

    
risposta data 28.07.2014 - 20:47
fonte

Leggi altre domande sui tag