@Urukhayy

Как в таких случаях грамотней делать?

Приведу пример. В каком-то участке кода с пользовательского счёта нужно снять N-ую сумму. Естественно, прежде чем снять, нужно проверить, есть ли эта сумма в его переменной. Так вот. В данной ситуации прибавляется ещё пара-тройка проверок: есть ли счёт, когда появился счёт и т.п. И самое важное, что после любой отрицательной проверки счёта нужно сообщать об этом пользователю, и прерывать участок кода.
И этот участок когда (с проверками счета и снятием суммы) нужно дублировать во многих местах кода, только суммы разные.

Если всё внести в функцию, которая в качестве аргумента примет сумму, то тоже выход. Но тут есть одно НО. Если в участке кода, до снятия суммы, мы сообщим пользователю что сняли, а следующей строкой будет вызов этой функции, которая выяснит, что у пользователя нет такой суммы, то будет не совсем корректно. В таком случае, использую данный подход стоит всегда учитывать вызов данной функции на первом месте в участке кода.
  • Вопрос задан
  • 297 просмотров
Пригласить эксперта
Ответы на вопрос 4
@vilgeforce
Раздолбай и программист
А проблема-то в чем? Выносите в функцию, функция возвращает true если снятие точно прошло успешно. В нее же все проверки... И если возвращено true - сообщать что снято.
Ответ написан
@ollisso
$result = takeMoney(100);

if($result==='ok')
      echo "Удачно сняли деньги";
}elseif($result=='account_closed'){
      echo "Аккаунт закрыт";
}elseif($result=='money_wrong'){
      echo "Вы указали неправильную сумму";
}else{
 echo "Непредвиденная ошибка";
}


Это решение в лоб, без сложностей если.
takeMoney соответственно возвращает коды ошибок или 'ok' если ок

Пример на пхп, но подобное пишется на любом языке.
Ответ написан
TanVD
@TanVD
Джуниор C++/QT
Для решения похожих проблем используется подход Аспектно-Ориентированного Программирования (АОП). Почитать можно
Здесь (вики)
Здесь (хабр)
Здесь (почти книжка)
Поддержка обеспечивается с помощью фреймворков типа AspectJ, Aspect#, Aspect.NET и кучей других.
Ответ написан
Комментировать
Можно монадами воспользоваться. И логирование ошибок будет и безопасность.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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