HDApache
@HDApache
PHP программист

Как реализовать лаконичную запись условий?

К примеру, в случае если не произошла ошибка, надо показать сообщение о успешной операции. Но есть несколько условий. Я делаю так... Но нутром чую, можно писать красивее.
if ($this->isNewRecord) {
    if(!empty($this->parent_id)) {
        if (some condition) $success = true;
    }
    else {
        if (some condition) $success = true;
    }
}
else {
    if(!empty($this->parent_id)) {
        if (some condition) $success = true;
    }
    else {
        if (some condition) $success = true;
    }
}

if (@$success) {
    $this->message = "OK!";
}


Можно конечно еще так:
if ($this->isNewRecord && !empty($this->parent_id)) {
    if (some condition) $success = true;
}
elseif ($this->isNewRecord && empty($this->parent_id)) {
    if (some condition) $success = true;
}
elseif (!$this->isNewRecord && !empty($this->parent_id)) {
    if (some condition) $success = true;
}
else {
    if (some condition) $success = true;
}

if (@$success) {
    $this->message = "OK!";
}


Или же вместо кучи if-ов можно использовать case - switсh конструкцию, но мне кажется, что весь такой код с запашком.
  • Вопрос задан
  • 2940 просмотров
Решения вопроса 2
deadbyelpy
@deadbyelpy
веб-шмеб
Зачем if $this->isNewRecord и else?
ведь все равно может быть success
тоже и с !empty($this->parent_id)
По пути появления some condition
if (some condition1 || some condition2 || some conditio3 || some condition4) { 
  $success = true; 
}

Если же эти условия возникают только при тех или иных условиях
$condition1 = ($this->isNewRecord && !empty($this->parent_id) && some condition1);
$condition1 = ($this->isNewRecord && empty($this->parent_id) && some condition2);
$condition1 = (!$this->isNewRecord && !empty($this->parent_id) && some condition3);
$condition1 = (!$this->isNewRecord && empty($this->parent_id) && some condition4);

и тоже что и выше.
было бы яснее, если бы хоть больше объяснили

Если эта функция только сообщает о успехе, делайте return
Дробите на меньше куски, если не избежать такого ветвления.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
if (!empty($category->pid)) {
    $rootCategory = Categories::model()->findByPk($category->pid);
    $categorySaved = ($category->isNewRecord ? 
                          $category->appendTo($rootCategory) :  
                          $category->moveAsFirst($rootCategory)
                     ) && $category->saveNode());
} else {
    $categorySaved = ($category->isNewRecord || !$category->isRoot() && $category->moveAsRoot()
                     ) && $category->saveNode();
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
rhaport
@rhaport
такие проблемы решаются каждая по своему. Найти общее решение для всего не всегда будет оптимально.
В данном случае можно определить бинарную фунцию functor: (0,1)x(0,1) -> (f1,f2,f3,f4)
функции и будут Ваши some conditions.
Типа такого (сорри синтакиси сишный, так как не знаю php),
int to0123(bool a, bool b)
{
   return ((int)(a == true) << 1) + (int)(b == true);
}


Если, conditions = {f1, f2, f3, f4};, где fx функции, которые проверяют ваши some conditions,

то можно писать типа такого
idx = to0123($this->isNewRecord, empty($this->parent_id));
if (conditions[idx])
     success = true
Ответ написан
Комментировать
HDApache
@HDApache Автор вопроса
PHP программист
Вот реальный код:
if ($category->isNewRecord && empty($category->pid)) {
     if ($category->saveNode()) $categorySaved = true;
}
elseif ($category->isNewRecord && !empty($category->pid)) {
     $rootCategory = Categories::model()->findByPk($category->pid);
     if ($category->appendTo($rootCategory) && $category->saveNode()) $categorySaved = true;
}
elseif (!$category->isNewRecord && empty($category->pid) && !$category->isRoot()) {
    if ($category->moveAsRoot() && $category->saveNode()) $categorySaved = true;
}
elseif (!$category->isNewRecord && !empty($category->pid)) {
    $rootCategory = Categories::model()->findByPk($category->pid);
    if ($category->moveAsFirst($rootCategory) && $category->saveNode()) $categorySaved = true;
}


Как видно внутри каждого блока if не повторяющийся код, получается через OR не получится объеденить условия.
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
примерный вариант...
$categorySaved = true;

if (!empty($category->pid)) {
    $rootCategory = Categories::model()->findByPk($category->pid);
    $categorySaved = $category->isNewRecord ?
        $category->appendTo($rootCategory) : $category->moveAsFirst($rootCategory);
} else if ($category->isNewRecord && !$category->isRoot()) {
    $categorySaved = $category->moveAsRoot();
}
$categorySaved = $categorySaved && $category->saveNode();


но вообще это не сильно красиво... А универсального способа нету. По хорошему много ветвлений в одном методе это не хорошо...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы