1. Куча / Говнокод #27860

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    Можно ли считать говнокодом (говноAPI) правильно работающую, но незадокументированную особенность API?
    Например у вьюхи есть свойство isOpen, которое может быть задано (true/false) а может быть не задано (undefined). 
    Первое нужно для управления видимостью в реактивном стиле, второе предполагает что разработчик будет
    управлять видимостью через хендлы вьюхи. И оно так и работает - если isOpen=undefined, то этот проп просто игнорируется
    при обновлении вьюхи (чтобы не допустить конфликта source truth). Но этого нет в документации, отчего неосторожное 
    использование булеана и значения которое может быть undefined в качестве значения isOpen, приводит к забавному
    косяку - вьюха должна исчезнуть, но она не исчезает! И тут по-началу грешишь на забагованное API. Но в нем нет бага!

    Запостил: JaneBurt, 06 Декабря 2021

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

    • Поле, начинающееся с "is", и имеющее три состояния, это, разумеется, говнокод.
      А если это (совсем не очевидное, будем честны) поведение еще и недокументировано, то говнокод в квадрате.

      Ты понял(а) значение undefined так, твой коллег этак, а автор API вообще подумал, что это бага или побочный эффект, и пофиксил это в минорном апдейте
      Ответить
      • В данном случае как раз автор либы и объяснил, что это ожидаемое поведение. Прост на уровне API неочевидно что отсутствующий isOpen предполагает управление видимостью через хендлы компонента, а isOpen булевский - в реактивном стиле. И в документации это не отражено.

        Я бы в данном случае для устранения неочевидности сделала бы поле типа visibilityBehavior: 'imperative' | 'reactive'.

        > Поле, начинающееся с "is", и имеющее три состояния, это, разумеется, говнокод.

        А если это поле не нужно когда собрался управлять видимостью не реактивно, а через методы компонента? Смысл undefined в том что нам не во всех случах нужно данное значение. Ну или в том что данных на каком-то шаге может не существовать вообще, а выполнить какую-то логику надо.
        Ответить
        • Если в каком-то случае не нужно какое-то значение, то его нужно вынести.

          Пусть будет интерфейс Strategy и две реализации: Imperative и Reactive.
          И поле "isOpen" будет в том, где оно используется.
          Ответить
          • Ну да, можно и tagged union-ами (и так даже правильнее, но потребует кучи рефакторинга если на каждый рендер меняется какое-то состояние - тогда вьюха будет говнокодом). Perfomance tradeoff тут ни к чему, открытие/закрытие не в реал-тайме меняется
            Ответить
          • о, а вот и джавка
            Ответить
            • Ага

              У меня от джавки внутри вырос довольно крупный ``AbstractFactoryBuilderProxyProviderImp l``, и он иногда говорит за меня.

              Бурт правильно сказали: в TS нужен UNION, а никакой не интерфейс. просто юнион из двух реализаций.
              Ответить
              • Вообще кажется что ООПшные Джава паттерны по большей части возникли из-за стремления к типобезопасности (банки, тырпрайз же) при скудной на выразительность системе типов (по сравнению даже с Растом).

                Смысл интерфейса в том, что нам важно иметь возможность прокинуть определенные данные или поведение в модуль на уровне юзера. И не важно какие еще поля содержит структурка либо как вписать новый код так, чтобы не сломать старую неизменную часть. В TS interface часто используется как объект (структурка), не являющаяся инстансом user-defined класса.
                Ответить
    • Поддержу guest6: запилите enum с няшными названиями вариантов и не ебите мозг.

      З.Ы. Использование недокументированной фичи, само собой, говнокод.
      Ответить
    • Не совсем поддержу guest6: теоретически можно заявить, что во всех настройках undefined - это "берём значение из такого-то источника". Но если так себя ведут только isOpen и ещё полторы настройки - это говносрань.
      Ответить
      • В любом случае это должно быть задокументировано или выпилено няхуй.
        Ответить
        • Документацию я и имел в виду под
          > можно заявить
          Так-то да, любую незадокументированную штуку можно удалить и никто не сможет жаловаться. Правда, мне попадался случай, что какую-то штуку сначала тихонько удаляли из документации :D
          Ответить
          • > можно удалить

            К сожалению это не так. Юзеры виноватым будут считать тебя, а не того, кто это вызывал...

            Так что проще задокументировать. И поддерживать вечно.
            Ответить
      • если undefined то значение по default true/false ... а не true/false/error
        Ответить
    • Шахтерам выдают бланки заявлений об удержании из их зарплаты определенной суммы на помощь пострадавшим при взрыве в шахте "Листвяжная". Средства обещают перечислить Красному Кресту, который отчитался о сборе уже 31 млн рублей.
      Ответить
    • С uMatrix, с которым все тут бегают, удобно ли вылавливать скрипт, который срёт на экран всякими wikimedia central notice и подобное навесное говно?

      Бля, не только на экран, но и в локал сторож
      Ответить
    • Определите, какой штамм коронавируса подходит лично вам. Наденьте маску и внимательно посмотрите на таблицу с социально безопасного расстояния 1,5 метра. Бегите себя и своих близких.

      https://novayagazeta.ru/static/records/2f38f06b224648d0941b5ff8193d69ab.webp
      Ответить
    • Берегите детей от красных.
      Депутат из КПРФ попался на совращении 11-летнего мальчика

      Больницы достроят!
      ЕР добилась финансирования на завершение строительства больниц в регионах

      (именно поэтому я против "HTTPS")
      Ответить
      • КОММУНИСТЫ БЕГУТ НА ЗАПАД.
        Почему в КПРФ предпочитают владеть зарубежной недвижимостью?
        Ответить
      • ебальце у КПРФовца и правда пидорское. Вообще по молодым мальчикам у нас Жириновский, но и коммунисты вот не отстают, особенно конечно в осетинском отделении
        Ответить

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