1. JavaScript / Говнокод #27396

    +1

    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
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    // Define the module
    define(function(require) {
      // Require empty list error
      var EmptyListError = require('../errors/property_errors').EmptyListError;
    
      // Character-rank list class
      function WeightedList(/* ...keys */) {
        this._total = 0;
        this._generateList.apply(this, arguments);
      }
    
      WeightedList.prototype._generateList = function() {
        var collection;
        if (typeof arguments[0] == 'object') {
          collection = arguments[0];
        } else {
          collection = arguments;
        }
    
    
        for (var i = 0; i < collection.length; i++) {
          this[collection[i]] = this[collection[i]] === undefined ? 1 : this[collection[i]] + 1;
          this._total++;
        }
      }
    
      WeightedList.prototype.getRandomKey = function() {
        if (this._total < 1)
          throw new EmptyListError();
    
        var num = Math.random();
        var lowerBound = 0;
    
        var keys = Object.keys(this);
        for (var i = 0; i < keys.length; i++) {
          if (keys[i] != "_total") {
            if (num < lowerBound + this[keys[i]] / this._total) {
              return keys[i];
            }
            lowerBound += this[keys[i]] / this._total;
          }
        }
    
        return keys[keys.length - 1];
      };
    
      WeightedList.prototype.increaseRank = function(key) {
        if (key !== undefined && key != "_total") {
          if (this[key] !== undefined) {
            this[key]++;
          } else {
            this[key] = 1;
          }
    
          this._total++;
        }
      };
    
      WeightedList.prototype.clearRanks = function() {
        var keys = Object.keys(this);
        for (var i = 0; i < keys.length; i++) {
          if (keys[i] != "_total") {
            this._total -= this[keys[i]] - 1;
            this[keys[i]] = 1;
          }
        }
      };
    
      return WeightedList;
    });

    Вот почему я за четкое разделение объектов/структур и хэшей (ассоциативных массивов).

    Запостил: JaneBurt, 07 Мая 2021

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

    • JS образца 2007-го года вижу, а почему ты за разделение пока не вижу. Поясни, пожклста.

      Или ты о "_total"? Так что мешало rank в отдельное поле вынести?
      Ответить
      • > Или ты о "_total"?

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

        > Так что мешало rank в отдельное поле вынести?

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

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

            Имеет. Какой бы ни был язык, хэш и объект - логически разные структуры данных.
            Ответить
            • > хэш и объект - логически разные структуры данных.

              К какому типу данных относится структура, описывающая все переменные, доступные в шаблоне веб приложения?

              Ну вот есть страница, и есть её контекст (userName, items, итд) который нужно в ней отобразить
              Ответить
              • > К какому типу данных относится структура, описывающая все переменные, доступные в шаблоне веб приложения?

                Относительно логики самого приложения - объект, ибо имеет разнородные данные
                Ответить
                • В Django, однако, это dict:
                  https://docs.djangoproject.com/en/3.2/topics/templates/#django.template.backends.base.Template. render

                  >If context is provided, it must be a dict. If it isn’t provided, the engine will render the template with an empty context.

                  И во фласке
                  https://flask.palletsprojects.com/en/1.1.x/templating/#context-processors

                  А вот в Ruby on Rails это объект
                  https://guides.rubyonrails.org/layouts_and_rendering.html
                  (см на строку "@books = Book.all")

                  Двум разным программистам будет "очевидно" разное.
                  Потому что никакой семантической разницы между хешем и объектом нет в скриптовых языках
                  Ответить
                  • Объект — это хэш со схемой.
                    Ответить
                    • А кто проверяет эту схему в скриптовых языках?
                      Ответить
                      • Кто угодня. Программист через "isinstance(obj, Schema)", фреймворк через встроенные методы, статический анялизатор через тайпхинты.
                        Ответить

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