1. ActionScript / Говнокод #13129

    −170

    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
    public function set flip(value:Boolean):void {
        if (this.object.flip != value) {
            this.object.flip = value;
            this.clearCells();
            var cell:Cell = this.cell;
        }
    }
    
    public function get cell():Cell {
        if (!this._cell) {
            createCell();
        }
        return this._cell;
    }

    Ненавижу подергивание.

    Запостил: kyzi007, 07 Июня 2013

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

    • показать все, что скрыто
      if (this.object.flip != value) {
              this.object.flip = value;
      }
      это просто шикарно

      if (!this._cell) {
              createCell();
      }
      по мне, проверка вообще должна быть внутри метода - мало ли, в другом месте забудем проверить.

      defensive programming вообще рулит.
      как там в AS дела обстоят с assert'ами?
      Ответить
      • показать все, что скрытоС чем чем?

        if (this.object.flip != value) {
        this.object.flip = value;
        }
        А что тут смущает?

        А проблема передергивания в данном месте в том что после удаления данных происходит обращение к ним, случайно аснхронное, и они воскресают)
        Ответить
        • показать все, что скрыто> С чем чем?
          пишем
          assert условие;
          и в дебаг режиме получаем ошибку выполнения, если условие не выполнено, а в продакшн ассерты не компилятся, что нам дает возможность проверять корректность входных данных\результата без ущерба в производительности, в одну строку и немедленно, без дополнительных усилий тестирования.

          > А что тут смущает?
          а зачем делать проверку, если результат в любом случае value?
          Ответить
          • показать все, что скрытоАссертов нет.
            Затем чтобы не дергать лишний раз, это нормальная практика. Может там на сеттер эвент генерится об обновлении данных.
            Ответить
          • показать все, что скрытоКажется, я ни разу в своей жизни не написал assert, ибо он не нужен. Если случается что-то очень плохое, я желаю знать об этом и в продакшене, а не только во время тестовых запусков. Логи и проверка контрактов с исключениями наше всё.
            Ответить
            • показать все, что скрытоассерт - это же контракт для бедных
              Ответить
            • показать все, что скрытоУ меня логи с эксепшенами под условной компиляцией.
              Ответить
              • показать все, что скрытоО, и еще по поводу логов против ассертов:
                (assert (not (eq x (cdr x))) "Infinite loop, bail out!")
                . . .
                (when (eq x (cdr x)) (format *trace-output* "Entering an infinite loop, stay put!"))
                Ответить
                • показать все, что скрытоЭто совсем тривиальный случай, когда граф состоит из одного элемента, который ссылается сам на себя. Обычно когда мне нужно обходить структуры, которые пользователь мог зациклить, я устанавливаю предел глубины рекурсии и кидаю исключение, если этот предел достигнут. По уму, конечно, нужно выделять сильно связные компоненты графа, но это слишком жирная операция, поэтому ограничиваюсь тривиальной проверкой глубины.
                  Ответить
            • показать все, что скрытоЯ пишу ассерты когда при других обстоятельствах я бы поставил бряк с условием, но у написания кода непосредственно в отладчике есть свои недостатки: бряк может сместиться после редактирования, или просто потеряться между сессиями. В некоторых дебаггерах пока найдешь где бряк поставить - много времени пройдет и т.п. технические неудобства. Кроме того, иногда отладка должна происходить в нескольких окружениях с разными отладчиками. Иногда очень тяжело понять связь между ошибкой и местом, которое привело к ошибке (Лисп / МЛ не очень то соотносят ошибки со строками, особенно в МЛ компилятор всегда старается по максимуму заинлайнить). Поставить бряк в лисповом макросе типа loop? - боюсь, что это совсем бесполезно окажется.
              Ответить
            • Допустим у нас есть некоторые инварианты, поддерживаемые программистом и код сильно на этом завязан. Разве в этом случае ассерты - не подходят?
              Ответить
    • показать все, что скрыто> var cell:Cell = this.cell;
      оставайтесь на линии, ваше присваивание очень важно для нас
      Ответить
      • показать все, что скрытоРазумеется, важно. А как ещё вызвать геттер из строки 09? Вот только смысл это будет иметь, если у createCell есть побочный эффект.
        Ответить
        • показать все, что скрытоКонечно есть. Он закрывает часть карты как "занято". Это особенно актуально если объект удалился в нефеншуйном порядке, а в нашей игре это проще простого. Собственно у нас так и персы воскресали, и обьекты пропадали не до конца... Из за любви к такому паттерну. Я понимаю что надо кодить так чтобы и нуллы не приходили, и все везде своевременно очищалось, но ведь все равно так никто не может. Поэтому стараюсь делать так чтобы было трудно зафейлить.
          Ответить
    • * g o a t s e x * g o a t s e x * g o a t s e x *
      g                                               g  
      o /     \             \            /    \       o
      a|       |             \          |      |      a
      t|       `.             |         |       :     t
      s`        |             |        \|       |     s
      e \       | /       /  \\\   --__ \\       :    e
      x  \      \/   _--~~          ~--__| \     |    x  
      *   \      \_-~                    ~-_\    |    *
      g    \_     \        _.--------.______\|   |    g
      o      \     \______// _ ___ _ (_(__>  \   |    o
      a       \   .  C ___)  ______ (_(____>  |  /    a
      t       /\ |   C ____)/      \ (_____>  |_/     t
      s      / /\|   C_____)       |  (___>   /  \    s
      e     |   (   _C_____)\______/  // _/ /     \   e
      x     |    \  |__   \\_________// (__/       |  x
      *    | \    \____)   `----   --'             |  *
      g    |  \_          ___\       /_          _/ | g
      o   |              /    |     |  \            | o
      a   |             |    /       \  \           | a
      t   |          / /    |         |  \           |t
      s   |         / /      \__/\___/    |          |s
      e  |           /        |    |       |         |e
      x  |          |         |    |       |         |x
      * g o a t s e x * g o a t s e x * g o a t s e x *
      Ответить

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