Quali di questi esempi di OOP dimostrano i concetti OOP corretti?

4

Sto ancora cercando di avvolgere la mia mente attorno a OOP. Tutti gli esempi seguenti funzionano, naturalmente, ma c'è uno (o forse un altro) che meglio esemplifica i concetti OOP?

/**
 * For the following examples the Image class queries an image
 * and associated info from a database, which is passed on
 * instantiation via dependency injection.
 */

$image = new Image(new Db());

Esempio 1:

if ($image->setImageId($id, $size)) {
    header('content-type: ' . $image->content_type);
    header('content-length: ' . $image->length);
    echo $image->getBytes();
}

Esempio 2:

if ($image_info = $image->getImageInfoByIdAndSize($id, $size)) {
    header('content-type: ' . $image_info->content_type);
    header('content-length: ' . $image_info->length);
    echo $image->getImageBytesByIdAndSize($id, $size);
}

Esempio 3:

$image->setImageIdAndSize($id, $size);

if ($image_info = $image->getImageInfo()) {
    header('content-type: ' . $image_info->content_type);
    header('content-length: ' . $image_info->length);
    echo $image->getImageBytes();
}
    
posta Isius 05.03.2013 - 18:58
fonte

2 risposte

5

Sono d'accordo con il commento di delnan su "OOP", e che non esistono realmente "concetti OOP appropriati", ma in termini di principi generali di codifica, penso che l'esempio 2 sia un chiaro vincitore rispetto agli altri.

Esempi 1 & 3 sono la stessa cosa con nomi diversi. In questo caso non è affatto ovvio che l'impostazione dell'ID e delle dimensioni dell'oggetto possa causare il recupero di un database e l'aggiunta di altre sue proprietà. Ho eseguito il debug del codice in questo modo ed è difficile rintracciare esattamente ciò che accade con questo tipo di effetti collaterali nascosti ovunque.

L'Esempio 2 è una sorta di combinazione di un oggetto di accesso ai dati e una fabbrica, e questi potrebbero potenzialmente essere separati, ma in entrambi i casi è più ovvio per il lettore cosa sta succedendo.

Modifica Ecco una rappresentazione ancora più chiara:

if ($image = $image_data_access->getImageById($id)) {
    $image->scaleTo($size);
    header('content-type: ' . $image->content_type);
    header('content-length: ' . $image->length);
    echo $image->getBytes();
}
    
risposta data 05.03.2013 - 19:26
fonte
1

(la mia opinione, per favore non essere offeso se non sei d'accordo)
Nessuno è buono.
Il nome del metodo non indica affatto che le intestazioni siano state inviate o che venga emesso qualcosa.
Preferirei qualcosa come seguire.

class Image {

public function __construct($id) {
#load, if fail throw exception
}

private function getHeaders() {
    return array(
        'content-type'   =>  $this->content_type,
        'content-length' => $this->length
    );
}

private function sendHeaders() {
    #calls function sendHeaders defined somewhere far away (usually it is 'app' object which has method like this)
    sendHeaders($this->getHeaders()); 
}

/** Sends image headers and content(bytes) */
public function sendImage() {
    $this->sendHeaders();
    echo $this->getBytes();
}
}

Se mi manca "modo OOP", per favore scrivi nei commenti mentre sto anche imparando, e sarei grato per avermi indirizzato nel modo giusto:)

    
risposta data 06.03.2013 - 10:56
fonte

Leggi altre domande sui tag