Стандарт возвращаемых типов

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
nepob
Сообщения: 18
Зарегистрирован: 2016.02.23, 09:25

Стандарт возвращаемых типов

Сообщение nepob »

Всем привет.
У нас в компании возникло разногласие по поводу типов возвраемых значений. Например, метод insertEntities() может возвращать число (количество вставленных записей), null или false (в случае неудачной вставки). Также есть методы получения данных которые могут возвращать массив или false.
И мое мнение, что это жутко не удобно, т.к. приходится проверять каждое значение. Гораздо удобнее было бы ограничится одним типом и null. А в случае с массивами вообще без null, т.к. тогда можно было бы подставлять результат в foreach без проверки.
Но к сожалению такого стандарта нет, и никто этому не будет будет следовать.
Как вы думаете стоит стандартизировать такую вещь?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Стандарт возвращаемых типов

Сообщение zelenin »

ваш вариант лучше. стоит его принять. Также вместо null можно выкидывать исключение NotFound - тогда у нас будет возвращаться всегда один тип.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Стандарт возвращаемых типов

Сообщение ElisDN »

Это только в не строготипизированных языках вроде PHP такого стандарта нет. Это неудобно и костыльно, так как нужно постоянно помнить про эти object/true/false/1/0/null и каждый раз проверять все варианты. В строгих же языках требуется указать только один тип результата, а для описания любых нештатных ситуаций придуманы Exception-ы.

Чем более серьёзные проекты пытаются разрабатывать на PHP, тем больше в нём появляется профессиональных вещей из Enterprise-языков вроде Java и C#. Новичкам это не нравится, так как для них это "слишком сложно". Они считают это лишним и на каждый пункт в CHANGELOG к PHP 7 ноют: "Остановите их! Очередная попытка превратить PHP в Java!" Аналогичное недовольство имеется и в среде Yii2-программистов, когда фреймворк сравнивают с другими.

В дополнение к вашему варианту в PHP 7 уже можно специально использовать строгую типизацию:

Код: Выделить всё

class UserRepository
{
    // Возвращаем объект или бросаем исключение
    // Снаружи никаких проверок не требуется
    // Самый удобный и безопасный способ
    public function get($id): User {
        if (!$user = ...) {
            throw new NotFoundException('User not found.');
        }
        return $user;
    }
    
    // Возвращаем объект (если нашёлся) или null (если нет)
    // Снаружи требуется проверка if (!$user) { ... }
    // Опасен вероятностью забыть сделать проверку
    // Используется редко
    public function find($id): ?User {
        $user = ...;
        return $user;
    }

    // В случае процедур не возвращаем никаких true/false
    // Просто либо молча выполняем работу, любых кидаем исключение
    public function save(User $user): void {
        ...
        if (!$success) {
            throw new RuntimeException('Saving error.');
        }
    }
}
Ответить