Я согласен с общим мнением, что форма Foo () && Bar () является разумной , за исключением случая, когда Bar () полезен как для побочных эффектов, так и для его значения. *
Если это так, что Bar () полезен как для побочных эффектов, так и для его стоимости, мой первый выбор - изменить дизайн Bar () так, чтобы создание его побочных эффектов и вычисление его значения были отдельными методами.
Если бы по какой-то причине это было невозможно, я бы предпочел оригинальную версию. Для меня оригинальная версия более четко подчеркивает, что вызов Bar () является частью утверждения, которое полезно для его побочных эффектов. Последняя форма для меня подчеркивает, что Bar () полезен для его значения.
Например, учитывая выбор между
if (NetworkAvailable())
success = LogUserOn();
else
success = false;
и
success = NetworkAvailable() && LogUserOn();
Я бы взял первое; для меня слишком легко не заметить важный побочный эффект в последнем.
Однако, если бы это был выбор между
if (NetworkAvailable())
tryWritingToNetworkStorage = UserHasAvailableDiskQuota();
else
tryWritingToNetworkStorage = false;
и
tryWritingToNetworkStorage = NetworkAvailable() && UserHasAvailableDiskQuota();
Я бы выбрал последнее.