Как библиотека javascript, такая как Prototype , решает, когда написать функцию, которая принимает серию аргументов или просто принимает один гигантский объект? Ниже приведены примеры двух. Плюсы и минусы каждого хорошо сбалансированы, поэтому я не понимаю, когда использовать тот или иной метод.
Object
new Ajax.Request(
'server.php', {
onSuccess: function() {
console.info('I succeeded');
},
onFailure: function() {
console.info('I failed');
}
);
Плюсы: Порядок аргументов в объекте не имеет значения. Вам не нужно проверять определение функции, когда вы забыли порядок аргументов. Кроме того, когда другие люди читают вызовы этой функции, они лучше понимают, что вы делаете. Представьте, если бы вызов Ajax был таким:
new Ajax.Request(
'server.php',
function() {
console.info('mystery function');
},
function() {
console.info('is this success or failure?');
}
);
Минусы: В заголовке функции не ясно указано, что необходимо передать. Вы вынуждены обновлять свои комментарии.
// unclear what options need to be passed in without comments
Ajax = {
Request: function(url, options) {
}
};
// a little clearer
Ajax = {
Request: function(url, successCallback, failureCallback) {
}
};
Нормальный
new PeriodicalExecuter(
function(myself) {
console.info('I am running');
},
1
);
Плюсы: Определение функции не требует комментариев, чтобы люди могли быстро понять, что это за параметры.
Минусы: Порядок аргументов имеет значение. Сложнее указать значения по умолчанию:
// dirty
PeriodicalExecuter = function(callback, period) {
if (typeof(callback) === 'undefined') {
callback = Prototype.emptyFunction;
}
if (typeof(period) === 'undefined') {
period = 1;
}
};
// clean
PeriodicalExecuter = function(options) {
var myOptions = {callback: Prototype.emptyFunction, period: 1};
Object.extend(myOptions, options);
};