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

    +137

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    public static ListBox GetListBox()
    {
        var list = _customList as ListBox;
    
        if (list != null)
        {
            return list;
        }
    
        return null;
    }

    Наверное это бояный пример говнокода, но все же я скопировал его собственными руками

    Запостил: Smekalisty, 27 Сентября 2013

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

    • да, а вдруг с NPE упадет
      Ответить
      • Тогда и в строке 10 упадет ;) Смерть неизбежна.
        Ответить
        • Зато какой-нибудь инструмент для измерения покрытия кода покажет, что именно произошло.
          Ответить
    • public static ListBox GetListBox()
      {
          return _customList as ListBox;
      }


      Ваш капитан.
      Ответить
      • Интересно зачем там вообще as? _customList может быть не только листбоксом? :)
        Ответить
        • Ваш капитан дубль два.
          это проверка типа, если у _customList тип ListBox, то вернется ссылка на объект _customList иначе вернется null.

          Зачем это было сделано хз. Видимо может быть само поле помечено типом object.
          И типа супер-пупер полиморфно.
          Ответить
          • > Видимо может быть само поле помечено типом object.
            Адекватная причина только одна - там может быть не только листбокс.

            > супер-пупер полиморфно
            Ага, настолько полиморфно, что пришлось корячить неполиморфный геттер под конкретный тип ;)
            Ответить
            • Ну я это и имел ввиду.
              Ответить
              • Вообще, имхо, в таких случаях достаточно одного геттера под базовый класс/интерфейс:
                // если нам похуй, какой там список
                BaseClassForAllLists list = someShit.GetList();
                list.foo(); // юзаем методы, общие для любого списка
                
                // если нам не похуй, какой там список
                ListBox listBox = someShit.GetList() as ListBox;
                if (listBox != null) {
                   listBox.bar(); // юзаем специализированные методы
                }
                А неполиморфные геттеры для полиморфных полей нинужны, ибо только повышают связность кода, и запутывают его: "почему для ListBox'а и ComboBox'а я должен писать some.GetListBox(), а для MySuperMegaBox'а надо юзать другой способ, а именно some.GetList() as MySuperMegaBox?"
                Ответить
                • чтобы не повышать связность, нам вообще должно быть все похуй, кроме минимальных интерфейсов.
                  если перегибать - то по интерфейсу с полями на метод. ну вы поняли.
                  Ответить
                  • > вообще должно быть все похуй
                    ООП превращает людей в похуистов.

                    > по интерфейсу на метод
                    Ну это уже точно перегиб. Все-таки связанные друг с другом методы должны быть в одном интерфейсе.
                    Ответить
                    • ну я намекал на похожее в яве: Closeable, AutoCloseable, RamdomAccess, Serializable и так далее. вот так и получается, что получаешь объект, а без интроспекции он вообще бесполезен
                      Ответить
                  • Что я хотел показать тем постом: если некто в какое-то поле хочет помещать объекты конкретных классов ComboBox, ListBox, SomeShitBox и что-то еще, что будет добавлено потом, то он уже сбился с пути, и медленно но верно приближается к яме с говном...
                    Ответить
                    • нет, он хочет, чтобы код упал, когда он изменит контрол. тогда он изменит код
                      Ответить
                      • Тогда это просто объекты конкретных классов ComboBox, ListBox и SomeShitBox. Что, имхо, не так уж и страшно, если не планируется туда что-то еще добавлять (хотя все равно как-то неприятно сувать разнородные вещи в одно поле)...

                        Страшно, имхо, только тогда, когда и частное и общее суют в одно поле. После чего с частными случаями работают каким-то особым способом, а с общим - другим, обобщенным. И везде ифы, касты, свичи... и в else вызовы обобщенных методов :)
                        Ответить
                        • > После чего с частными случаями работают каким-то особым способом, а с общим - другим, обобщенным.
                          P.S. Я не отрицаю, что для производительности это может оказаться полезным.
                          Ответить
                          • > P.S. Я не отрицаю, что для производительности это может оказаться полезным.
                            врядли. для производительности хорошо правило без исключений, исключения слишком дороги. да и будить лишние сущности дороговато в плане ресурсов. (если у нас 1е6 посетителей в секунду)
                            Ответить
                            • > хорошо правило без исключений
                              Ну вот взглянем на тот же RandomAccess и сортировку. Здесь разделение на два случая только ускоряет работу :)

                              Примеров, когда какое-то дополнительное знание может сделать код более быстрым, довольно много.

                              P.S. Хотя, может быть, более правильным было бы вообще не смешивать интерфейсы с последовательным и произвольным доступом... В том же линуксе не зря блочные и символьные устройства разделены...
                              Ответить
                              • ну "без исключений" - я имею ввиду линейный сценарий при множестве веток, в зависимости от конфиги и входных дааных. и ничего лишнего, всякая жизнь скрипта полностью целесообразна и не тратится на ненужные проверки, все уже есть.
                                например, вместо if(a)o[a] else o.[b] просто o.a или что-то вроде на всю логику - которая условна, но в данный момент естественна и линейна. потом будет другая, но не менее линейная
                                Ответить
                • Не, вы не поняли. Я лишь убрал некоторые строчки, из примера, благодаря которым этот код попал сюда, в архитектуру я не лез.
                  Но вообще, если копать глубже, даже ваш код — излишество, так как у листов должен быть минимальный общий интерфейс, и он, в принципе, есть.
                  Ответить
                  • > у листов должен быть минимальный общий интерфейс
                    Так это верхний код, где нам похуй ;) Где же в нем излишество?

                    Нижний код это скорее фоллбек, на случай если очень хочется вызвать что-то специализированное, а архитектуру менять не хочется. И в нем излишества не больше, чем в коде ОП'а.
                    Ответить
                    • >Где же в нем излишество?
                      Я про нижний конечно же.

                      PS
                      Код опа нельзя принимать за эталон. :)
                      Ответить
            • это придает уверенности автору
              Ответить
    • С одной стороны, автор приводит какой-то более-менее произвольный тип компонента к конкретном. И выносит такое приведение в отдельный метод, который будут вызывать работающие с конкретным типом. Сделал шов.
      С другой стороны, по коду после вызова этого метода будут разбросаны проверки на нулл. Так что это была полумера.
      Ответить
      • >после вызова этого метода будут разбросаны проверки на нулл
        >Так что это была полумера.
        +1.
        Имхо удобнее получить ClassCastException, чем потом везде проверять. Или не проверять и получить NPE.
        >_customList as ListBox
        Сахар, который особо не спасает.
        Ответить
        • Ну, можно удариться об ООП и возвращать самописный NullListBox.
          Или можно остановиться на локализации взаимодействия с этим типа-ListBox'ом до нескольких методов чтения/записи, каждый из которых вначале содержит граничное условие "если не ListBox вернуть пустую коллекцию или никуда ничего не писать".
          Но в любом случае, проверки и взаимодействие с необязательным элементом беспощадно выделить.
          Ответить
    • vanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

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