Re[3]: Почему так ругают PHP?.
От: Mr.Cat  
Дата: 02.02.09 23:32
Оценка:
Здравствуйте, ., Вы писали:
>> Отсутствие строгой типизациии приводит к жутким граблям:
.>Это вообще тут не причём. Это прелести динамического программирования. Во всех динамических языках будут те же проблемы. Это дело решается юнит-тестами.

То, о чем Вы и Ваш собеседник говорите, совершенно ортогонально динамической/статической типизации. Правила, не позволяющие лишний раз прострелить себе ногу не обязательно связаны с типами. Просто в php нет ни того, ни другого.
function multiply($x) 
{
     $result = $x * $y;
     // Здесь программист забыл вернуть результат из функции!
     // Главное, что никаких warning'ов, а там и до пятницы недалеко.    
}

Невозможно в scheme. Поскольку, грубо говоря все, что не биндит переменные — выражение, "забыть вернуть" что-то нельзя.


class MyClass
{
    var $x;
    public function myMethod($a) {
            
        $x = $a; // Упс, здесь надо было написать $this->x = $a, но мы забыли про $this - ерунда  
                 // транслятор молчит значит усё в порядке!                
    }
}

Практически невозможно в scheme. Нечаянно прибиндить что-то "не туда" можно разве что с помощью макроса, да и то сложно.

function sum($integer1, $integer2) 
{    
     return (int)$integer + (int)$integer2;
}

$sum =  sum(1, array(1, 2, 3)); // Cколько будет целое плюс массив? Транслятору пофиг. 
                                // Примечание: приводим тип потому что не доверяем входным данным от пользователя.

В scheme подобная ситуация выльется в эксепшн в рантайме (т.е. соответствующий тест будет зафейлен).


function doSomething($x, $y, $z) // Какого типа $x, $y, $z? Угадай сам! 
{
     
}

Вообще, при объявлении функций их стоит аннотировать типами аргументов. Очень полезная практика.


function makeMeHapy() // Эта функция должна была называться makeMeHappy. Ошибка обнаружится в багрепорте на следующее утро.
{
     
}

В scheme в принципе возможно, но компиляторы выдают варнинги, поскольку вероятность внезапного появления биндинга в лексической области видимости в рантайме — на уровне статистической погрешности.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.