Il mio primo tentativo a questa domanda era troppo teorico, quindi l'ho riscritto con il codice reale. Guarda la cronologia delle modifiche se ti interessa.
Supponendo questa logica, "sofferenza" dalla freccia anti-pattern :
/**
* Function:effective
* ... the DateTime the org should be considered expired (or null if never).
*
* If a non-group org has a parent, inherits the parent's properties, and
* the parent isn't a root org, return the parent's expiration date.
* Otherwise, return the org's expiration date.
*
* Compare to <get>, which always returns the org's expiration date.
*/
public function effective() {
if (! $this->org->isGroup()) {
if (($parent = $this->org->getParentOrg()) instanceof OrgModel) {
if ($this->org->isParentPropertyInherited()) {
if (! $parent->isRoot()) {
return $parent->expiration()->effective();
}
}
}
}
return $this->get();
}
Ho riscritto questo in alcuni altri modi (incluso l'approccio "fallisci presto" da questa domanda ), ma quella che mi sembra più chiara è:
public function effective()
{
$nonGroup = (! $this->org->isGroup());
$hasParent = $nonGroup && ($parent = $this->org->getParentOrg()) instanceof OrgModel;
$inherits = $hasParent && ($this->org->isParentPropertyInherited());
$nonRoot = $inherits && (! $parent->isRoot());
if ($nonRoot) {
return $parent->expiration()->effective();
} else {
return $this->get();
}
}
Secondo me, i test logici sono compatti e semplici, ma prolissi a causa dei nomi dei metodi e dell'overhead del linguaggio dei metodi di chiamata.
Sono riluttante ad andare con il mio secondo approccio riscritto perché potrebbe essere oscuro e non reggere la manutenzione. D'altra parte, non mi piace il% co_de nidificato. Non mi piaceva l'approccio fail-early, perché ripeteva il codice.
Ci sono altre opzioni che non sto considerando qui?