ЙажаСценарий / Говнокод #27396 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 JaneBurt, (Updated )

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

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

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

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

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

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

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

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

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

            Ну вот есть страница, и есть её контекст (userName, items, итд) который нужно в ней отобразить
            Ответить

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

Помни, guest, за тобой могут следить!

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


    8