выход функции в двух моментах:сразу в начале, а если нет, то
От: TheAteist  
Дата: 29.05.10 09:00
Оценка:
Вопрос:
Специалист А утверждал — выход из фунуций по середине кода затурдняют чтение кода и ее проверки, и поэтому надо запретить такой подход.
Специалист Б утверждал — часто функция распознает когда не стоит продолжать выполнение и лучше выйти сразу, в противном случае код получается запутанным.
В качесте компромисса, было решено разрешать функциям выход только в двух моментах: сразу в начале, а если нет, то в конце.
Надо подумать как можно реализовать это предложение. И какой синтаксис можно предложить.

Я не очень понял в чем вопрос, т.к., по моему ответ в самом вопросе. Надо проверить в начале, а если нет, то в конце. Или я что-то не так понял???
Буду рад лубому решению.

Спасибо
Re: выход функции в двух моментах:сразу в начале, а если нет
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 29.05.10 09:44
Оценка: +1
Здравствуйте, TheAteist, Вы писали:

TA>Вопрос:

TA>Специалист А утверждал — выход из фунуций по середине кода затурдняют чтение кода и ее проверки, и поэтому надо запретить такой подход.
TA>Специалист Б утверждал — часто функция распознает когда не стоит продолжать выполнение и лучше выйти сразу, в противном случае код получается запутанным.
TA>В качесте компромисса, было решено разрешать функциям выход только в двух моментах: сразу в начале, а если нет, то в конце.
TA>Надо подумать как можно реализовать это предложение. И какой синтаксис можно предложить.

TA>Я не очень понял в чем вопрос, т.к., по моему ответ в самом вопросе. Надо проверить в начале, а если нет, то в конце. Или я что-то не так понял???

TA>Буду рад лубому решению.

TA>Спасибо


В принципах структурного программирования закреплено что подпрограмма должна иметь одну точку входа и одну точку выхода.
При наличии исключений это правило нарушается, поэтому париться строго об одной точке выхода не стоит. Если подпрограмма не может сделать свою работу, то она должна выкидывать исключение как можно раньше. Чтобы не возникало проблем с читаемостью просто делайте короткие подпрограммы, которые умещаются на одном экране стандартным шрифтом.
Re: выход функции в двух моментах:сразу в начале, а если нет
От: minorlogic Украина  
Дата: 29.05.10 11:57
Оценка:
Вопрос то озвучьте ?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re: выход функции в двух моментах:сразу в начале, а если нет
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.05.10 12:48
Оценка: +1
Здравствуйте, TheAteist, Вы писали:

TA>Специалист А утверждал — выход из фунуций по середине кода затурдняют чтение кода и ее проверки, и поэтому надо запретить такой подход.


Если речь о структурном программировании, то там говорится не только о функциях, а б структурах кода. Это могут быть и управляющие конструкции циклов, операторы ветвления. Запрещается использовать любые формы выхода из этих конструкций, т.е. "return", "break", "continue", "goto". Исключения тоже можно присоединить к способам покинуть структуру кода.

Посмотрим на способы достижения этой цели. Возьмем для примера простенькую функцию сравнения двух чисел, которая может сгодиться для сортировки.
int Compare1(float a, float b)
{
    if (a == b)
        return 0;
    if (a < b)
        return -1;
    return 1;
}

int Compare2(float a, float b)
{
    int result = 0;
    if (a != b)
    {
        if (a < b)
           result = -1
        else
           result = 1;
    }
    return result;
}


Вот собственно есть что сравнить (нарочно не стал использовать тройственный оператор). Для достижения единственности точки выхода пришлось ввести изменяемое состояние и увеличить вложенность ветвления. То ли еще будет, когда придется столкнуться с вложенными циклами. Там наверняка придется вводить флаги. ИМХО, в читаемости мы потеряли.

Однако, работаю с человеком, который предпочитает придерживаться правила single point of entry and exit. И вариант Compare2 для него понятнее, если он не шутит.

Так что, прежде чем думать над компромиссом, советую хорошо подумать, следует ли придерживаться такого правила. Возможно устроить голосование (в команде и/или на форуме).
Re: выход функции в двух моментах:сразу в начале, а если нет
От: vsb Казахстан  
Дата: 29.05.10 13:10
Оценка: +5
Если честно, никогда не понимал этого правила. Оно разумно в C, когда надо в конце функции освобождать ресурсы, и всякие return-ы в середине легко приводят к утечкам. В современных ЯП оно не нужно, имхо.
Re[2]: выход функции в двух моментах:сразу в начале, а если
От: TheAteist  
Дата: 29.05.10 15:45
Оценка: -2
Здравствуйте, gandjustas, Вы писали:

G>В принципах структурного программирования закреплено что подпрограмма должна иметь одну точку входа и одну точку выхода.

G>При наличии исключений это правило нарушается, поэтому париться строго об одной точке выхода не стоит.
G>Если подпрограмма не может сделать свою работу, то она должна выкидывать исключение как можно раньше.
Так вместо того, чтоб выкидывать исключение можно же сделать return "ERROR". Как же это решение(выкидывать исключение) решает задание — "...реализовать это предложение..."?
G>Чтобы не возникало проблем с читаемостью просто делайте короткие подпрограммы, которые умещаются на одном экране стандартным шрифтом.
Re[2]: выход функции в двух моментах:сразу в начале, а если
От: TheAteist  
Дата: 29.05.10 15:46
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Вопрос то озвучьте ?

Надо подумать как можно реализовать это предложение(Компрамисс который был достигнут). И какой синтаксис можно предложить
Re: выход функции в двух моментах:сразу в начале, а если нет
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 29.05.10 15:59
Оценка: :)
Здравствуйте, TheAteist, Вы писали:

TA>Надо подумать как можно реализовать это предложение. И какой синтаксис можно предложить.

TA>Я не очень понял в чем вопрос, т.к., по моему ответ в самом вопросе. Надо проверить в начале, а если нет, то в конце. Или я что-то не так понял???
TA>Буду рад лубому решению.

Можно предложить не синтаксис, а общий подход к организации тела функции:

type function(params  ...)
{
  try
  {
    // Проверка предусловий
    // ...
    if (!preconditions_ok)
      return some_error;

    type retval = some_initial_value;
    // Содержательная часть функции
    // ... ...
    retval = some_value;
    // ... ...

    // Возврат значения
    return retval;
  }
  catch(...)
  {
    // Непредвиденные ситуации
    handle_all_exceptions();
  }
}



TA>Спасибо
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[3]: выход функции в двух моментах:сразу в начале, а если
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 29.05.10 16:03
Оценка:
Здравствуйте, TheAteist, Вы писали:

TA>Здравствуйте, gandjustas, Вы писали:


G>>В принципах структурного программирования закреплено что подпрограмма должна иметь одну точку входа и одну точку выхода.

G>>При наличии исключений это правило нарушается, поэтому париться строго об одной точке выхода не стоит.
G>>Если подпрограмма не может сделать свою работу, то она должна выкидывать исключение как можно раньше.
TA>Так вместо того, чтоб выкидывать исключение можно же сделать return "ERROR".
А что такое ERROR?
Re: выход функции в двух моментах:сразу в начале, а если нет
От: l33thaxor  
Дата: 29.05.10 16:46
Оценка: :))) :))
"Специалисты" пудрят тебе мозги, чтобы пока ты парился с тем, как выходить из функций, они могли спокойно, без вмешательств со стороны новичков спроектировать всю остальную систему.
Re[3]: выход функции в двух моментах:сразу в начале, а если
От: minorlogic Украина  
Дата: 29.05.10 16:51
Оценка:
Здравствуйте, TheAteist, Вы писали:

TA>Здравствуйте, minorlogic, Вы писали:


M>>Вопрос то озвучьте ?

TA>Надо подумать как можно реализовать это предложение(Компрамисс который был достигнут). И какой синтаксис можно предложить

Сильно зависит от языка програмирования и инструментов. Например LINT предполагаю можно научить ловить несколько точек выхода.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[4]: выход функции в двух моментах:сразу в начале, а если
От: TheAteist  
Дата: 29.05.10 18:41
Оценка: -1
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, TheAteist, Вы писали:


TA>>Здравствуйте, gandjustas, Вы писали:


G>>>В принципах структурного программирования закреплено что подпрограмма должна иметь одну точку входа и одну точку выхода.

G>>>При наличии исключений это правило нарушается, поэтому париться строго об одной точке выхода не стоит.
G>>>Если подпрограмма не может сделать свою работу, то она должна выкидывать исключение как можно раньше.
TA>>Так вместо того, чтоб выкидывать исключение можно же сделать return "ERROR".
G>А что такое ERROR?
Error это переменная например обозначающая ошубку. Ты предлагаешь выкидывать исключение. Так вот, я говорю, что вместо того, чтоб выкидывать исключение можно же сделать return "ERROR"
Re[4]: выход функции в двух моментах:сразу в начале, а если
От: TheAteist  
Дата: 29.05.10 18:43
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Здравствуйте, TheAteist, Вы писали:


TA>>Здравствуйте, minorlogic, Вы писали:


M>>>Вопрос то озвучьте ?

TA>>Надо подумать как можно реализовать это предложение(Компрамисс который был достигнут). И какой синтаксис можно предложить

M>Сильно зависит от языка програмирования и инструментов. Например LINT предполагаю можно научить ловить несколько точек выхода.

Ну наприме в С++ или С#. Только в моем случае это не несколько точек выхода, а только 2 — сразу вначале или в конце
Re[2]: выход функции в двух моментах:сразу в начале, а если
От: TheAteist  
Дата: 29.05.10 18:45
Оценка:
Здравствуйте, l33thaxor, Вы писали:

L>"Специалисты" пудрят тебе мозги, чтобы пока ты парился с тем, как выходить из функций, они могли спокойно, без вмешательств со стороны новичков спроектировать всю остальную систему.

это на учеба такой вопрос задали
Re: выход функции в двух моментах:сразу в начале, а если нет
От: Roman Odaisky Украина  
Дата: 29.05.10 19:42
Оценка:
Здравствуйте, TheAteist, Вы писали:

TA>Специалист А утверждал — выход из фунуций по середине кода затурдняют чтение кода и ее проверки, и поэтому надо запретить такой подход.

TA>Специалист Б утверждал — часто функция распознает когда не стоит продолжать выполнение и лучше выйти сразу, в противном случае код получается запутанным.

А тем временем во многих языках предусмотрены сопрограммы, которые выходят из одной и той же функции по многу раз (и заходят обратно).
До последнего не верил в пирамиду Лебедева.
Re[5]: выход функции в двух моментах:сразу в начале, а если
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 29.05.10 21:08
Оценка: +1 -1
Здравствуйте, TheAteist, Вы писали:

TA>Здравствуйте, gandjustas, Вы писали:


G>>Здравствуйте, TheAteist, Вы писали:


TA>>>Здравствуйте, gandjustas, Вы писали:


G>>>>В принципах структурного программирования закреплено что подпрограмма должна иметь одну точку входа и одну точку выхода.

G>>>>При наличии исключений это правило нарушается, поэтому париться строго об одной точке выхода не стоит.
G>>>>Если подпрограмма не может сделать свою работу, то она должна выкидывать исключение как можно раньше.
TA>>>Так вместо того, чтоб выкидывать исключение можно же сделать return "ERROR".
G>>А что такое ERROR?
TA>Error это переменная например обозначающая ошубку.
Есть функция, которая что-то считает, там возникает деление на ноль, или взятие корня из отрицательного числа. Какое значение будет у переменной Error?

TA>Ты предлагаешь выкидывать исключение. Так вот, я говорю, что вместо того, чтоб выкидывать исключение можно же сделать return "ERROR"

Неправильно ты говоришь. Можешь сразу признать это, а можем продолжить дискуссию и ты поймешь что ты неправ.
Re[5]: выход функции в двух моментах:сразу в начале, а если
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.10 17:12
Оценка:
Здравствуйте, TheAteist, Вы писали:

TA>Error это переменная например обозначающая ошубку. Ты предлагаешь выкидывать исключение. Так вот, я говорю, что вместо того, чтоб выкидывать исключение можно же сделать return "ERROR"


Это значит, что нужно обрабатывать ошибку на месте вызова или же передавать её наверх.

Т.е. выполнять нужно две задачи — обработку ошибки и диспетчеризацию на обработку.

В ряде случаев, так и делается, ибо это необходимость. Напрмиер если ты посмотришь, все win32 функции возвращают BOOL а COM возвращают HRESULT. А функции на каждый системый вызов проверяют результат и обрабатывают.

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

Исключения позволяют локализовать обработку ошибок в конкретном слое. Т.е. они полностью берут на себя диспетчеризацию ошибок, при этом глубина вложенности вызовов значения не имеет

Соответственно этим можно воспользоваться и исключить из кода не только диспетчеризацию, но и обработку ошибок.

Все это приводит к чистоте кода, а это в свою очередь приводит к повышению качества софта.
Re: выход функции в двух моментах:сразу в начале, а если нет
От: CreatorCray  
Дата: 30.05.10 17:36
Оценка:
Здравствуйте, TheAteist, Вы писали:

TA>Специалист Б утверждал — часто функция распознает когда не стоит продолжать выполнение и лучше выйти сразу, в противном случае код получается запутанным.

ИМХО это мнение является верным.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: выход функции в двух моментах:сразу в начале, а если
От: Тролль зеленый и толстый  
Дата: 30.05.10 21:31
Оценка: -2
Можно пример "чистоты"?

Чем

Result result = SomeFunction();
if (result == Result.Error)
{
    ... 
}


принципиально отличается от

try
{
    SomeFunction()
}
catch (Exception exception)
{
    ...
}


?
Re[7]: выход функции в двух моментах:сразу в начале, а если
От: alexeiz  
Дата: 31.05.10 03:02
Оценка:
Здравствуйте, Тролль зеленый и толстый, Вы писали:

ТЗИ>Можно пример "чистоты"?


ТЗИ>Чем

...
ТЗИ>принципиально отличается от
...
ТЗИ>?

толсто
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.