Jawa / Говнокод #5280 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 dwinner, (Updated )

Комментарии (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? А то выглядит, как будто это я его минусую...
                      Я принципиально никогда не трогаю минус.
                      Ответить
                      • да вот мне тоже интересно, какой умник сидит, как аудитор, и мину-суёт. Нет бы в дискуссию вступить и аргументировать, с чем несогласен
                        Ответить
                        • Похоже, во всех языках есть какие-то недостатки или положительные моменты... Нет универсальных, подходящих для всего, решений...
                          Ответить
                          • трудно все-таки в одном месте элегантно соединить противоречивые фишки. Вон си-решетка пытается засахариться, но и за это его тоже ругают.
                            Лично я считаю, что и ненужно абсолютно все пихать в один язык. Пусть каждый реализует свою идеологию и используется по своему назначению. Благо языков сейчас дохренища
                            Ответить
                          • Вас послушать, дак вокруг нас одни заговоры и ЗОГ...
                            Ответить
                              • Ага, ну конечно... Джвавовскя диаспора в тайне нападает на паскалистов! Как я раньше не догадался? 😀
                                Ответить
                  • энтерпрайз мифы же
                    на самом деле в томкат может несколько war загрузить и крутить.
                    там весь ввод/вывод, системная требуха - не минует SecurityManager.
                    если его врубить - часть аппликух типа того же jforum резко перестает работать(о ужас).
                    я как-то конфигурил томкат чтобы и секурити была и то что надо работало
                    Ответить
      • ууу, дружок) беги-читай про GC и finalize.
        и не суди о языке/платформе по тому, как на ней пишут твои одноклассники.
        Ответить
        • да знаю я и про System.gc();
          и про System.runFinalization();
          и про finalize и зануление указателей знаю.
          говно есть говно - с чисткой там всегда было плохо.

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

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

            > ибо не для всех задач подходит.
            вот! не для всех задач. Если вам критично, полно других прекрасных языков. Но на Java можно написать многое и красиво.
            ИМХО, в Java самый красивый кодстайл и ООП (в отличие от того же пхп)
            Ответить
        • 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 с генериками.
                          например где ее нет?
                          на макоси классической разве что
                          на линухе есть (штуки четыре)
                          на винде есть
                          даже на фре есть

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

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

            тут хотя бы в гуи нет бизнес-логики -- и то хлеб)
            Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8