Bu benim oldukça düzenli rastlamak bir sorun olduğunu ve asla buldum / en iyi uygulamalar durumu anladım. İstisnalar yüzden şu anda kullanılan yöntemlere sadık çalışıyorum muhtemelen ancak ben çalışıyorum uygulama bunlardan hiçbir kullanır gitmek için yoludur.
Ne 3, 4, 5 veya daha fazla farklı koşullarının kontrol edilmesi ve bir hata mesajı ya ayarlamak veya işlem devam ediyor gerekli olması halinde if ifadeleri, döner, mesajlar vb düzenlemek için en iyi yoldur. Bu kodun başında fiziksel olarak kontrol edilmesi, tüm hata olması iyi bir uygulamadır?
İşte bazı gerçek dünya tipi koşullara sahip bir örnek.
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;
}
VEYA
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;
}
Bu durumda seçeneği 2 gitmek için yol olduğunu bana açık. Bu çok daha net. Şimdi, biz biraz daha karmaşık hale getirebilir:
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;
}
VEYA this which has some issues with it
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;
}
Ben sadece bu iç içe işlemek için en iyi yolu emin değilim-bu-sonra-do-o-zaman-eğer-bu-sonra-do-bu işlevsellik tür. Eğer sağlayabilir herhangi bir fikir için indvance ederiz!