1. Pascal / Говнокод #12472

    +98

    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
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    Сижу такой набираю код
    
    program Project6;
    
    {$APPTYPE CONSOLE}
    var i,j: integer;
    
    begin
      repeat
        readln(j);
        i := 0;
        if (j=0) then
          i := 1
        else
          break;
        Writeln(i);
      until false;
    end.
    [Hint] : Value assigned to 'i' never used
    
    Ну ладно, похер, уберу
    
    program Project6;
    
    {$APPTYPE CONSOLE}
    var i,j: integer;
    
    begin
      repeat
        readln(j);
       // i := 0;
        if (j=0) then
          i := 1
        else
          break;
        Writeln(i);
      until false;
    end.
    [Warning] : Variable 'i' might not have been initialized
    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                 _________________                                  
                     g@@@@@44444*********9444@@@@@@@@@@@Mggg__                      
                   g@M"         _an**"""""""**Vw=G______"%%@@@@@gg_                 
                 ,@@`        a^"  __a=~v-vvv~~,___         _____`"*@gg_             
                a@@       _M" _m*"` _______     `""""""""""`    "   "9@g_           
                @@      a" ,m"_ar*"'`     -,         ,amv****-~,       9@g          
               @@        .* u"              C         ,~        "\       @          
              d@           '    __gg____              `                  @y         
             g@             ,g@@@@@@@@4@@gg_          C   ______         9@g        
           g@@.>~.     __  a@""@@@@@@__  "9@g         ,g@@@@**4@@_        "@g_      
         g@"$-*"""     *Y, @@@@*""**4@@@g__$@C     ggg@@@@@@@@@@*" "'" ""Mg`8@g     
       g@",`  ,g@@@@@@@g_       _g@     ""@M"      `"@@"                *n_"C"@@    
      g@'    p@"    ,`"@@@ggggg@@"                   8]      ,_  _gM@@@@g ' 'C8@    
      @@    j@     8@_    `"""'                      8@g_    3@g@@@`,  `"    ][@    
      @L    8@  _g@@@@@gg_              _gMMy         "9@g_    `""' 8L       j8@    
      @k    3@ d@@@@   "@@@gg_   *""""" @"``___         '@@g_       @@C  n"  Q@     
      "@C $  9k    @@_    "8@@@@gg_     @g_fM4@@M      g@""" "n.   a@@@  _m*3@"     
       "@g N,      9@@gg_  8@ `""9@@@gg__"         8gg@M        _g@@@d@k   a@%      
        "@@g_'      "@@@@@@@@g_     `"8@@@@ggg____  ""`   ___gg@@@@ 8@@@   @@       
          "@g_       '@g `"@@@@gg__   @L  `"""4@@@@@@@@@@@@@@@@"  @C @@@  3@        
            9@_       `@g  3@"9@@@@@@g@        [@     @@     4@y  @kg@@@  [@        
             9@         8@gd@   '"9@@@@@@@gggggd@gggggd@gggggg@W@@@@@@@@  [@        
              8g         "@@g        @""9@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F  [@        
               @g          "@@g_    d@     '""@@@@@@@@@@@@@@@@@@@@@@@$@   3@        
               `@g_          "@@@g_j@'        @C  ``"3@@"""8@""j@'j@g@@   3@        
                 9@g_ ~__ ~._  `"@@@@g_       @C     8@   g@^ p@^ "@@M     @C       
                   "@@g "9m_ "Nq_  "*@@@@ggggg@______@____@@gg@@@@@M"      @L       
                     "9@@g_`"Mm_`"Nq_   """"*4@@@@@@@@@@M@@4*"""'          8k       
                        "9@@g_ ""Mm_"*w__       ~~~~ aaa~~        _/       $@       
                           `"@@gg_  "*WG_"*w~.____          ___am*"    /   [@       
                               "*@@gg    `"*-~<.__         `       __M"    3@       
                                   "9@gg_         `""'** ------**""`       d@       
                                      `"@@ggggg__                        ,d@        
                                          ""9@@@@@gg__                __g@"         
                                                 `""*4@@@@MggggggggM@@@@"           
                                                         `""""""""""'

    Запостил: TarasB, 24 Января 2013

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

    • тьфу блин j=0 в скобки зачем-то заключил, совсем обкрестоблядился
      Ответить
      • Я в школе тоже на уроках информатики писал всегда if (j = 0) then
        Ответить
      • И точку с запятой перед until и end поставил.
        Ответить
        • А там как раз я её ставил всегда.
          Ответить
          • Ну в паскале, кстати, со скобками другая жопа есть:
            if a < 10 then { тут скобок не надо }
            if (a < 10) or (a > 20) then { зато они нужны тут }
            Сказывается то, что и побитовый и логический and это один оператор с одним приоритетом. В результате, в таких выражениях скобок надо ставить больше чем в сях.
            Ответить
      • > тьфу блин j=0 в скобки зачем-то заключил
        Ах тыж крестушок! Как ты мог предать свои корни?
        Ответить
    • Ты перед repeat воткни i := 0;
      Ответить
    • Ну туповат компилятор, что с него взять.

      В первом случае с горем пополам сумел продраться через все ветки ифа и понять, что i:=0 или перебивается i:=1 или вообще не используется из-за break, и выдал вполне корректный хинт.

      Во втором случае почему-то он до этой мысли уже не допёр... Видимо за оба ворнинга отвечают два разных алгоритма, написанных разными людьми.

      P.S. Напомнило историю с HP1018 и говнококабелем в комплекте:
      Включаю в режиме usb 2.0: "неизвестное устройство" и нихрена не работает
      Переключаю на usb1.1: "это устройство может работать быстрее *trollface.png*"
      Ответить
      • Во-во, почему-то за неиспользуемые и за неиинициализированные переменные проверка явно делается двумя разными способами!
        Я пробовал делать то же самое без цикла с exit вместо break; но тогда одно из предупреждений таки исчезало.

        Кстати смотрю я на рейтинг кода, типа что такое, никто не оценивает, потом курсор навёл на цифру, и тут нифига себе.
        Ответить
        • > и тут нифига себе.
          Дельфиненависники и дельфи любители.
          Ответить
          • Тарасоненависники и тарасолюбители.
            Ответить
            • Тарасофаги.
              Ответить
            • > Дельфиненависники и дельфи любители.
              Тут суть в том, что есть Дельфиненависники. Думаю понятно кто это. Это все, кто не относится ко второй группе. А есть дельфи любители. Они любят дельфи, но они пока лишь любители. Но с ростом профессионализма они переплывут эту реку Cтикс из царства мертвой царевны Дельфии Борл`андской.
              Ответить
        • > Во-во, почему-то за неиспользуемые и за неиинициализированные переменные проверка явно делается двумя разными способами!
          Да у тебя же батхерт!
          Ответить
        • Да рука тянулась к минусу вместо плюса, но проблема с компилерами имеет место быть.
          Ответить
          • Блин, плюсики перевешивают, минусики больше не пополняются, народ, помогите минусикам!
            Ответить
    • > program Project6;
      Дух делфи... напоминает мне о временах, когда одногруппники просили помочь с лабой/курсовиком... а там вся прога в этих project1, button5, form2... и я матерился, не понимая, как можно страдать таким мазохизмом, когда без подглядки на форму нельзя понять, что за кнопка упоминается в коде...
      Ответить
      • > program Project6;
        Это дух паскаля ))
        Ответить
        • Паскаль тут не причем. Сам по себе паскаль имен не выдумывает, и в сферическом паскале в вакууме название проги пишет сам автор.

          А Project6/Button3 это именно фишка дельфиньего IDE, которое генерит имена в таком стиле, и самих дельфинов, которым влом его переименовать...
          Ответить
          • У меня есть отдельная папка с одноразовыми проектами, состоящими из 2 файлов максимум, иногда бывает что они мне нужны снова, поэтому я их не заменяю, а создаю в ней же новый, ну и называю я их соответственно Project1,Project2,... а если в них есть модули (у формошлёпов), то я их называю Pr3u1, Pr3u2 итд
            Ответить
            • Ну одно дело одноразовый проект на потестить, а другое все-таки что-то что приходится пилить неделю и больше. Для одноразового само собой сойдет и такое говноимя.
              Ответить
              • Как вы и говорили, @bormand, write-n-forget style.
                Ответить
              • Я даже одноразовый проект если делаю, переименовываю сразу, пишу в своём обычном стиле-нотации, всем компонентам, классам, переменным даю осмысленные имена. И даже иногда оно попадает в бэкапы.
                Вот что значит - разработка меня испортила.
                Ответить
                • А мне стыдно, у меня весь project-euler назван в стиле task185, task186 и т.п., а внутри по-быстрому написанное говнецо и немного описаний, чтобы не забыть как задачку решал...

                  P.S. А вот все остальное, кроме мелких тестиков (которые я кидаю в /tmp и линукс их оттуда вычищает на следующий день) я стараюсь называть осмысленно, но в сурсконтрол попадает только что-то уж совсем серьезное.
                  Ответить
                  • и как, времени хватает на лишнюю работу?
                    Ответить
                    • На переименование файлика то?
                      Ответить
                      • на прохект-еулер
                        у меня последние 2 месяца на работе такой завал, что даже код ревью у комсомольцев сделать некогда
                        отвлекаюсь только на говнокод - последний рубеж, который нельзя сдавать
                        Ответить
                        • Ну проект-эйлер урывками получается: и по несколько месяцев перерывы, и по полгода. Его же надо на свежую голову, не загруженную траблами на работе, и под соответствующее настроение...
                          Ответить
    • В жаве есть похожая хрень от слишком умного компилера.
      Когда
      final static A a;
      static{
           try{  
               a=somethingSomethingSomething();
           }catch(SomethingException){
               a=null;
           }
      }
      Ответить
      • Видимо из-за того, что не все экцепшены пойманы? При рантайм экцепшене она не будет проинициализирована... хотя с другой стороны - а кого это волнует, в этом случае и читать переменную будет некому.
        Ответить
      • Омг. Скомпилил этот код: variable a might already have been assigned. Я то думал, что там будет Variable a might not have been initialized.
        Ответить
        • Отож.
          Ответить
        • Интересно, неопределённый артикль стоит после существительного.
          Ответить
        • Он хочет сказать, что a=null лишнее?
          Ответить
          • Не совсем. Он хочет сказать что a = null может оказаться вторым присваиванием переменной a (если вылетит исключение сразу после присваивания a?). А для final'а такая ситуация запрещена. Поэтому, кстати, эта херь показана как ошибка а не как предупреждение.

            P.S. А если все-таки a=null убрать - будет вот такая ошибка: variable a might not have been initialized.
            Ответить
            • >А если все-таки a=null убрать - будет вот такая ошибка: variable a might not have been initialized.
              И если дописать
              final A a=null;
              То оно тоже не скомпилится. Отака хуня.
              Ответить
              • Радует, что все-таки можно подпереть костылем, и оно будет работать:
                final static A a;
                static{
                     A aTmp = null;
                     try{  
                         aTmp=somethingSomethingSomething();
                     }catch(SomethingException){
                     }
                     a = aTmp;
                }
                P.S. Но необходимость писать костыли не особо радует.
                Ответить
                • Некошерно.
                  Ответить
                  • А если вот так? https://ideone.com/M9Uj0q
                    Ответить
                    • Жава не умеет в краткость.
                      Собственно я и использую джва варианта
                      static final A a=a();
                          public static A a() {
                              try {
                                  return somethingSomethingSomething();
                              } catch (Throwable e) {
                                  return null;
                              }
                          }

                      Но обычно всё обернуто известным хаком на unchecked.

                      Жуткий ужас, короче.
                      Ответить
                    • Надо ещё назвать это каким-то умным словом, типа tryornull_pattern
                      Вообще в жабе походу половина умных паттернов - это костыли, связанные с убогостью языка.
                      Кстати, интересно там происходит связывание интерфейсов, то есть класс, поддерживающий Callable, об этом не соообщает, тогда что же происходит в new Callable<smth>, поиск метода по имени, или всё-таки всё по-крестоблядски разруливается копулятором?
                      Ответить
                      • Ты не поверишь. Рантайм видит этот метод как public static Object tryOrNull(Callable callable). Т.е. все это разруливается компилятором, который проверяет чтобы ты хуйни не натворил, а затем тупо заменяет все эти дженерики на Object...
                        Ответить
                        • public static final String test = Crutch.tryOrNull(new Callable<String>() {
                                  public String call() throws Exception {
                                      return somethingSomethingSomething();
                                  }
                              });
                          Это какая-то жалкая замена лямбд?
                          Ответить
                          • Ага, это классическая жаболямбда через анонимный класс.
                            Ответить
                      • >походу половина умных паттернов - это костыли, связанные с убогостью языка
                        Ну да. Я пришел к схожим размышлениям.
                        Даже хотел объемный пост сделать с их класификацей.

                        Например паттерны обертки и копипаста: декоратор, адаптер, заместитель, фасад, прокси - это всё суть одно и тоже. Предельно тупой обёрточный код.
                        Возьмем к примеру мапу. Её надо синхронизировать. То что в других языках делается через макросы или лямбды в убогой джабе высирается через паттерн:
                        http://www.docjar.com/html/api/java/util/Collections.java.html
                        private static class SynchronizedMap<K,V>
                          implements Map<K,V>, Serializable {
                                   private final Map<K,V> m;     // Backing Map
                                   final Object      mutex;        // Object on which to synchronize
                           
                                   SynchronizedMap(Map<K,V> m) {
                                       if (m==null)
                                           throw new NullPointerException();
                                       this.m = m;
                                       mutex = this;
                                   }
                           
                                   SynchronizedMap(Map<K,V> m, Object mutex) {
                                       this.m = m;
                                       this.mutex = mutex;
                                   }
                           
                                   public int size() {
                                       synchronized (mutex) {return m.size();}
                                   }
                                   public boolean isEmpty() {
                                       synchronized (mutex) {return m.isEmpty();}
                                   }
                                   public boolean containsKey(Object key) {
                                       synchronized (mutex) {return m.containsKey(key);}
                                   }
                                   public boolean containsValue(Object value) {
                                       synchronized (mutex) {return m.containsValue(value);}
                                   }
                                   public V get(Object key) {
                                       synchronized (mutex) {return m.get(key);}
                                   }
                           
                                   public V put(K key, V value) {
                                       synchronized (mutex) {return m.put(key, value);}
                                   }
                        }
                        Ответить
                        • Хм, а почему в случае, когда передают мутекс, нет проверки на null в m?
                          Ответить
                          • оно ж приватное для пакета.
                            там статический метод. Collections.syncMap(m)
                            Ответить
                            • А, все, разобрался. Верхний метод дергают из публичного статического, поэтому там есть проверка. А нижний используется только в subMap'е у SynchronizedSortedMap, чтобы синхронизация шла по оригинальному мапу, и в этот метод кривые данные никто не передаст.
                              Ответить
                              • Там ужас. 1000 строк говнокода только чтобы синхронизировать не только мап, но еще и подмножества ключей и коллекции значений.

                                А самое смешное что высрали кучу говна, а итераторы вроде у них остались дырявыми и несинхронными.
                                Ну то есть Map->keySet->Iterator (тут дырка).
                                Ответить
                              • Это реально говно достойное отдельного поста: синхронизировали, синхронизировали и высинхронизировали.
                                public ListIterator<E> listIterator() {
                                  return list.listIterator(); // Must be manually synched by user
                                   }
                                  
                                   public ListIterator<E> listIterator(int index) {
                                    return list.listIterator(index); // Must be manually synched by user
                                           }

                                Вот тебе бабушка Тарас и паттерны.
                                Ответить
                                • > Это реально говно достойное отдельного поста: синхронизировали, синхронизировали и высинхронизировали.
                                  Ага, я заметил в этом файле описания и примеры, в которых добавляли синхронайзед на время пробежки по итератору.

                                  Были бы лямбды - можно было бы передать лямбду в какой-нибудь list.doAtomic(), который бы выполнял ее под своим локом. Но поскольку лямбды черезжопные - must be manually synched by user, и костыли костыли костыли...
                                  Ответить
                                • Кстати еще замечательная хуйня - если я вызвал у синксортедмапа subMap, а у того получил итератор, то на время работы итератора мне надо синкаться об основной мап. Т.е. результат субмапа я никуда передать не могу, т.к. вместе с ним придется переть и тот мап из которого он получен ради синхронизации... Инкапсуляция, блять, во все поля...
                                  Ответить
                                  • Да-да-да. Говнище. А называют гордым словом "паттерны".
                                    >Инкапсуляция, блять, во все поля
                                    Точно!
                                    <<структурный шаблон проектирования, предназначенный для сокрытия деталей реализации, абстракции от реализации>>
                                    Ответить
                                    • Code Complete на русском издавалась?
                                      Ответить
                                      • > Code Complete на русском издавалась?
                                        Да, перевели как "Совершенный код": http://www.ozon.ru/context/detail/id/3159814/
                                        Ответить
                • А проблема-то лезет из проверяемых исключений.
                  Изначально я хотел написать всего одну сраную строку:
                  final static A a=somethingSomethingSomething();
                  //somethingSomethingSomething() throws SomethingException

                  а получилось то что у борманда в посте.
                  Ответить
            • А, вон оно чё.
              Что-то получается, что final это какой-то костыль из-за того, что в языке нет конструкции
              a = try dosmth(); catch (...) NULL;
              Ответить
              • Это костыль из-за того, что язык ориентирован на инструкции, а не на выражения. Scala:
                val a = try { dosmth() } catch { _ => null }
                Ответить
              • Мда. Тут вам не немерле или скала.
                Ответить
              • final static - это костыль из-за того, что в языке нет const.
                Ключевое слово такое есть, но только для того, что бы выдавать ошибку, о том, что джава не умеет в него.
                Ответить
                • >final static - это костыль
                  Это _не_ костыль. Наоборот с final всё сделано логично и просто.
                  Минимум ключевых слов. В С# можно и запутаться: sealed, const и readonly. В жабе этот набор заменяет final.
                  Хоть я Вирта недолюбливаю, но минимализм пришедший из Модулы - это хорошо.
                  > только для того, что бы выдавать ошибку, о том, что джава не умеет в него.
                  Как и с goto. Щитаю прально зделали.
                  Ответить
                  • Константность должна быть реализована как в D.
                    Ответить
                    • А что в D такого хорошего придумали?
                      Ответить
                      • > что в D такого хорошего придумали?
                        Ничего.

                        http://dlang.org/enum.html
                        http://dlang.org/const-faq.html
                        http://dlang.org/const3.html
                        Ответить
                        • А оно надо? Код будет засрат const. Прибавляем сюда еще и immutable, который будет использован любителями constов и получаем: "Хотели как лучше, а получилось говно".
                          To make both the return type and the method immutable, you can write:

                          struct S {
                          immutable(int[]) bar() immutable
                          {
                          }
                          }
                          Нигде этого нету, 99% софта написано на языках без этой фичи.
                          А в js вообще никаких констант нету. И живут люди.
                          Ответить
                          • зато когда всё же напишут первый проект на D, он сможет выиграть от оптимизаций многопоточности!
                            Ответить
                            • У вас зеленый тег отклеился!
                              Ответить
                            • Разве на D еще нет проектов?
                              Ответить
                              • Ответ: Ты на говнокоде его видел хоть раз?
                                Ответить
                                • Ну может быть все проекты на нем идеальны, и запостить просто нечего.
                                  Ответить
                                  • Ну да. Как и с хацкилом.
                                    Когда дело дойдет до реально полезного кода - вот тут говно и польется обильным потоком.

                                    Закон работает: количество ошибок говна в программе языке пропорционально его полезности.
                                    Следовательно говна не содержат только никому не нужные языки - brainfuck, D, Haskell, Nemerle.
                                    Ответить
                                    • >Закон работает: количество ошибок в программе пропорционально её полезности.


                                      Исключения составляют программы, учавствующие в космических программах.
                                      Ответить
                                      • Какая нам с того польза?
                                        Ну вот недавно не взлетел марсоход с оборудованием на миллионы долларов.
                                        Ошибка там была или же просто взорвали пустую ракету - никогда не узнает.
                                        Да и обычно о фейлах умалчивают, а говорят обычно в двух случаях: деваться некуда - говно выплыло, бабки отмыть; жить хорошо можно и на земле - не летая в космос.
                                        Ответить
                                        • > в космических программах
                                          ах, боюсь, все полимеры в этой области просраны уже до нас
                                          так, что программисты могут ничего не писать - на результат они не влияют
                                          Ответить
                                          • В управление космическими аппаратами, реакторами, системами метро самолетами и так далее и в прочих областях с очень дорогими ошибками - используют математически доказанные программы. Используют генерацию программы по мат модели. Используют FDD (питушат ошибающихся программистов, например лишают премии, есть доска позора, есть топ три программиста с самым большим числом ошибок в этом месяце и их отчитывают перед всем предприятием навиду на линейке и всячески унижают, а тех кто не ошибается - ублажают конечно).
                                            Ответить
                                            • одно дело теория, другое дело - то, как обстоят дела на самом деле
                                              всё, что ты перечислил - пишут люди
                                              с разной степенью упоротости, конечно
                                              но тем не менее - люди

                                              моя деятельность - примерно в твоем списке
                                              никто никого не петушит, премий не лишают, баги существуют
                                              если в идеальной программе нет бага, это значит, что его пока не нашли
                                              Ответить
                                              • > моя деятельность - примерно в твоем списке
                                                Что если не секрет?
                                                Ответить
                                              • >если в идеальной программе нет бага, это значит, что его пока не нашли

                                                cout<<"Hello world!"<<endl;
                                                Где баг? Его не нашли, но он есть?
                                                Ответить
                                                • > Где баг?
                                                  1) в середине запятую забыл
                                                  2) в многопоточном приложении эта строчка легко может склеиваться с другим выводом: http://liveworkspace.org/code/4G4ORa$0

                                                  > Что если не секрет?
                                                  деанон? нет пути
                                                  от моих багов люди не умрут, и это неплохо
                                                  Ответить
                                                  • > деанон? нет пути
                                                    ничего подробнее фразы: учавствую в проекте системы управления и планирования работы светофорного столба. станет понятно что ты человек важный и если ошибешься, то и человека столбом может придавить
                                                    Ответить
                                                • Баги уже до тебя успели допустить в ядре ОСи и ещё много где, так что любой код может привести к непредсказуемым последствиям. Например, брата убьёт.
                                                  Ответить
                                              • Я б прикинул, если б самого багоплодовитого прогера реально петушили. Это что-то из тюремного, только в камере сидят одни прогеры и в качестве общественно полезной работы пишут код и кто сделал больше багов тот всех подставил
                                                Ответить
                                                • за баги отвечает отдел тестирования
                                                  если они поставили подпись на бумажке, что "тестирование проведено, претензий нет", значит их расстреляют первыми
                                                  Ответить
                                                  • Ты не понел. питушат за поломанные тесты отдела тестирования. если все тесты всегда проходишь, то с программером все норм. насчет того, питушат ли сам отдел тестирования - незнаю. там не работал
                                                    Ответить
                                                  • > за баги отвечает отдел тестирования
                                                    А ты используешь модульные тесты, @defecate-plusplus?
                                                    Ответить
                                                    • > А ты используешь модульные тесты?
                                                      мне стыдно, но практически нет
                                                      это всё лень
                                                      да и не так уж и много у нас ну совсем независимых частей, которые можно так просто взять и обернуть в mock

                                                      а те, которые следует обернуть уже сейчас - их вообще следует выпилить, с позором как недостойные пережитки прошлого, и переписать нормально
                                                      с тестами и блекджеком
                                                      если будут человеческие ресурсы...
                                                      извечные отмазки
                                                      Ответить
                                                      • >> А ты используешь модульные тесты?
                                                        > мне стыдно, но практически нет
                                                        Как? Ты пишешь проект, по твоим словам, где важно не ошибится, но тесты не используешь - ноу вей! Не слышал о таком. Может ты всеже ничего такого не пишешь? Как такое вообще может быть?
                                                        Ответить
                                                        • не все конторы имеют на это ресурс
                                                          нормально обвешанный тестами проект только процентов на 50 будет состоять из реального кода, остальные 50 будут тестами, да и не так просто для некоторых вещей написать эмуляцию всех случаев, сетевые обмены и прочее
                                                          кроме того, компиляция - уже полдела, это не какой-нибудь джаваскрипт в браузерной игре

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

                                                          на гейдеве есть один персонаж, его контора пишет ПО для авиадиспетчерской, и еще один персонаж, чья контора пишет ПО для ядерных реакторов
                                                          спроси их, сколько в штате программистов и всегда ли у них есть время на обвес модульным тестированием
                                                          Ответить
                                                          • Да, особенно сложно протестировать код, который не писался с расчётом не тестирование. Это одна из причин немного думать о тестах во время написания кода. Апологеты TDD скажут, что тесты, конечно, нужно писать заранее, но мне, например, это не всегда удобно, хотя иногда практикую. Ну и конечно 100% покрытие - это обычно маразм.

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

                                                            + возможность жёсткого рефакторинга нутрей без пробуждения в поту по ночам. Перекурочил, прогнал тесты, сделал коммит, пошёл пить чай.
                                                            Ответить
                                                            • все именно так
                                                              Ответить
                                                            • 100% покрытие - это такая сказка, которую тестировщики своим детям на ночь рассказывают.
                                                              Ответить
                                                              • > 100% покрытие
                                                                Почему-то когда я слышу слово покрытие, у меня всплывает ассоциация про подпокрытие покрытия множества и третий семестр матана, который мне когда-то пришлось пересдавать...
                                                                Ответить
                                                • >Я б прикинул, если б самого багоплодовитого прогера реально петушили.

                                                  суть fear driven development. в первом же месяце попал в топ 3 (второе место). тут и началось. "Твое место возле параши!" перенесли рабочее место к толчку. посадили на табуретку. запретили приходить на работу в любое время. премия сильно упала. расклеили на всех досках фотку прямо с той же табуреткой. меня больше всего расстроила необходимость вставать в одно и тоже время каждый день. думал подать в суд, но те кто так делали - на долго не задерживались. думал уйти, но зная зарплату каллег - не стал.
                                                  больше в топ не попадал, хотя на доску с потерей премии регулярно. в топ 3 - туда попадают или новички или распиздяи-неудачники, которым почему то пофиг на все происходящее вокруг и они на окружающих смотрят с принебрежением.
                                                  Ответить
                                                  • > Твое место возле параши!
                                                    не контора, а мясорубка человеческих судеб
                                                    Ответить
                                                    • Ну через месяц то вернули обратно в удобные дорогие кресла! Если исправился конечно. Я вот хоть и медленее стал писать, но теперь и на молоко дую.
                                                      Ответить
                                                      • Через это нужно пройти, чтобы пройти школу настоящего программиста!
                                                        Ответить
                                                  • > и они на окружающих смотрят с принебрежением
                                                    Ну а что, они приходят на работу, отсиживают свои 8 часов нихуя не делая и не особо стараясь писать нормальный код, дальше табуретки ведь уже не выгонят, и получают достаточную для них зарплату. Есть такие люди.
                                                    Ответить
                                                  • > суть fear driven development.
                                                    А вообще я против FDD. Такого рода методики очень сильно расшатывают отошения в коллективе.

                                                    А ведь гораздо лучше и продуктивней работать, когда коллеги в курилке\на кухне смотрят на тебя не как на говно, сидящее на табуретке, и не как на спихнувшего их с насиженого места и тем самым лишившего премии, а просто как на равного человека, с которым приятно пообщаться или посоветоваться.

                                                    Имхо ни к чему вся эта тюремная/армейская дисциплина.
                                                    Ответить
                                                    • Тебе не нравится BDSM?
                                                      Ответить
                                                      • > BDSM
                                                        Это какая-то новая версия Borland Developer Studio? Нет, мне и старые не особо нравились.
                                                        Ответить
                                                • Интересно, а где-нибудь есть такой FDD, чтобы за баг у одного - наказывали весь сектор или отдел, как в армии?
                                                  Ответить
                                                • >что-то из тюремного, тольков камере сидят одни прогеры и в качестве общественно полезной работы пишут код

                                                  Ты про шарашки при Сталине вспомнил? Сталин молодец конечно. Здорово придумал
                                                  Ответить
                          • А я полностью поддерживаю идею поумолчательной константности.
                            Ответить
                            • Я тоже за. Только чтобы инициализацию не требовалось совмещать с описанием константной переменной. Иначе вот в таком случае
                              int a; // const подразумевается по умолчанию
                              if (b > 10) {
                                  a = some(); // a инициализируется тут
                              } else {
                                  a = other(b); // или тут
                              }
                              // здесь компилятор знает, что a инициализировано ровно 1 раз
                              // и больше не даст его поменять
                              придется делать a мутабельным без причины, что приведет только к говну.
                              Ответить
                              • int a=if (b > 10) {
                                    some(); // a инициализируется тут
                                } else {
                                    other(b); // или тут
                                }
                                Ответить
                                • А это уже хаскель какой-то.
                                  Ответить
                                • int a=(if b > 10 then
                                    (_)=>some()
                                  else
                                    other)(b);
                                  Ответить
                                  • > (_)=>some()
                                    Для объявления лямбды, игнорирующей свой параметер в хаскеле была даже отельная функция или оператор где-то среди апликативных функторов или близкой теме, но я забыл название
                                    Ответить
                                    • if (b > 10) {
                                          continuation(some()/*a инициализируется тут*/); 
                                      } else {
                                          continuation(other(b)/*или тут*/);
                                      }
                                      Ответить
                                  • Нечитабельныйдаженатакомпростомпримерепиздец.
                                    Ответить
                                    • Это ты не привык читать, но я то изучил Hashkel и Lishp и для меня это теперь расплюнуть как пальцы обоссать
                                      Ответить
                                  • С++, кстати:
                                    const auto a=( b > 10 ?
                                      [](int _){some();}
                                    :
                                      other)(b);
                                    Жаль что даже с С++14-17 код
                                    const auto a=( b > 10 ?
                                      [](_){some();}
                                    :
                                      other)(b);
                                    не скомилируется. Вот вроде локоть близок, а не укусишь. Это нововведение в кресты, если кто не понял - вывод типа параметра лямбды
                                    Ответить
                              • > мутабельным без причины, что приведет только к говну.

                                Мутабильность без причины - признак дурачины.
                                Ответить
                              • > мутабельным без причины, что приведет только к говну.

                                Я решительно не понимаю какая связь между мутабильными переменными и говном? Тебе SICP и Learn You a Haskell for Great Good! мозги промыли чтоли?
                                Ответить
                                • > Я решительно не понимаю какая связь между мутабильными переменными и говном?
                                  Вот в моем примере a должно быть иммутабельной переменной, чтобы дальше я ее случайно не испортил. Если язык будет заставлять меня дописывать к ней mutable только ради того, чтобы я мог присвоить ее в двух ветках ифа - этот язык сраное говно (да, да, кресты, это о вас).

                                  >> мутабельным без причины
                                  Не все мутабельные переменные говно, а только те, которые мутабельные без причины.
                                  Ответить
                                  • > чтобы я мог присвоить ее в двух ветках ифа - этот язык сраное говно (да, да, кресты, это о вас)
                                    ?
                                    const int a = b > 10 ? some() : other(b);
                                    Ответить
                                    • > const int a = b > 10 ? some() : other(b);
                                      Да, для такого примера можно тернарник, но если надо выполнить пару строчек - то или писать через запятую в тернарнике, или выносить в отдельную функцию, или убирать конст... Не всегда удобно в общем.

                                      Мне жабий final чуть больше понравился в этом отношении - если компилятор может доказать, что final переменная присваивается ровно 1 раз - то можно хоть 10 ифов.
                                      Ответить
                                      • const tuple<int, string> ac= b>10 ? 
                                          make_tuple(some(), "горлум") 
                                        :
                                          make_tuple(other(b), "моя прелесть");
                                        const auto a = ac.get<0>();
                                        const auto c = ac.get<1>();
                                        Ответить
                                      • >Да, для такого примера можно тернарник, но если надо выполнить пару строчек - то или писать через запятую

                                        const auto a = b > 10 ?
                                           some() 
                                        :
                                           [b]()
                                           {
                                              const auto c=b*10;
                                              const auto m=f(c);
                                              return other(m);
                                           }();
                                        Ответить
                                        • Ну и какой смысл городить эти извращенства с кучей самых разнообразных скобок? Что ты этим хотел показать? Что кресты могут или в понятный код без иммутабельных локальных переменных или в код с ними, но нечитабельный и похожий на ёбаный пиздец? Так я это и так прекрасно знал. Вот на что равняться надо:
                                          final a;
                                          if (b > 10) {
                                              a = some();
                                          } else {
                                              final c = b*10;
                                              final m = f(c);
                                              a = some(m);
                                          }
                                          Простой и понятный код.
                                          Ответить
                                          • > Простой и понятный код.
                                            А с иммутабельностью по дефолту тут и final'ов бы не было.

                                            P.S. Забыл в коде выше типы дописать, а редактирование уже заблокировалось.
                                            Ответить
                                            • > Забыл в коде выше типы дописать
                                              С автовыводом типов тут и типов быть не должно.
                                              Ответить
      • P.S. Кстати эту хрень можно наблюдать и без статиков на любой final переменной:
        public static void main(String [] args) {
            final Test a;
            try {
                a = somethingSomethingSomething();
            } catch (Throwable e) {
                a = null;
            }
            System.out.println(a);
        }
        Видимо компилятор очкует, что экцепшн может случиться сразу после присваивания, хотя я вот не понимаю, откуда ему там взяться.
        Ответить
        • а компилятор джавы типа один?
          Ответить
          • Ну если я не ошибаюсь (ява для меня достаточно новая технология, и занимаюсь ей пока только для ведроида) - то два. Встроенный в эклипс, и прилагающийся с JDK. Судя по вики был еще гнутый gcj, но он давно протух.

            P.S. Пример и на эклипсовом компилере и на javac из JDK 1.6 ведет себя одинаково.
            Ответить
            • мне только кажется, или тут действительно наличествуют некоторые, как бы это сказать, джавапроблемы?
              Ответить
              • >джавапроблемы
                А с чего бы еще этому оказаться на говнокоде?
                Ради мелочей отдельный тред создавать желания нет.
                Ну раз Тарас начал...
                Ответить
                • т.е. вы тоже нечто такое неуловимое заподозрили, сударь?
                  значит, интуиция меня не подвела
                  Ответить
                  • Подождите, не пойму об чем речь - ведь я этот подтред и начал.
                    http://govnokod.ru/12472#comment167928
                    http://govnokod.ru/12472#comment168009
                    Ответить
                    • да-да, и это мне тоже показалось подозрительным
                      но я это поначалу отверг, думал просто какой то анонимный злодей с цифрами вместо имени возводит напраслину на достопочтимую технологию
                      а теперь гляжу и, право слово, не знаю что делать
                      Ответить
              • Обратите внимание, что проблемный код такой проблемный именно из-за исключения.
                В общем, ТРАЕБЛЯДСКИЕ ПРОБЛЕМЫ
                Ответить
                • из-за проверяемого исключения.
                  уже обсуждали.
                  это жабопроблемы.
                  Ответить
        • Единственный более-менее нормальный выход из этой ситуации это не объявлять а final.
          Ответить
    • ИМПЕРАТИВОПРОБЛЕМЫ
      Ответить
      • Ты так говоришь, как-будто ФУНКЦИАНАЛЬНЫХ проблем нет. Их на самом деле не меньше.
        Ответить

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