Си диез / Говнокод #13862 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
public static ListBox GetListBox()
{
    var list = _customList as ListBox;

    if (list != null)
    {
        return list;
    }

    return null;
}

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

Запостил: Smekalisty Smekalisty, (Updated )

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

      • Зато какой-нибудь инструмент для измерения покрытия кода покажет, что именно произошло.
        Ответить
  • 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 вернуть пустую коллекцию или никуда ничего не писать".
        Но в любом случае, проверки и взаимодействие с необязательным элементом беспощадно выделить.
        Ответить
  • WjbIXZoJfNFwSFOGgHsjaMUZHbfXpvWEkzhnMrYJfowOPpzpdVQMMjertOaZqnabUDcIA
    Ответить
  • PWJVFtykKbOiVrPekRdiEYqROVOzwgctbVEcNWoQgadQHXWGpbFzAdLTlTozcdRwbRHOlp
    Ответить
  • XPaZWdbZCbEVlMuqWcFzfvxlkEnqZmuDiUVOkvmDTORhNtUI
    Ответить
  • NKoulUCXvyqGDmSqlEuYLFtwIRFNdjqBTahqiRYcVQBfWAAESbrdjJKrfJBzkpimiP
    Ответить
  • cMAxmIZCwmoHNhSqnPQptDprFdZseqZMHmGNhbdNWFkAcqGzOqGMKk
    Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

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


    8