1. C# / Говнокод #14987

    +131

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    private void аффинныйШифрToolStripMenuItem_Click(object sender, EventArgs e)
    {
                foreach (Form childForm in MdiChildren)
                {
                    childForm.Close();
                }
                foreach (Form f in this.MdiChildren)
                {
                    return;
                }
                Affiniy af = new Affiniy();
                af.TopLevel = false;
                af.Show();
                tabPage1.Controls.Add(af);
                af.WindowState = System.Windows.Forms.FormWindowState.Maximized;
    }

    Попросили посмотреть код. 15 методов с различными простейшими шифрами, но чудо foreach -> return, присутствует в каждом. И не лень кому-то было...

    Запостил: MoN, 26 Февраля 2014

    Комментарии (42) RSS

    • показать все, что скрыто"C" и все его модификации - говно.
      Ответить
    • tabControl состоящий из 1-й вкладки
      tabPage1.Controls.Add(af);

      случайно был найден аналог MDI
      Ответить
    • > foreach -> return
      Автор пришел из мира SQL :)
      Ответить
      • а вдруг из хачкеля
        Ответить
        • Ну в хачкеле семантика у ретурна не такая...

          А форич с ретурном это стандартная идиома в хранимках...
          Ответить
          • не видел такой идиомы
            Ответить
            • Ну бежишь по результату какого-то запроса foreach'ем, делаешь внутри цикла какой-то сложный рассчет и возвращаешь запись return'ом. Примерно так:
              BEGIN
                  FOR r IN ... LOOP
                      -- делаем что-то сложное и страшное
                      -- ...
                      IF заебись THEN
                          RETURN NEXT текущую строку выхлопа
                      END IF
                  END LOOP
                  RETURN;
              END
              Ответить
              • постгрешно
                btw, стрёмные ассоциации - return next означает отложенный возврат текущей строки курсора
                вроде ж субд без блядского 100 летнего багажа, неужели нельзя было адекватное слово подобрать, чтобы не приходилось в хелп лезть

                и да, зачем так держаться за единственную точку выхода из функции?
                Ответить
                • > постгрешно
                  А в оракле так не делают?

                  > стрёмные ассоциации
                  Ну да, согласен, next там вообще не в тему.

                  > зачем так держаться за единственную точку выхода из функции?
                  Хм, return где угодно можно сделать, единственная точка выхода не требуется.
                  Ответить
                  • > в оракле
                    return next? нет, не видел
                    сделал return foobar; и всего делов
                    как и в любом другом языке, когда логика требует выхода из подпрограммы, а ты находишься в цикле
                    Ответить
                    • > как и в любом другом языке, когда логика требует выхода из подпрограммы, а ты находишься в цикле
                      Ну и в слонике если написать return foobar, то он вернет этот foobar и процедура закончится.

                      > сделал return foobar; и всего делов
                      Но ведь это вернет одну строку. А если надо, чтобы процедура вернула курсор много строк?
                      Ответить
                      • хочешь вернуть курсор - возврати курсор
                        ещё есть вариант вернуть коллекцию
                        а ещё есть pipelined functions вместо того, чтобы оперировать подрезультатами целиком
                        ещё можно включить голову и избавиться от pl/sql вообще - есть куча аналитических функций, всякие партишены и moving window - и наверняка будет быстрее, чем переключать контекст из sql в pl/sql
                        Ответить
              • Фу-фу-фу так делать.
                Ответить
                • Да SQL и придумали как раз чтобы не писать такого.
                  Ответить
                  • Были бы еще в sql алиасы для подвыражений, чтобы юзать их вместо копипасты огромной хуйни или select from select...
                    Ответить
                    • ты имеешь в виду
                      with 
                          foo as (select * from bar),
                          baz as (select * from foo)
                      select * from baz;
                      Ответить
                      • думаю, имеются ввиду некие параметризируемые "макросы":
                        let foo x y = select * from
                          employees where name = x
                          and age > y
                        in select * from foo("Vasya Govnukov", 23)
                        Ответить
                        • параметризованные вьюхи это вообще беда
                          очень ценная вещь, а приходится реализовывать через жопу, в 2014-то году

                          в оракле - приходится инициализировать и юзать переменные, объявленные в пакете
                          Ответить
                          • > параметризованные вьюхи это вообще беда
                            В постгресе можно накостылить той фигней, которую я показывал выше, через return next в foreach ну или через return query...

                            Правда хер бы знал, как это скажется на производительности...
                            Ответить
                            • я экспериментировал с pipelined functions, чтобы параметризовывать отчеты
                              фактически, получалось гораздо медленнее, чем джойнить невъебенные таблицы с индексами
                              оптимизатор свое дело знает

                              pipelined, видать, нужно только действительно, когда надо строить длинный параллелизуемый конвейер из таких функций
                              Ответить
                      • > ты имеешь в виду
                        Примерно вот такое:
                        select
                            x,
                            (select some long shit from foo where some cond) as y,
                            (select another long shit from foo where some cond) as z
                        from
                            bar
                        where
                            (select some long shit from foo where some cond) >= 50 and
                            (select another long shit from foo where some cond) <= 42
                        Оно, конечно, вполне решается через select-from-select, или select-from-херня-описанная-в-with, но читается ужасно ;(
                        Ответить
                        • очевидно, подзапросы в where должны неким образом параметризоваться от текущей строки bar, иначе смысла немного
                          и раз ты выносишь в результат то же самое (или, возможно, почти то же самое), что происходит в подзапросе, я бы тупо джойнил, делал очевидные where и так получал всё, что нужно, написав длинный непонятный подзапрос единожды
                          Ответить
                          • > параметризоваться от текущей строки bar
                            Само собой.

                            > я бы тупо джойнил
                            А это вариант... спасибо... я над этим подумаю. В having'е условия будут хоть и копипастные, но простенькие и понятные...

                            Правда если этот some long shit содержит case, то жопа остается ;(
                            Ответить
                            • А ведь "C#" и подобные ему - полное говнище, не в пример "PHP".
                              Ответить
                              • Въебал плюс. Пойду переучиваться на пых.
                                Ответить
                                • Да, переучись. Начни сразу вместе с "PHPDevelStudio".
                                  Потом с леденящим ужасом будешь вспоминать дни, когда ты программировал на системных языках.
                                  Ответить
                        • > select
                          > x,
                          > (select some long shit from foo where some cond) as y,
                          > (select another long shit from foo where some cond) as z
                          >from
                          > bar

                          Фу-фу-фу так делать. Дефекейстра дело говорит с джоинами.
                          Ответить
                          • Да у меня с sql всегда проблемы. Я с ним довольно редко работаю, поэтому и опыта нету в этих делах.
                            Ответить
                • > Фу-фу-фу так делать.
                  Ну тогда остается только тащить всю мало-мальски нетривиальную логику в приложение ;(
                  Ответить
                  • > Ну тогда остается только тащить всю мало-мальски нетривиальную логику в приложение ;(
                    Дык, так и надо. Пусть база данных останется тихим и уютным хранилищем.
                    Ответить
                    • так и надо в 90% случаев
                      Ответить
                    • >Пусть база данных останется тихим и уютным хранилищем.
                      >DBdev
                      какой-то ленивый разработчик БД
                      Ответить
                      • > какой-то ленивый
                        Не ленивый, а open-minded.

                        Слишком много я повидал говна, которое пытались запихнуть на сторону БД.

                        Вы даже не представляете с каким огромным удовольствием я реализовываю логику на application level, вместо запихивания всего этого в БД.

                        Разве это похоже на пчёлы против мёда?
                        Ответить
    • да тут говна больше, чем в приведенном куске.
      Ответить
    • И что пытался этим кодом сказать нам автор? Ведь при первой итерации по второму циклу будет выполнен return, зачем foreach нужен?
      Ответить

    Добавить комментарий