Постоянность типа возвращаемого значения

sanmax

Новичок
Суть вопроса - должна ли функция всегда возвращать один тип данных?

С одной стороны хорошо когда функция возвращает только один тип данных, пример почему это плохо всем известен, функция strpos возвращает число если находит строку и false если не находит, при этом 0 и false могут трактоваться одинаково из-за чего возникают неожиданные ситуации. Если бы strpos всегда возвращала число, но не false такой ситуации можно было бы избежать, например -1 в случае если подстрока не найдена.

с другой стороны вариант if ($result != -1) выглядит непривычно и малость странно

Ваши мнения?
 

baev

‹°°¬•
Команда форума
Да уж, «теория программирования»…
Перенёс тему.
 

sanmax

Новичок
Открой для себя ===
я как бы уже открыл.

Речь шла вот об этом:

array_search, strpos и другие похожие функции возвращают 0, если находят вхождение на нулевой позиции, но false если не находят его вообще.

В C, такие функции как strpos возвращают -1, если элемент не был найден. Если вы не проверите этот вариант и попытаетесь использовать результат в качестве индекса, вы попадёте в мусорную память и ваша программа упадёт. (Скорее всего. Это же C. Хрен его знает. Я уверен, что для этого как минимум есть инструменты.)

В Python'е например эквивалентные методы .index бросят исключение, если элемент не найден. Если вы не проверите этот случай, ваша программа упадёт.

В PHP эти функции возвращают false. Если вы используете FALSE как индекс, или сделаете с ним почти всё что угодно кроме сравнения с помощью ===, PHP спокойно сконвертирует его в 0 за вас. Ваша программа не упадёт; она вместо этого будет работать неправильно без предупреждения, если конечно вы не забудете вставить нужный шаблонный код вокруг каждого места где вы используете strpos и некоторые другие функции.
 

С.

Продвинутый новичок
Суть вопроса - должна ли функция всегда возвращать один тип данных?
Не должна.

Во-первых, что по твоему должна вернуть при ошибке fopen()? Может дескриптор на /dev/null?
Во-втрорых, если бы в strpos() возврщался -1, это никакого выигрыша не дало бы.
Ваша программа не упадёт; она вместо этого будет работать неправильно без предупреждения, если конечно вы не забудете вставить нужный шаблонный код вокруг каждого места где вы используете strpos и некоторые другие функции.
Фигня какая-то. Если ты уверен на 100%, что подстрока там есть, то с чего программ будет работать неправильно? А если не уверен, то проверку результата придется делать по-любому, что для -1, что для FALSE.
 
Сверху