Программный код - качество и пояснения

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Программный код - качество и пояснения

Сообщение olehs » Ср сен 23, 2015 10:04 am

LutsenkoDenis писал(а): в) ошибка выборки... если имеется в виду это $this->Error($query); - ничего не прерывает. То что в ней return 1 ни о чем не говорит, т.к. далее нигде не используется.
Если я правильно понял, перед return 1 создается экземпляр класса error, в конструкторе которого есть exit.
Не проверял, но теоретически скрипт должен останавливаться
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Программный код - качество и пояснения

Сообщение LutsenkoDenis » Ср сен 23, 2015 11:16 am

olehs писал(а):Если я правильно понял, перед return 1 создается экземпляр класса error, в конструкторе которого есть exit.
Не проверял, но теоретически скрипт должен останавливаться
А я только что проверил...вот функция: Как мы видим она тоже возвращает 1(return 1).

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

function Error($query = "")
   {
      registerError('sql', mysql_errno() . ": " . mysql_error() . "\n$query");
      new error(mysql_errno() . ": " . mysql_error() . "<br>$query", 1);
      
      return 1;
   }
Но тут тоже перед return 1 есть вызов new error, в котором вторым параметром стоит 1, что говорит данной функции что нужно остановить выполнение скрипта.

И вот у меня возникает вопрос... а какого гхм...? Если функция должна возвращать результат, то она должна это делать, а если не должна, то у неё ни в описании ни в теле не должно быть даже намека возврат значения. А сейчас получается непредсказуемо. Я вижу функцию, вижу в её описании что она должна вернуть массив, я его жду, а в ответ ничего не приходит. И вместо того чтобы дальше писать код, я должен тратить время на то, чтобы понять почему мне ничего не вернули из функции.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Программный код - качество и пояснения

Сообщение olehs » Ср сен 23, 2015 11:34 am

Простите, но я не до конца понимаю чего вы от функции ожидаете.
Какой результат вы хотите получить от функции Select в случае ошибки SQL? Ведь она должна вернуть массив строк.

Зато я понимаю, что ожидает ф-ция Select от вас: корректного SQL-запроса. Потому она вполне в праве грохнуться с исключением, если это не так.
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Программный код - качество и пояснения

Сообщение LutsenkoDenis » Ср сен 23, 2015 11:53 am

От функции я ожидаю предсказуемого поведения.
Вот вы сами написали - "Ведь она должна вернуть массив строк." Более того, в описании данной функции написано тоже самое. И вы не поверите - этого же я от нее и жду - массив строк а не прекращения выполнения. И тут дело не только в конкретной функции Select.
Смотрим функцию:

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

function Error($query = "")
   {
      registerError('sql', mysql_errno() . ": " . mysql_error() . "\n$query");
      new error(mysql_errno() . ": " . mysql_error() . "<br>$query", 1);
      
      return 1;
   }
1. Видим что она возвращает 1 по окончании работы (return 1).
2. На практике, данная функция никогда не дойдет до этого retur'a т.к. скрипт прекращает свою работу внутри new error.

Спрашивается, если до возврата из функции дело не доходит, то зачем его писать? Зачем вводить в заблуждение?
И наводящий вопрос, вы всегда заглядываете внутрь каждой функции и внутрь каждой вложенной в неё функции, перед тем как её собираетесь использовать или все таки смотрите описание?
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Программный код - качество и пояснения

Сообщение olehs » Чт сен 24, 2015 3:22 pm

В этом как раз и был мой вопрос: какой массив строк может вернуть ф-ция Select в случае ошибки SQL?

А по поводу Error тоже не все так однозначно: ее поведение зависит не только от нее, а и от реализации класса error. Если он вдруг изменится и позволит не вываливаться из скрипта, то до return 1 дело дойдет.
Я не утверждаю, что это правильно, но если вы захотели пользоваться этими функциями, вы должны принять и заложенный в них механизм поведения в исключительных ситуациях. Иначе - можно воспользоваться ф-циями работы с базой напрямую или собственными обертками.

Этими же ф-циями уже, наверняка, кто-то пользуется и ожидает от них именно такого поведения, потому править не совсем корректно. Можно разве что более детально документировать их поведение.

P.S. С наводящим вопросом вы попали как раз в точку)) По работе я могу проводить code review нескольких коммитов ежедневно, и потому - да, я чаще вычитываю текст ф-ций перед их использованием, особенно если сразу по описанию становится понятно, что оно не охватывает все кейсов ее использования.
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Программный код - качество и пояснения

Сообщение LutsenkoDenis » Чт сен 24, 2015 6:45 pm

olehs писал(а):В этом как раз и был мой вопрос: какой массив строк может вернуть ф-ция Select в случае ошибки SQL?
На вскидку вижу два варианта: 1. Пустой массив 2. Exception который я могу дальше в коде как-то обработать.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Программный код - качество и пояснения

Сообщение LutsenkoDenis » Чт окт 08, 2015 5:48 pm

Файл: /lib/object.class.php
  1. Почему в данном коде используется лайк а не равно?

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

    $rec = SQLSelectOne("SELECT objects.* FROM objects WHERE TITLE LIKE '".DBSafe($name)."'");
  2. Откуда появляется переменная value в функции gg? Зачем она передаётся в функцию getGlobal? Если смотреть в код, то видно что getGlobal принимает только один параметр.

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

    function getGlobal($varname)
    {
    ...
    }
    
    function gg($varname)
    {
       return getGlobal($varname, $value);
    }
  3. Файл: /lib/jTemplate.class.php Зачем в данной функции делается return?

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

    public function parseBlocks(&$res, &$hash)
    {
       ...
       return $res;
    } 
Последний раз редактировалось LutsenkoDenis Пт окт 09, 2015 2:57 pm, всего редактировалось 1 раз.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Программный код - качество и пояснения

Сообщение LutsenkoDenis » Пт окт 09, 2015 2:17 pm

Ну и это...

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

   public function codeParams($in)
   {
      $res_str = '';
      $res_str = '';
Присвоить переменной пустое значение. Я сказал присвоить переменной пустое значение!!! :)
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Программный код - качество и пояснения

Сообщение sergejey » Пт окт 09, 2015 3:36 pm

LutsenkoDenis писал(а):Файл: /lib/object.class.php
  1. Почему в данном коде используется лайк а не равно?
  2. Откуда появляется переменная value в функции gg? Зачем она передаётся в функцию getGlobal? Если смотреть в код, то видно что getGlobal принимает только один параметр.
  3. Файл: /lib/jTemplate.class.php Зачем в данной функции делается return?
  4. Присвоить переменной пустое значение.
1. Лайк для того, чтобы имена объектов (свойств, методов и т.п.) использовать независимо от регистра
2. value лишнее
3. тоже лишнее
4. тоже лишнее

пункты 2-4, как говорят, "на тягу не влияет", но поубирал.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Ответить