Quando voglio rendere un metodo definitivo, prima di tutto mi chiedo:
Questo metodo dovrebbe essere definitivo?
A volte la risposta è ovvia, ad esempio immagina questo:
class Dog
{
private $name;
public function __constructor($name)
{
this->name = $name;
}
final public function getName()
{
return this->name;
}
}
Il metodo getName dovrebbe ovviamente essere definitivo.
Alcuni ragazzi chiedono perché questo è ovvio? Vedi questo esempio:
class DogsSchool
{
private $registredDogs = [];
final public function registerDog(Dog $dog)
{
this->registredDogs[$dog->getName()] = $dog;
}
}
Se le persone cambiano il nome del cane in metodi non di costruzione, ad esempio nel metodo getName , non puoi registrare il cane in nessuna raccolta come DogsSchool , tu non è possibile identificare il cane perché l'ID (qui è il nome) può essere modificato in qualsiasi momento. questo interromperà la tua domanda. e anche nel mondo reale gli identificatori sono definitivi, puoi cambiare il tuo numero identificativo dopo la tua nascita? (nascita = costruzione in OO)
OK, nessun problema, MA! A volte mi sto confondendo! per esempio immagina questo:
class SelectMany
{
public function selectManyAndReturn()
{
return selectMany();
}
}
La sovrascrittura del metodo selectManyAndReturn può modificare il comportamento della classe, le persone possono sovrascriverla ed eseguire selectOne per esempio invece di selectMany , OK , Posso rendere questo metodo definitivo anche per prevenire questo, ma in questo modo sto anche impedendo alle persone di aggiungere nuove funzionalità al metodo, ad esempio se definisco il metodo finale, non sono in grado di scrivere una nuova classe figlia come questa uno:
class SelectManyApple extends SelectMany
{
public function selectManyAndReturn()
{
return selectManyApple();
}
}
Che cosa dovrei fare? La strategia finale e privata è completamente sbagliata? come molte applicazioni e molti linguaggi di programmazione? oppure Puoi dirmi esattamente quando dovremmo rendere un metodo definitivo?
La domanda è indipendente dal linguaggio. Riguarda il principio generale che dovrei usare per scrivere buoni programmi OO.