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

    +76

    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
    package ololo.cdn.util;
    
    /**
     *
     */
    public interface AnswerCodes
    {
    
        public static final int CODE_OK = 0;
        public static final int CODE_NO_AUTH = 1;
        public static final int CODE_NO_ACTION_DONE = 2;
        public static final int CODE_ERROR_PARAMETERS = 4;
        public static final int CODE_NO_RIGHTS = 8;
        public static final int CODE_NOT_UNIQ_PARENT = 16;
        public static final int CODE_NOT_EXIST_COLUMNS = 32;
    
        public static final String ANSWER_NO_AUTH = "{\"result\":\"error\",\"code\":\""  + CODE_NO_AUTH + "\"}";
        public static final String ANSWER_NO_RIGHTS = "{\"result\":\"error\",\"code\":\""  + CODE_NO_RIGHTS + "\"}";
        public static final String ANSWER_NOT_UNIQ_PARENT = "{\"result\":\"error\",\"code\":\""  + CODE_NOT_UNIQ_PARENT + "\"}";
        public static final String ANSWER_NOT_EXIST_COLUMNS = "{\"result\":\"error\",\"code\":\""  + CODE_NOT_EXIST_COLUMNS + "\"}";
    
        public static final String ANSWER_OK = "{\"result\":\"ok\",\"code\":\""  + CODE_OK + "\"}";
        public static final String ANSWER_NOTHING_DONE = "{\"result\":\"ok\",\"code\":\""  + CODE_NO_ACTION_DONE + "\"}";
    }

    Запостил: taras_shs, 13 Ноября 2014

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

    • Генери JSON руками @ будь мужиком
      Ответить
      • Кмк, иногда оправдано...
        Ответить
        • Оправдано в двух случаях:
          * JSON из одного поля
          * Нужно отдавать этот ответ миллионам пользователей и это реально боттлнек.

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

          И кстати constant only interface был взвешен на весах, и найден антипаттерном еще Блохом в первой "effective java".
          Ответить
          • На самом деле, оправдано только в одном случае:

            JSON только пишется, парсить его не надо, ответы простые, не требуют особого экранирования.

            В этом случае проблемы с подключением либы перевешивают преимущества. Особенно, если пишешь на C или C++.

            Я как-то писал сервис на крестах, который отдавал статистику в json/yaml по http, возня с подключением сторонних либ была оверкиллом.

            Про интерфейсы с константами согласен, нинужны.
            Ответить
            • Тут речь о джаве. JSon делается примерно в одну строчку: https://code.google.com/p/google-gson/
              Ответить
            • >> constant only interface был взвешен на весах, и найден антипаттерном
              > Про интерфейсы с константами согласен, нинужны.

              Эта борьба ведётся именно с интерфейсами (из-за недопустимости наследования констант по какой-то причине или ещё из-за чего) или с любыми попытками объединить много констант с общим доступом под крылом неймспейсоподобной конструкции?
              Ответить
              • Именно с интерфейсами. Суть в том, что ленивые жопы "реализуют" такие интерфейсы, чтобы огрести в область видимости кучу констант и писать EinsteinCosmologicalConstant вместо UniverseCalibration.EinsteinCosmologicalConstant.

                Немного напоминает крестовый using namespace std;
                Ответить
                • статик импорт отменили?
                  Ответить
                  • Constant-only-интерфейсы активно применялись до появления import static в Java 5. Сейчас 95% их юскейсов покрывают энумы, оставшиеся 5% - import static.
                    Ответить
                    • Все равно не понятно почему нельзя имя класса с константой указать.

                      Хотя это вот очень хорошо показывает что джава не права утверждая что "всё класс". Не всё класс!

                      Во многих языках (от пайтона до сей) можно хранить константы прямо в модулях, например)
                      Ответить
                      • В питоне нет констант.
                        Ответить
                        • БОЛЬШИМИ_БУКВАМИ_ЧЕРЕЗ_ПОДЧЕРКИВАНИЕ согласно пеп8 пишутся константы.
                          Ответить
                          • > пишутся константы
                            пишутся переменные, которые ты бы не хотел, чтобы люди меняли
                            fixed
                            Ответить
                            • А в чем разница? А в сях есть константы? А в джаве? А в слр?
                              Ответить
                              • В том, что в сях, жабе и шарпе компилятор хотя бы пытается следить за тем, чтобы значение не менялось. В питоне же это просто соглашение между программистами.
                                Ответить
                                • Прости. А где в Пайтона компилятор?
                                  Ответить
                                  • Питон компилируется в байткод:
                                    https://docs.python.org/2/library/py_compile.html
                                    Ответить
                                • в пайтоне внешние утилиты тоже следят: пайлинты всякие , IDE и pep8
                                  Ответить
                              • Есть.
                                Ответить
                                • Чушь несети. И там и там есть. И в си можно поменять хуком. Просто в Пайтона проще
                                  Ответить
                                  • > в си можно поменять хуком
                                    А апперкотом можно?

                                    Сегфолт тебе не даст поменять константу, увы.
                                    Ответить
                                    • Да ну? Я сниму со страницы биток ридонли, тыкну поинтером и сменю
                                      Ответить
                                      • Тогда заодно и в сегменте с кодом не забудь поменять константы, заинлайненные компилятором.
                                        Ответить
                                        • )мне казалось что в этих ваших сях константы делаются препроцессором, и для компилятора это просто литерал, ннет?
                                          Ответить
                                    • Оспади, ну он в кернел-спейс влезет драйвером и там насрёт.
                                      _ВСЕ_ можно поменять.

                                      Просто есть контракт: нарушишь контракт (поменяешь константу) -- получишь неверно работающую систему: сегфолт или багу -- не важно.
                                      Ответить
                            • Да что с вами со всеми такое?

                              http://legacy.python.org/dev/peps/pep-0008/#constants
                              Ответить
                              • От того, что переменную капсом назвали, она константой не станет...
                                Ответить
                                • Дайте мне определение термина "константа" пожлста
                                  Ответить
                                  • Константа это логическое выражение во вселенной выразительной на столько же, как вселенные Хебранта или более выразительные, уже вычисленное и не принимающее аргументов. См. также ground expression.
                                    Ответить
                                    • А наша вселенная достаточно выразительна?
                                      Ответить
                                      • Для того, чтобы иметь константы? - Да.
                                        Ответить
                                    • >число авогадро, постоянная Планка и т.д.
                                      Существует теория что со временем фундаментальные физические константы могут меняться с течением времени и пространства. Для постоянной тонкой структуры вроде даже доказали. По крайней мере это объясняет тонкую подстройку вселенной.

                                      Гость м.б. и прав в том плане что вся наша вселенная мутабельная, в ней нет констант.
                                      Ответить
                                      • Но есть еще ведь и такая вещь как разница между "реальной вероятностью", "феноменальной вероятностью", "логической вероятностью". Т.е. даже если наша вселенная поменяется, мы все равно сможем представить вселенную в которой Пи будет именно таким, каким мы его знаем сейчас - потому что это а приори тип знаний (не требующий подтверждения в реальной вероятности, достаточно просто представить, что могут, в принципе, быть круги и диаметры).
                                        Т.е. если мы уж один раз представили Пи, то это навсегда. Даже если эта вселенная перестанет существовать. :)
                                        Ответить
                                        • >мы все равно сможем представить вселенную в которой Пи будет именно таким, каким мы его знаем сейчас - потому что это а приори тип знаний

                                          Так это ж не физическая константа из реального мира, а математическая.
                                          Ответить
                                          • Ну, маятник науки тут может качнутся то в ту, то в другую сторону. В одной крайности есть конструктивисты-интуитивисты в математике, которые возможно и иррациональные числа не примут, т.как нет возможности их построить (и для них Пи будет равен отношению круга, который они смогут построить в конкретной вселенной к такому же конкретному диаметру).
                                            С другой стороны есть теоретические физики, которые думают что мир он так неспроста, а что за всем этим стоит математика, и тогда в мире не окажется никакого а постериори знания, о нем все будет доподленно известно от начала и до конца, без возможности что-либо поменять, без свободы воли... В последнем случае, не будет разницы между математическими константами и физическими, это будет одно и то же.
                                            Ответить
                                  • Примеры констант: 0, π, число авогадро, постоянная Планка и т.д.
                                    Ответить
                                    • Ну да, в других вселенных постоянные могут быть иными.

                                      И нам вообще повезло что у нас такие константы, иначе и жизнь бы не зарадилась, и говнокода-бы тогда никакого не было!
                                      Ответить
                                    • > 0, π, число авогадро, постоянная Планка

                                      Тсс! Сейчас какой-нибудь питонщик залезет в модуль universe и заманкипатчит что-нибудь.
                                      Ответить
                                    • Кстати с пи пайтоновоцы обделались. Во-первых math.pi а не math.PI, а во-вторых там в комменте слово "variable".

                                      Я их тут защищаю во-всю, а они :(
                                      Ответить
                                      • Ну, с точки зрения логики, это нормально. Переменные это более широкий класс, включающий в себя константы. Т.е. переменные это логические выражения не принимающие аргументов, а константы, это такие переменные, которые кроме этого уже вычислили все под-выражения.

                                        Хотя с точки зрения названий имеет место быть несоответствие, это как искусственный естесственный язык: то что выражение является переменной освещает другой аспект этого выражения, нежели тот, о котором говорится в том, что оно - постоянная.
                                        Ответить
                                        • >>логические выражения
                                          Не только логические. ЛЮБЫЕ выражения.

                                          Все же я считаю что константу следует рассматривать как мнемонику для литерала. Во всяком случае, в программировании. Препроцессор в сях поступает чеснее заменяя #define на литералы еще ДО компиляции, не выделяя для нее память)
                                          Ответить
                                          • Любые выражения - логические. :) Просто нужно правильную логическую систему выбрать.
                                            Ответить
                                • >От того, что переменную капсом назвали,
                                  var CAPS;
                                  А еще среди питонистов и прочих жабоскриптеров ходят легенды, что если назвать _переменную с подчеркиванием вначале, то она станет приватной.
                                  Чем больше подчеркиваний - тем приватнее.
                                  Ответить
                                  • > ходят легенды
                                    Да вон тут гость обещал константу изменить. В общем-то, никто ему не запретит вызвать нужную функцию-член и в C++.
                                    Ответить
                                    • Да ничто не запретит ему вообще ничего, если эта константа в ASIC не отлита.
                                      Ответить
                                  • Не знаю как в JS, но в Pythonе есть контракт, и в соответствии с ним "_приватные_символы_не_часть_публичного_ интерфейса" и КОНСТАНТЫ_БЛИН вполне себе существуют.

                                    То что его легко нарушить не говорит о том, что его нет.

                                    Нарушить можно и в Java (рефлекисей) и в нативном коде залезжи в память как сказал гость, и вообще всё что не прошито железно можно испорить. Константа это мнемоника для литерала а не "переменная, чье значение трудно поменять". Ну что за децкие рассуждения, ё-мае
                                    Ответить
                                    • >Не знаю как в JS[...]_приватные_символы_не_часть_публичного_ интерфейса" и КОНСТАНТЫ_БЛИН вполне себе существуют.
                                      Да точно так же.
                                      В ECMA6 ввели const, ФФ и хром поддерживают, (опера и сафари понимают) можно юзать.
                                      Ответить
                                      • как видите -- не так же. В JS ключевое слово, а в пайтоне -- договорённость, как и все в пайтоне.

                                        Можно ругать пайтон за то, что он не форсит контракт в рантайме, даже не пытается! (ну нет там use strict), но говорить что там контракта нет -- это не правда
                                        Ответить
                                        • Раньше было так же. Его совсем недавно ввели.
                                          Половина браузеров по-прежнему не поддерживает, const ВНЕЗАПНО работает как var.
                                          А те что поддерживают, не матерятся при присваивании, и возвращают новое значение в качестве его результата.
                                          Ответить
                                          • А у JS где-то есть официальный документ с описанием кодстайла?
                                            Ответить
                                            • Такого оффициального руководства как PEP не видел. Это ж не питон с его toowtdi.
                                              Более того крокфорд прямо говорит не использовать _var как приватное.
                                              Но нейминг общепринят.
                                              Ответить
                    • ага, финальный класс со статичными полями сообщество принимает положительно.

                      энумы вообще покрывают 20% кода. я про такой говностиль:
                      public enum Direction {
                       DOWN("DOWN", true), LEFT("LEFT", false), RIGHT("RIGHT", false), UP("UP", true);
                      
                       public static List<Direction> getAll() {
                        ArrayList<Direction> list = new ArrayList<Direction>();
                        list.add(Direction.LEFT);
                        list.add(Direction.RIGHT);
                        list.add(Direction.UP);
                        list.add(Direction.DOWN);
                        return list;
                       }
                      
                       public static List<Direction> getHorisontals() {
                        ArrayList<Direction> list = new ArrayList<Direction>();
                        list.add(Direction.LEFT);
                        list.add(Direction.RIGHT);
                        return list;
                       }
                      
                       public static List<Direction> getVerticals() {
                        ArrayList<Direction> list = new ArrayList<Direction>();
                        list.add(Direction.UP);
                        list.add(Direction.DOWN);
                        return list;
                       }
                      
                       private String name;
                       private boolean vertical;
                      
                       private Direction(String name, boolean vertical) {
                        this.name = name;
                        this.vertical = vertical;
                       }
                      
                       public String getName() {
                        return this.name;
                       }
                      
                       public boolean isHorisontal() {
                        return !this.vertical;
                       }
                      
                       public boolean isVertical() {
                        return this.vertical;
                       }
                      
                       @Override
                       public String toString() {
                        return this.getName();
                       }
                      }
                      Ответить
                      • Ужас-ужас. Избыточность во все поля.

                        Да ещё и List в качестве возвращаемого значения. Ну хоть не массивы.
                        Ответить
                        • что плохого в том чтоб вернуть лист?
                          Ответить
                          • Я бы вернула Set, потому что логически это именно множества констант энума, а не списки. Кроме того, есть встроенная эффективная реализация - EnumSet. Но это скорее стилистика.
                            Ответить
              • Ифейс не для этого просто.

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

                Ничего плохого в объединении нет, хотя в 80% случаев ты хочешь enum сделать, на самом деле (привет старым api вроде swing, и новым вроде андроид, там везде int))
                Ответить
                • > привет старым api вроде swing, и новым вроде андроид

                  В Андроиде инты вместо энумов? Реально? Но зачем?
                  Ответить
                  • Там практически везде инты, ручные касты, отсутствие генериков итд . Пахнет четвертой джавой и началом нулевых.
                    Видимо сказывается сишный бекграунд разрабов. Любителей спринга тошнит)

                    Чтоб помочь IDE, они аннотируют параметры. И IDE знает чтоэто не просто int, а туда нужно определенную константу.

                    C ходу:
                    // Оба параметра -- инты
                    new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                    
                    (Button) findViewbyId(R.id.my_button) // инт и ручной каст
                    Ответить
                    • > Любителей спринга тошнит)

                      Тошнит любителей любых библиотек, появившихся года так после 2006-го.
                      Ответить
                  • > В Андроиде инты вместо энумов? Реально? Но зачем?

                    Очевидно, память экономят. И правильно делают.
                    Ответить
                    • Да ну? Какую память? Permgen (или как там она в дальвике у них)?
                      Ответить
                      • Да, память, в которую классы загружаются. На каждый енум и на каждый элемент перечисления генерится по классу. На мобилке можно найти более полезное применение памяти.
                        Ответить
                        • Так там же дальвик. Что мешает внутри иметь инты, а использовать енумы чисто как сахар?
                          Ответить
                          • Выразительная сила енумов мешает. Жабий енум к инту не свести, к сожалению (или к счастью?).
                            Ответить
                            • Почему не свести-то?)

                              enum Foo {
                              BAR("bar") // 0
                              SPAM("bar") // 1
                              String name;

                              В памяти
                              Map[Int, String] для поля name (ну или какие там еще поля будут).



                              Вообще я не верю что там в памяти дело:
                              Один enum -- один класс. Все значения его -- инстансы-синглтоны. Вот правда если лейаут параметрс сделать енумом а не интом то память кончица?
                              Ответить
                            • JIT вполне может статически распознавать тривиальные энумы и оптимизировать их до интов. Кстати, не удивлюсь, если какой-нибудь HotSpot так и делает - у него вообще внутри много чёрной магии.
                              Ответить
                          • > Что мешает

                            Очевидно, время. Москва не сразу строилась. В 2011 году вроде заоптимизировали.
                            http://stackoverflow.com/questions/4822877/why-doesnt-android-use-more-enums
                            Ответить
                    • не память, а сущности
                      Ответить
        • Потому, что в жаве нет литералов мепа? Жавакапец++ :)
          Ответить
          • что такое литераловмепа?

            Всмысле нельзя инлайново мапу задать?
            В гуаве мождно
            Ответить
            • И как же? Литералы - они в языке, библиотеки тут не причем.
              Ответить
              • Да скорее всего какой-нибудь конструктор с переменным числом аргументов, что-то типа:
                map = makeMap(
                    "foo", 5,
                    "bar", new Some()
                );
                Ответить
                • Типизация сломается. Только стринг или обжепт. Впрочем питонистам не привыкать.
                  Ответить
                  • Ну тогда остаётся только пачка типизированных пар. С ним дженерики должны справиться, вроде бы.
                    Ответить
                  • Причем тут питонисты когда речь о джаве?)

                    Сахара для записи мап там и правда нет, к сожалению (для массивов тока е)
                    Ответить

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