- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 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;
});
Вот почему я за четкое разделение объектов/структур и хэшей (ассоциативных массивов).
MAKAKA 07.05.2021 16:12 # 0
Или ты о "_total"? Так что мешало rank в отдельное поле вынести?
JaneBurt 07.05.2021 22:41 # 0
Да. В каждый метод, где нужно перебрать символы, нужно учитывать ето поле. Если добавится еще поле, без рефакторинга структуры пришлось бы во все методы добавить еще одну проверку. И т.д. Это побочный эффект от сваливания хэш-записей и свойств строго определенной структуры в одну кучу.
> Так что мешало rank в отдельное поле вынести?
Недостаток опыта, желание запилить кое-как работающую хрень как можно быстрее. Собсна ето самописная структурка для генерации "слов" из латинских букв. В проекте есть и другие перлы (в т.ч. знаменитая "магическая кнопка/божественный объект").
MAKAKA 07.05.2021 22:44 # 0
В мапе точно так же можно было бы разместить ненужное поле, и всюду его игнорировать.
Реальную проблему этого кода ты описал сам:
>Недостаток опыта, желание запилить кое-как работающую хрень как можно быстрее
JaneBurt 07.05.2021 23:14 # 0
Имеет. Какой бы ни был язык, хэш и объект - логически разные структуры данных.
guest6 07.05.2021 23:23 # 0
К какому типу данных относится структура, описывающая все переменные, доступные в шаблоне веб приложения?
Ну вот есть страница, и есть её контекст (userName, items, итд) который нужно в ней отобразить
JaneBurt 08.05.2021 00:24 # 0
Относительно логики самого приложения - объект, ибо имеет разнородные данные
MAKAKA 08.05.2021 00:32 # +1
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")
Двум разным программистам будет "очевидно" разное.
Потому что никакой семантической разницы между хешем и объектом нет в скриптовых языках
PolinaAksenova 08.05.2021 00:34 # 0
MAKAKA 08.05.2021 00:39 # 0
PolinaAksenova 08.05.2021 00:41 # 0