Имя пользователя:

Пароль:


Список форумов ПРАКТИЧЕСКИЕ ВОПРОСЫ Работа Программирование и IT Просмотров: 702

Элегантное программирование: Не дублируйте код в циклах


Давим клаву за бабло
  #1
Сообщение 29 Dec 2013, 12:23
Ursego Аватара пользователя
СОЗДАТЕЛЬ ТЕМЫ
Canada, Ontario
Город: Toronto
Стаж: 11 лет 7 месяцев 26 дней
Постов: 10707
Лайкнули: 3448 раз
Карма: 33%
СССР: Днепропетровск
Пол: М
Лучше обращаться на: ты
Заход: 20 Nov 2023, 18:00

Не дублируйте код в циклах

Не присваивайте значение переменной, контролирующей цикл, дважды (перед циклом и внутри него). В большинстве случаев достаточно сделать это только один раз - внутри тела цикла.

Вы, наверно, спросите - почему? Ведь это дублирование можно найти почти в любой книге по программированию! Мой "неофициальный" ответ прост: зачем писать дважды то, что для достижения той-же цели может быть написано один раз? Ну, а "официальный" ответ вам и так известен: избегайте любое дублирование кода.

*** Не рекомендуется: ***

PB:
long ll_row = 0

ll_row = dw_cust.GetNextModified(ll_row, Primary!)
do while ll_row > 0
   [do something with the modified row]
   ll_row = dw_cust.GetNextModified(ll_row, Primary!)
loop

PL/SQL:
FETCH emp_cursor INTO v_row;
WHILE emp_cursor%FOUND LOOP
   [do something]
   FETCH emp_cursor INTO v_row; -- deja vu! :-)
END LOOP;

Бесконечный цикл (while (1=1), for(;;), do while true и т.п.) с break (или exit when, специфичным для PL/SQL) - самое элегантное решение в этой ситуации::

*** Рекомендуется: ***

PB:
long ll_row = 0

do while true
   ll_row = dw_cust.GetNextModified(ll_row, Primary!)
   if ll_row < 1 then exit
   [do something with the modified row]
loop

PL/SQL:
LOOP
   FETCH emp_cursor INTO v_row;
   EXIT WHEN emp_cursor%NOTFOUND; -- or "IF emp_cursor%NOTFOUND THEN BREAK;"
   [do something]
END LOOP;

Вам есть что сказать по этой теме? Зарегистрируйтесь, и сможете оставлять комментарии
cron