Progettazione dei metodi di classe: chiamate autonome o esplicite?

3

Probabilmente sto macellando i termini, se qualcuno conosce i termini appropriati - sarebbe fantastico.

Ma la mia domanda è: dovrei progettare le mie classi in modo che i parametri dei loro metodi siano accessibili dall'esterno o dovrebbero essere tutti autonomi?

Ad esempio, voglio impostare un nome di dominio per una classe, che servirà come dominio "attivo":

function setDomain($url){
        if ($this -> domainUrl = parse_url($url, PHP_URL_HOST)){
            $this-> domain = $this->db->get_where('domains', array('host' => $this->domainUrl));

            return $this;
        }

        return false;
    }

e quindi vai sul percorso di:

function addDomain(){
        $query = "INSERT INTO domains (host) VALUES ('$this->domainUrl')";
        $this->db->query($query);
        return $this
    }

oppure posso abbandonare l'intero percorso di setDomain (), e solo chiamare l'url in modo esplicito, ad esempio:

function addDomain($url){
        $query = "INSERT INTO domains (host) VALUES ('$url')";
        $this->db->query($query);
    }

Quale diresti è preferibile e immagino - a cosa dipende, perché potrebbero esserci casi in cui dovrò chiamarlo esplicitamente.

    
posta Itai Sagi 21.02.2012 - 15:50
fonte

2 risposte

4

Generalmente imposta solo attributi sull'istanza se:

  • farai molte chiamate con quegli argomenti esatti,
  • i parametri devono essere raccolti da varie posizioni per l'elaborazione finale o
  • ci sono così tanti argomenti che devi nominarli.

Altrimenti passare un argomento è meno codice e meno codice è più leggibile. Anche il compilatore / interprete ti dirà quando hai perso argomenti, mentre devi controllarti quando hai dimenticato di chiamare un setter.

    
risposta data 21.02.2012 - 16:54
fonte
1

Come per qualsiasi domanda di design generale, anche la risposta a questa domanda è dipende. Dipende tutto dalla tua astrazione per la classe.

Consentitemi di fornire due esempi che illustrano due diverse astrazioni:

  • class DomainOperator : questa classe altamente fittizia si occupa di eseguire varie operazioni su un dominio. Dato un dominio, può memorizzarlo, fare alcune operazioni rilevanti per la stringa su di esso, ecc ... Per questa classe, vorrei dichiarare domainURL come variabile di istanza. Più metodi dovrebbero farne uso; agisce come globale all'interno di una classe.

  • class WebSite : ancora un'altra classe inventata responsabile della memorizzazione delle proprietà di un sito web; il dominio è una di queste proprietà. Ha un metodo chiamato addDomain(url) e in questo metodo memorizza il dominio.

    Non sono molto contento di questi esempi, ma il punto è che dipende da cosa vuoi fare con la tua classe. Se la tua logica di classe è basata su un dominio, allora la renderei una variabile di istanza. Altrimenti, un parametro andrebbe bene.

    Nota a margine: queste piccole decisioni diventano più facili con il refactoring. Se guardi una classe e vedi 4 metodi (su 7) usando una variabile, allora potrebbe essere il momento di estrarre questi 4 metodi in una nuova classe; rendendo la variabile condivisa una variabile di istanza della nuova classe.

        
  • risposta data 21.02.2012 - 19:23
    fonte

    Leggi altre domande sui tag