Dies ist ein Problem, das ich ziemlich regelmäßig erfahre und ich habe nie eine Best Practices Situation gefunden. Ausnahmen sind wahrscheinlich der Weg zu gehen, aber die Anwendung, die ich arbeite, macht keinen Gebrauch von ihnen, also versuche ich, bei den derzeit verwendeten Methoden zu bleiben.PHP multiple if/elseif und Fehlerbehandlung/Handhabung Best Practices
Was ist der beste Weg, um Aussagen, Rückgaben, Nachrichten usw. zu erstellen, wenn 3, 4, 5 oder mehr verschiedene Bedingungen überprüft werden müssen und entweder eine Fehlermeldung gesetzt wird oder die Verarbeitung fortgesetzt wird. Ist es am besten, wenn alle Fehler am Anfang des Codes physisch vorliegen?
Hier ist ein Beispiel mit einigen realen Bedingungen.
function process($objectId,$userId,$newData)
{
$error = '';
if(($object = $this->getObject($objectId)) && $object->userOwnsObject($userId))
{
if($this->isValid($newData))
{
if($object->isWriteable())
{
if($object->write($newData))
{
// No error. Success!
}
else
{
$error = 'Unable to write object';
}
}
else
{
$error = 'Object not writeable';
}
}
else
{
$error = 'Data invalid';
}
}
else
{
$error = 'Object invalid';
}
return $error;
}
ODER
function process($objectId,$userId,$newData)
{
$error = '';
if((!$object = $this->getObject($objectId)) && !$object->userOwnsObject($userId))
{
$error = 'Object invalid';
}
elseif(!$this->isValid($newData))
{
$error = 'Data invalid';
}
elseif(!$object->isWriteable())
{
$error = 'Object not writeable';
}
elseif(!$object->write($newData))
{
$error = 'Unable to write to object';
}
else
{
// Success!
}
return $error;
}
Es ist mir klar, dass in diesem Fall der Option 2 ist der Weg zu gehen. Es ist viel klarer. Jetzt können wir machen es ein bisschen komplizierter:
function process($objectId,$userId,$newData)
{
$error = '';
if(($object = $this->getObject($objectId)) && $object->userOwnsObject($userId))
{
$this->setValidationRules();
$parent = $object->getParentObject();
$parent->prepareForChildUpdate();
if($this->isValid($newData,$parent))
{
$newData = $this->preProcessData($newData);
if($object->isWriteable())
{
// doServerIntensiveProcess() has no return value and must be done between these two steps
$this->doServerIntensiveProcess();
if($object->write($newData))
{
// No error. Success!
$parent->childUpdated();
}
else
{
$error = 'Unable to write object';
}
}
else
{
$error = 'Object not writeable';
}
}
else
{
$error = 'Data invalid';
}
}
else
{
$error = 'Object invalid';
}
return $error;
}
ODER dies die einige Probleme mit ihm hat
function process($objectId,$userId,$newData)
{
$error = '';
if((!$object = $this->getObject($objectId)) && !$object->userOwnsObject($userId))
{
$error = 'Object invalid';
}
// Is it wrong to hate multi-line conditionals?
elseif(!$this->setValidationRules() || (!$parent = $object->getParentObject()) ||
!$parent->prepareForChildUpdate() || !$this->isValid($newData,$parent))
{
$error = 'Data invalid';
}
elseif((!$newData = $this->preProcessData($newData)) || !$object->isWriteable())
{
$error = 'Object not writeable';
}
// Where does doServerIntensiveProcess() with no return value go??
elseif(!$object->write($newData))
{
$error = 'Unable to write to object';
}
else
{
// Success!
$parent->childUpdated();
}
return $error;
}
Ich bin nur nicht sicher, ob der beste Weg, um dieses verschachtelte if-zu handhaben - dann-was-dann-wenn-das-dann-machen-diese Art von Funktionalität. Vielen Dank für Ihre Einsichten!
Sie scheinen zu wissen, dass Ausnahmen der richtige Weg sind, aber warum wollen Sie sie nicht benutzen? Ich verstehe, dass sie in Ihrer derzeitigen Codebasis nicht verwendet werden, aber ich denke, jetzt ist ein guter Zeitpunkt, um damit anzufangen. Die Verwendung einer Rückgabewert-Zeichenfolge, um Fehler anzuzeigen, ist eine absolut schreckliche Idee. – ryeguy
Ja, du hast Recht. Es ist so eine massive Codebase, die auf eine bestimmte Art und Weise gestaltet ist. Ich möchte nicht auf die Zehen treten oder andere Entwickler auf den Gartenweg schicken, wenn sie die Mysterien von Exceptions erforschen. – fred