Questa domanda si basa su due premesse:
- Primo: un oggetto deve sempre avere uno stato valido. È discusso anche in vari post. link
- Secondo: una classe può affidarsi esclusivamente a se stessa per anticipare se le sue istanze avranno uno stato valido.
Ci sono alcune conseguenze a questo tipo: non utilizzare proprietà pubbliche o protette. È semplice capire perché dovrebbero essere evitati. Esistono post anche su questo argomento specifico. Perché il codice Clean suggerisce di evitare le variabili protette?
Un'altra conseguenza è che il riferimento this
non dovrebbe essere dato a metodi di altre classi: link Almeno, si consiglia spesso di non farlo nei costruttori.
Tuttavia, in senso stretto, questo non proibirebbe quasi ogni istanza di passare this
ai metodi di qualsiasi dipendenza? Dopotutto, a meno che una classe non faccia parte di una gerarchia di classi, come può evitare che un oggetto abbia uno stato non valido quando passa this
?
Un esempio in PHP:
class ClientCodeClass {
public function carryOutTask(ParentClass $object) {
// Client code now has access to the object in illegal state and things may mishappen because of that.
}
}
class ParentClass {
private $client_code_class;
public function __construct(ClientCodeClass $client_code_class) {
$this->client_code_class = $client_code_class;
}
protected function exposeParentClass() {
// At this time, $this is in invalid state, and we're passing it to client code!
$this->client_code_class->carryOutTask($this);
}
}
class ChildClass extends ParentClass {
public function doSomething() {
$this->setIllegalState();
$this->exposeParentClass();
$this->setLegalState();
}
}
$child_class = new ChildClass();
$child_class->doSomething();
Quindi la mia domanda è: è vero che le mie due premesse sono corrette e che verrebbero violate se una classe (a meno che non estenda un'altra classe e sia marcata final
) passi this
a un metodo di un'altra obiettare?
Domanda successiva: questo non limita drasticamente l'uso consentito dei callback? Dopotutto, quando un oggetto richiama la richiamata, non può garantire che sia valida - mentre quella callback potrebbe funzionare su quello stesso oggetto.