1. Java / Говнокод #5280

    +78

    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
    public Miner(String s) {	    
            super(s);
            MenuBar mb = new MenuBar();
            setMenuBar(mb);
            Menu mFile = new Menu("Файл");
            Menu mHelp = new Menu("Справка");
            mb.add(mFile);
            mb.setHelpMenu(mHelp);
            MenuItem create = new MenuItem("Новая игра",new MenuShortcut(KeyEvent.VK_N));
            Menu mColor = new Menu("Цвет");
            MenuItem mGreen = new MenuItem("Зелёный");
            MenuItem mRed = new MenuItem("Красный");
            MenuItem mBlue = new MenuItem("Синий");
            MenuItem mGray = new MenuItem("Серый");
            mColor.add(mGreen);
            mColor.add(mRed);
            mColor.add(mBlue);
            mColor.addSeparator();
            mColor.add(mGray);
            Menu mHard = new Menu("Сложность");
            MenuItem mDummy = new MenuItem("Новичок");
            MenuItem mUser = new MenuItem("Среднячок");
         	MenuItem mHaker = new MenuItem("Проффи");
         	mHard.add(mDummy);
         	mHard.add(mUser);
         	mHard.add(mHaker);
         	MenuItem mSound = new MenuItem("Звук");
         	mSound.setEnabled(false);
         	MenuItem exit = new MenuItem("Выход",new MenuShortcut(KeyEvent.VK_X));
            mFile.add(create);
            mFile.add(mColor);
            mFile.add(mHard);
            mFile.add(mSound);
            mFile.addSeparator();      
            mFile.add(exit);
            Scribble scr = new Scribble(this,480,480);
            mGreen.addActionListener(scr);
            mRed.addActionListener(scr);
            mBlue.addActionListener(scr);
            mGray.addActionListener(scr);
            add(scr);
            Difficult diff = new Difficult(this,480,480);
            mDummy.addActionListener(diff);
            mUser.addActionListener(diff);
            mHaker.addActionListener(diff);
            add(diff);
            create.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    status = 0;
                    repaint();
                    RandomArray();
                }
            });
            exit.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    System.exit(0);
                }
            });
            MenuItem mInfo = new MenuItem("О программе",new MenuShortcut(KeyEvent.VK_H));
            mHelp.add(mInfo);
            mInfo.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    new AboutProgram("О программе");
                }
            });
            setBounds(0,0,480,480); // setSize(480,480); 
            setVisible(true);
            setLayout(null);
            addMouseListener(this);
            addWindowListener(new WinClose());
    }

    Всё, что можно и что нельзя я запихнул в конструктор

    Запостил: dwinner, 14 Января 2011

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

    • Не, не всё... Деструктора нехватает...
      Ответить
      • жава же )
        када засирается память - все рушицо нахуй или жоска тормозит. нормальной жавапрограмме достаточна часа работы для наступления пиздеца :)

        а хуле - индусы же не знают что такое деструктор и что память чистить надо. потому в жабе ево и нет :)
        Ответить
        • шо? О_О

          > нормальной жавапрограмме достаточна часа работы для наступления пиздеца :)

          тогда её код нужно выкладывать сюда


          > индусы же не знают что такое деструктор и что память чистить надо.

          это вы не знаете, если так судите.
          а правила управления памятью в жабке довольно простые:
          1.повторно использовать обьекты - вместо создания новых.
          это касается this.getSize(size) вместо size=this.getSize(), Integer.valueOf(i) вместо new Integer(i) и list.clear() вместо list=new ArrayList(); а так же совместно используемых ресурсов
          2. уничтожая созданный обьект - уничтожать ВСЕ ссылки на него.
          В том числе: удаление из коллекций, разрегистрирование слушателей, если перезагружаем класс - то не забываем избавиться и от соотв. classloader'а (во избежание outofmemory error:permgen space). Здесь же хочется упомянуть про грамотный выход (не System.exit()).
          3. используем ленивую загрузку (late binding) ресурсов, не забывая, что в отличие от дотнета, виртуальная машина не будет кормить нас доп.памятью. и загружаем в память только то, что необходимо сейчас (картинки тоже поменьше, а не 2000х3000). А для кеша есть такая замечательная штука, как WeakHashMap :)
          Ответить
          • да знаю я все это. :)
            а еще прекрасно помню как начали свинг внедрять тогда когда средний комп имел 32 мега оперативы. было от чего посрать кирпичами :)
            еще прекрасно знаю как при работе томката и оперфайра засираецо память.
            10-15 дней и процесс надо перегружать иначе он сука блянеработоспособен.
            ну или выделяе ему ищо и ищо рамы. ога.
            или ебись с опцияме gc типо -Xincgc которые вроде облегают тока VM от этова чутка медленнее становицо. в общем нахуй.
            нормальные суровые мущины пишут демоны на C
            Ответить
            • угу, про котенка вообще беда. Постоянно вываливается, и иногда его необходимо перезапускать. Но, думаю, это как раз связано с класслоудерами, и виновата не жаба, а апачи

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

                наверняка она засрана Вашими же классами)
                Ответить
            • > нормальные суровые мущины пишут демоны на C
              пишут конечно, но не энтерпрайз проекты а небольшие но требовательные к производительности проги
              все таки нужно понимать что у разных языков разная область применения
              Ответить
            • swing: ну так сейчас ее не 32, кажется)

              tomcat: может быть в те времена, когда было 32 -- томкат и тек памятью. сейчас он у меня работает месяцами (и джетти тоже) и что я делаю не так?)
              Памятью текут говнопрограммы, но это решается профилированием и йоркитом.

              и да: когда мне надо сделать СRM уровня salesforce, я конечно пишу его на сях. Причем с ноля, и протокол HTTP сам реализовываю, ага))))) Ну просто у меня есть пара лет свободного времени
              Ответить
              • хз хз.... я сейчас как ни странно в плане динамической неведомой хуйни смотрю в сторону моны и шарпа. там хоть деструкторы есть..
                Ответить
              • >протокол HTTP сам реализовываю, ага))))) Ну просто у меня есть пара лет свободного времени
                Реализовать протокол HTTP - можно меньше чем за месяц (если не торопиться).
                Ответить
          • >нужно использовать this.getSize(size) вместо size=this.getSize()
            Ну и язычёк...
            Ответить
            • > язычёк
              <frammarNazi>и девчЁнка, угу</grammarNazi>

              ну всё дело в том, что там примерно такое:
              package java.awt;
              class Component {
               private int width;
               private int height;
               public int getWidth() {return this.width;}
               public int getHeight() {return this.height;}
               public Dimension getSize() {return new Dimension(this.width,this.height);}
               public Dimension getSize(Dimension size) {
                size.width=this.width;
                size.height=this.height;
                return size;
               }
              //....
              }
              Ответить
              • > язычёк
                Специально для Вас:
                язычЁк

                Табличку сарказм поднять? )

                >дело в том
                ОК. Думал Вы прo int getSize()
                Ответить
                • скоро я буду думать, что правильно писать "што бы", "язычёг" и "карова". Это рак.

                  > int getSize()
                  это мой фейл, скопропастил.
                  Ответить
              • Не всегда, но часто C++ автоматически оптимизирует:
                size=this.getSize()
                до
                this.getSize(size)

                А у Java как с этим дела обстоят?
                Ответить
                • Притом я говорю про случай Dimension getSize, а не int getSize.
                  Ответить
                • я, видимо, чего-то не понимаю, но, по-моему, это "--вы что, за меня и есть будете? --ага!" (ц), то есть, если я сказал, что нужно выделить новый обьект и присвоить ссылку, он автоматически возьмет существующий, буд-то новый, хоть я на это и не рассчитывал? Для меня это выглядит, как опасный момент, когда программа пытается быть умнее пользователя
                  Ответить
                  • Естественно, он это делает только в безопасных случаях.
                    Ответить
                    • как с этим обстоит дело в Java, я не знаю, это надо разбираться в реализации конкретной ВМ (Sun\Oracle, OpenJDK, Microsoft). Для меня это слишком высокие материи.

                      Я, как программист, должен заботиться о грамотном построении аппликации самостоятельно, а не надеяться, как макака, что мне все равно подотрут жопу
                      Ответить
                      • Конечно, всё можно делать вручную, но для этого я бы выбрал ассемблер. Высокоуровневый язык всё должен делать автоматически (конечно, С++ до этого далеко).
                        Ответить
                        • > Высокоуровневый язык всё должен делать автоматически

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

                          Отсюда я делаю вывод, что принцип "наименьшей неожиданности" все же должен соблюдаться
                          Ответить
          • >грамотный выход (не System.exit())
            А как нужно и почему?
            Ответить
            • нужно с помощью Thread.join() и Component.dispose() добиваться завершения всех потоков приложения (даже если вы не используете потоки, Java всё равно создает их около 5 для своих нужд, например, поток интерфейса и поток обработки событий интерфейса). Несколько аппликаций могут разделяться одной виртуальной машиной(грубо говоря, процесс java.exe на вендах). А System.exit() немедленно убивает всю виртуальную машину. Это написано почти в любой более-менее приличной книге по Java
              Ответить
              • >Несколько аппликаций могут разделяться одной виртуальной машиной
                >System.exit() немедленно убивает всю виртуальную машину
                Тоесть System.exit() может убить одновременно несколько приложений? ОМГ. Какой удар по безопасности...

                >Несколько аппликаций могут разделяться одной виртуальной машиной
                А можно "срать" в соседние аппликации?

                >Несколько аппликаций могут разделяться одной виртуальной машиной
                Тоесть, если аппликация за собой до конца не почистит при завершении, то таким образом часть ресурсов может быть захвачена убитой аппликацией?
                Ответить
                • > Какой удар по безопасности...
                  ну, вообще и тут подумано. Например, броузер использует одну ВМ для всех апплетов, но в тех же апплетах System.exit() вызовет SecurityException. Все зависит от методов запуска. Если мы вызываем процесс java.exe, то приложение запустится в новой ВМ.

                  > А можно "срать" в соседние аппликации?
                  в аппликации, наверное, только с помощью JNI. А вот в апплетах есть, кажется, AppletContext.getApplets(), c помощью которого можно общаться с другими апплетами

                  > Тоесть, если аппликация за собой до конца не почистит при завершении, то таким образом часть ресурсов может быть захвачена убитой аппликацией?
                  смотря о каких ресурсах говорим. В общем случае, ВМ сама пытается убирать после себя(закрывает сокеты, снимает блокировки файлов, закрывает соединения,стримы и т.д.). Но, например, если вы используете файлы-"семафоры"(может, так захотели предотвратить запуск более одной копии аппликации), то, очевидно, что это уже для ВМ слишком умно. Также в этом случае могут быть не опустошены буферы потоков(Stream, не Thread)
                  Ответить
                  • Страсти то какие... А я думал Java обеспечивает полную безопасность и изолированность...
                    Ответить
                    • контроль кода все же выполняет ВМ и там же есть SecurityManager накрайняк.

                      > Страсти то какие...
                      Это еще что. Меня вот вообще некогда убило наличие Field.setAccessible(boolean), который через отражение позволяет вопреки принципам ООП получать доступ к приватным полям.
                      "You can never be too safe" (ц)
                      Ответить
                      • >через отражение позволяет вопреки принципам ООП получать доступ к приватным полям.
                        Ну это врятли кто-то будет использовать. Покрайней мере на говнокоде пока такого кода не видел, тк это не удобно. Обычно говнокодеры лёгким движением руки исправляют private на public.

                        Зато крайне полезно для организации unit- test и особенно serialization.

                        В С++ рефлектора нет и паттерн serialization приходится реализовывать вручную, а не делать это автоматически за пару строчек.
                        Ответить
                        • это используется, и еще как.
                          Например, в том же мной хваленом java-фреймворке Tapestry5 пишем
                          class My {
                          @Property
                          private int prop;
                          }

                          что потом преобразуется в
                          class My$Proxy extends My{
                           private int prop;
                           public int getProp() {return this.prop;}
                           public void setProp(int prop) {this.prop=prop;}
                          }

                          и попытка написать
                          @Property
                          public int prop;

                          приведет к TapestryException: property field must be private
                          Впрочем, быть может, для этого и не используется именно упомянутая фишка. Не знаю, что там Javassist генерит в рантайме
                          Ответить
                      • Можно и меня минусовать, а не только Lure Of Chaos? А то выглядит, как будто это я его минусую...
                        Я принципиально никогда не трогаю минус.
                        Ответить
                        • да вот мне тоже интересно, какой умник сидит, как аудитор, и мину-суёт. Нет бы в дискуссию вступить и аргументировать, с чем несогласен
                          Ответить
                          • Похоже, во всех языках есть какие-то недостатки или положительные моменты... Нет универсальных, подходящих для всего, решений...
                            Ответить
                            • трудно все-таки в одном месте элегантно соединить противоречивые фишки. Вон си-решетка пытается засахариться, но и за это его тоже ругают.
                              Лично я считаю, что и ненужно абсолютно все пихать в один язык. Пусть каждый реализует свою идеологию и используется по своему назначению. Благо языков сейчас дохренища
                              Ответить
                          • Это джвавовскя диаспора.
                            Ответить
                            • Вас послушать, дак вокруг нас одни заговоры и ЗОГ...
                              Ответить
                              • От нас скрывают же.
                                Ответить
                                • Ага, ну конечно... Джвавовскя диаспора в тайне нападает на паскалистов! Как я раньше не догадался? :D
                                  Ответить
                                  • Джвавовскя диаспора тоже пишиет на еретическом синтаксисе сишных закорючек!!!
                                    Ответить
                    • энтерпрайз мифы же
                      на самом деле в томкат может несколько war загрузить и крутить.
                      там весь ввод/вывод, системная требуха - не минует SecurityManager.
                      если его врубить - часть аппликух типа того же jforum резко перестает работать(о ужас).
                      я как-то конфигурил томкат чтобы и секурити была и то что надо работало
                      Ответить
        • ууу, дружок) беги-читай про GC и finalize.
          и не суди о языке/платформе по тому, как на ней пишут твои одноклассники.
          Ответить
          • да знаю я и про System.gc();
            и про System.runFinalization();
            и про finalize и зануление указателей знаю.
            говно есть говно - с чисткой там всегда было плохо.

            а ебнуть объект у кодера нет никакой возможности - хоть обобнуляйся указателев.

            Да, пул памяти проблему частично решает(шоб срать было на gc). но именно что частично. ибо не для всех задач подходит.
            Ответить
            • > а ебнуть объект у кодера нет никакой возможности - хоть обобнуляйся указателев.
              ну если правда ссылок нет, то System.gc() как бе должен грохнуть обьект. Хотя это и не обязательно

              > ибо не для всех задач подходит.
              вот! не для всех задач. Если вам критично, полно других прекрасных языков. Но на Java можно написать многое и красиво.
              ИМХО, в Java самый красивый кодстайл и ООП (в отличие от того же пхп)
              Ответить
              • В PHP ООП слишком специфичен, заточен под WEB, но это и логично! PHP ведь?!
                Ответить
          • 5+! Деструкторы - анахронизм 21-ого века. Периодическая сборка мусора в Java работает на УРА! Если и нужно что-то чистить вручную для этого есть все средства. Бывает сравнительно редко.
            Ответить
            • Как в Java решена проблема освобождения ресурсов, типа закрытия файлов и тд?
              Ответить
              • Цитирую исчо раз: Если и нужно что-то чистить вручную для этого есть все средства
                Ответить
                • Тоесть множество громоздких конструкций типа try finally, в которых вызывают очистку вручную?
                  Ответить
                  • А что делать, но все таки их не куча!
                    Ответить
                    • Есть языки, в которых такие громосткие конструкции вообще нет необходимости использовать.
                      Ответить
                      • Значит у них другие недостатки есть, идеальных нет.
                        Ответить
                      • на чем бы Вы стали писать жирное распеределенное бизнес-приложение, с путанной логикой, толстой бд, коннектами ко всем возможным сервисам и миллионом разных веб-формочек?
                        Ответить
                    • >А что делать, но все таки их не куча!
                      Нет. Их куча, особенно, если активно используется наследование и включение. Для каждого потомка и включаемого объекта приходится писать вызов уничтожения объекта вручную.

                      А если сложная логика обработки исключений, то finally тоже много получается...
                      Ответить
                      • Если так страшно, то для агрегации есть интерфейс Cloneable. В Java не нужно бояться, что ссылки уже не на что ни указывают, для этого собственно GC и существует. Даже если и есть подобная нереализованная логика, её можно реализовать, программист ты или где?!
                        Ответить
                        • >В Java не нужно бояться, что ссылки уже не на что ни указывают, для этого собственно GC и существует.

                          Если этот объект владел ресурсами, то он так и оставит эти ресурсы заблокированными, пока не произойдёт очистка объекта через GC, а она может произойти, например, когда приложение будет завершаться, когда будет уже поздно.

                          Допустим, открыли мы в конструкторе объекта файл на запись, затем объект уже не используется, но сборщиком мусора ещё не удалён, а значит файл не закрыт.
                          Мы опять конструируем этот объект и он пытается открыть тот же файл, но файл занят и конструирование не удаётся, тк не удаётся открыть файл.
                          Ответить
                          • ну так файлы за собой закрывать надо, нет?
                            в крестах надо удалять за собой объекты
                            в сях надо отдавать память
                            в жабе надо закрывать файлы
                            нет?
                            Ответить
                            • Я к тому, что неужели нельзя было уменьшить писанину? Куда это годится, писать кучу закрываний файлов, если есть вложенные или наследованые объекты? Куда это годится, писать столько finally?

                              Впрочем, Вы уже сказали, что в Java - многословный язык с лишними словами...
                              Ответить
                              • Сан пытался сделать язык максимально четким и предсказуемым (без undefined бехейвор, как это иногда бывает в сях), кроме того принцип кисс велел уменьшить до предела количество ключевых слов и понятий и отсюда вот такое многословие.
                                Ответить
              • finally есть
                элегантного решения нет

                в C# есть using, кажется в седьмой жабке будет что-то типа этого
                Ответить
                • >using
                  Не очень красивое решение, но много лучше finally.
                  Ответить
                  • Да что ж вы все про finally заладили?! Ещё два способа чистки есть как минимум, не менее элегантные, чем в C#
                    Ответить
                    • >Ещё два способа
                      Какие?

                      >не менее элегантные, чем в C#
                      В C# не элегантный способ, а костыль. Хоть using лучше finally, но в C# он иногда глючит...
                      Ответить
                      • тащемто проблема освобождения внешних ресурсов это действительно проблема всех языков с автоматическим управлением памятью.

                        по этому хорошим тоном считается закрывать их в том же месте, где и открыл.
                        Тоесть херово открыть файл (или коннекшен), положить его дескриптор в свойство объекта, объект в кучу, и ждать 100500 лет пока GC его удалит (GC, кстати, может никогда не удалить объект, если памяти много -- а знач finally никогда не вызовеца).

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

                        в сях++ конечно проще: delete, и точно знаешь что все файлы (и дефицитные ресурсы типа коннектов к бд) закрылись.

                        с другой стороны, надо всегда явно удалять объекты (ну или полагаться на автоматические средства типа auto_ptr) а это тоже бойлерплейт, не хуже файнали))
                        Ответить
                  • честно говоря, я от финали не очень страдаю
                    жаба очень многословный язык, там очень много буков писать надо

                    но с другой стороны с современными иде это не оч напрягает
                    Ответить
                    • >я от финали не очень страдаю
                      >жаба очень многословный язык
                      Не очень, но всё-таки страдаете? ))

                      >жаба очень многословный язык
                      Операторы не поддерживает и шаблоны не всеми версиями...
                      Ответить
                      • >>Не очень, но всё-таки страдаете? ))
                        да. не все в жабе прекрасно.

                        >>Операторы не поддерживает и шаблоны не всеми версиями...
                        перегрузку операторов, Вы имеете ввиду?
                        Это не самый страшный грех. Я уже привык без нее, впринципе не очень напрягает.
                        Шаблоны -- это генерики? Ну так он их уже лет 5 как поддерживает (хотя и не так красиво, как clr) -- слава богу я уже давно пишу на шестой жабе, там с этим проблем нет.

                        вот чего мне не хватает в жабе -- так это множественного наследования.)))

                        PS: сиплюсплюсник детектед)
                        Ответить
                        • >он их уже лет 5 как поддерживает
                          Да, но не на все платформы есть новая Java с генериками.

                          >Шаблоны -- это генерики?
                          Нет. Генерики - это частный случай шаблонов, притом очень скудой, по сравнению с ними по возможностям.
                          Ответить
                          • >>Да, но не на все платформы есть новая Java с генериками.
                            например где ее нет?
                            на макоси классической разве что
                            на линухе есть (штуки четыре)
                            на винде есть
                            даже на фре есть

                            >>Генерики - это частный случай шаблонов
                            так вроде бы в джаве только генерики и были. Шаблонов в плюсовом понимании не было
                            Ответить
    • даже если бы это все было красиво распихнуто по методам, все равно в каждой строчке по говняшке
      Ответить
      • Своё Говно не пахнет
        Ответить
        • не аргумент. Рано или поздно наступит момент, когда случится понос и это говно потечет. Надо стремиться писать красивый и грамотный код, хотя бы из уважения к себе
          Ответить
          • Это понятно. Я имел ввиду, что в чужом коде, как правило, больше говна замечаешь, нежели в своем.
            Ответить
    • всю эту городьбу выносить в init() надо, а не в конструктор
      Ответить
      • это ещё зачем?
        Ответить
        • что бы вместо неподдерживаемого и нечитаемого куска дерьма в методе Miner получилось неподдерживаемое нечитаемое дерьмо в методе init.

          Это же явно лучше.
          Ответить
          • вот вот, а вообще лучше это всё запихнуть в некое подобие конфигурационного класса с константами и методами инициализации и использовать его
            Ответить
            • а еще лучше описать гуи декларативно
              и вынести из него локализацию

              тут хотя бы в гуи нет бизнес-логики -- и то хлеб)
              Ответить
    • >>mDummy
      "чучело на букву м" -- творческий псевдоним автора
      Ответить
    • показать все, что скрытоJava макака не осилила пхп ?
      Ответить

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