Холиварка пыхыпешников (общая)

7.16K
.
Rakovskiy, Явное лучше неявного
Это даёт гарантию того, что приложение будет вести себя так, как ожидается. Без хинтинга баги ловить труднее, да и отладка порой может быть не лёгкой.

Возьмём вот этот код:
class Service {
    public function doSomething() {
    }
}
class ServiceFactory {
    public function createService() {
        return new Service();
    }
}
$factory = new ServiceFactory();
$service = $factory->createService();
$service->doSomething();

Потом я что-то переделал и теперь метод createService возвращает не экземпляр класса Service, а CustomService, у которого нет метода doSomething(); или что ещё хуже, есть, но делает не то, что ожидается.
Допустим, я везде всё переписал, но одно место не заметил. Хорошо, если пишутся тесты, они помогут найти баг, а если их нет, то с большой вероятностью баг возникнет на продакшене. И без тайп-хинтинга этот код будет валидным. А что он будет делать, никому неизвестно.
.
Ксакеп
Rakovskiy, на твой пост (27.01.2015 / 01:12) отвечу, что и перегрузка, и шаблонная функция у тебя кривая. Хреново вас в универе учат.

Koenig, C++ — язык со строгой типизацией, и ты должен к каждой переменной указывать тип.

В PHP / Python / Ruby этого нет, потому что это языки с динамической типизацией, все типы вычисляются в рантайме. Так в некотором роде проще.

В C++ ты должен будешь написать свой контейнер (структуру данных, например список, словарь, итд) для каждого типа. Для строк, для integer, и других. Потому что этот тип явно прописывается в коде.

Чтобы не было много дублирующего кода, Страуструп ввел обобщенное программирование, они же шаблоны, они же обобщения/generics. Суть в том, что ты вместо какого-то одного типа указываешь шаблонный. И когда нужно скомпилировать программу, этот шаблонный тип заменяется на нужный.

В PHP это все излишне, здесь нет привязки к типам. Даже не знаю, почему речь об этом пошла.
.
The Fast, Secure and Professional - Yii2
# XakepPRO (27.01.2015 / 00:29)
что и перегрузка, и шаблонная функция у тебя кривая. Хреново вас в универе учат.
Я пропустил эту тему.

Даже не знаю, почему речь об этом пошла.

Выше есть ссылка на хабр. В PHP 7 будет та самая строгая типизация
.
Сексуальность валенка
# Koenig (27.01.2015 / 00:11)
а я наоборот начал понимать многие языки, надо просто пых получше изучить, и начнешь понимать что все языки по сути одинаковые от части
Возможно, бо я по суте не знаю норм не одного языка
.
Сексуальность валенка
Лично мне нравится когда ты точно знаешь что тебе вернет функция
.
The Fast, Secure and Professional - Yii2
# reaper (27.01.2015 / 00:25)
Rakovskiy, Явное лучше неявного
Это даёт гарантию того, что приложение будет вести себя так, как ожидается. Без хинтинга баги ловить труднее, да и отладка порой может быть не лёгкой.

Возь
Укажем мы, что $factory->createService(); вернет объект, а какие будут изменения при несуществующем методе не совсем понял.
.
Rakovskiy, Пример хреноватый конечно. Мы укажем, что createService() возвращает Service. SomeService уже вернуть не получится и выполнение прервётся. Профит? Разумеется.
В нынешнем виде получим ошибку, что метода у полученного значения нет. И хорошо, если мы сразу вызываем этот метод. Исправить легко. В ином случае придётся разгребать стектрейс. Выяснить, где оно создаётся уже немного сложнее.
.
XakepPRO
Ксакеп
reaper, по-моему, ты раздул из мухи слона.

В твоем примере ты изначально заменяешь Service на CustomService в фабрике, а значит меняешь и возвращаемый тип функции. Натыкаешься на ту же ошибку.

Ошибка с типом могла бы служить тебе напоминанием, но вообще говоря, уже сам факт того, что ты изменяешь фабрику, должен тебя насторожить.
.
XakepPRO, Гг. Ну да. Вот получше пример:

class A
{
    public function getB()
    {
        return new B();
    }
}
class B
{
}
class C 
{
    pulic function __construct(A $a) 
    {
        $this->a = $a;
    }

    public function getB()
    {

        return $this->a->getB()
    }
}

В методе A::getB заменили new B() на new B1(). При вызове C::getB() забыли, что теперь там B1, ну а дальше понятно.
.
Ксакеп
Ок, неплохо. Тогда мы следуем принципам защищенного программирования, накидываем return value type. Но тогда что помешает тебе наследовать B1 от B и точно также значительно поменять логику методов? И даже новая фича не спасёт.

А зная себя в нетрезвом состоянии, я и не такое могу натворить %)
Всего: 308