Код для интерфейса. Не реализация не имеет отношения к Java, а также к конструкции интерфейса.
Эта концепция была выведена в известность в книгах «Шаблоны / Банды четырех», но, скорее всего, была вокруг нее задолго до этого. Концепция, безусловно, существовала задолго до того, как существовала Java.
Конструкция интерфейса Java была создана для помощи в этой идее (среди прочего), и люди стали слишком сосредоточены на конструкции как центр смысла, а не оригинальное намерение. Тем не менее, это причина, по которой у нас есть общедоступные и частные методы и атрибуты в Java, C ++, C # и т. Д.
Это означает просто взаимодействовать с открытым интерфейсом объекта или системы. Не беспокойтесь и даже не ожидайте, как он делает то, что он делает внутренне. Не беспокойтесь о том, как это реализовано. В объектно-ориентированном коде, поэтому мы имеем общедоступные и частные методы / атрибуты. Мы намерены использовать общедоступные методы, потому что частные методы существуют только для внутреннего использования внутри класса. Они составляют реализацию класса и могут быть изменены по мере необходимости без изменения открытого интерфейса. Предположим, что в отношении функциональности метод класса будет выполнять ту же операцию с тем же ожидаемым результатом каждый раз, когда вы вызываете его с теми же параметрами. Это позволяет автору изменять способ работы класса, его реализацию, не нарушая взаимодействия с ним.
И вы можете запрограммировать интерфейс, а не реализацию, не используя конструкцию интерфейса. Вы можете запрограммировать интерфейс, а не реализацию на C ++, которая не имеет конструкцию интерфейса. Вы можете интегрировать две огромные корпоративные системы гораздо надежнее, если они взаимодействуют через публичные интерфейсы (контракты), а не вызывают методы для объектов, внутренних для систем. Ожидается, что интерфейсы всегда будут реагировать на один и тот же ожидаемый путь с учетом тех же входных параметров; если реализован интерфейс, а не реализация. Концепция работает во многих местах.
Встряхните мысль о том, что Java-интерфейсы имеют что-то, что связано с концепцией «Программа для интерфейса, а не реализация». Они могут помочь применить концепцию, но это не концепция.
Вы можете использовать Function.prototype.bind
для создания новой функции со значением, переданным ее первому аргументу, например
P.then(doWork.bind(null, 'text'))
, и вы можете изменить doWork
на ,
function doWork(text, data) {
consoleToLog(data);
}
Теперь text
будет фактически 'text'
в doWork
, а data
будет значением, разрешенным обещанием.
Примечание: Пожалуйста, сделайте убедитесь, что вы прикрепляете обработчик отклонения к вашей цепочке обещаний.
Рабочая программа: Живая копия REPL для Babel
function doWork(text, data) {
console.log(text + data + text);
}
new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function () {
resolve(a);
}, 3000);
} else {
reject(a);
}
})
.then(doWork.bind(null, 'text'))
.catch(console.error);
Lodash предлагает хорошую альтернативу для этой точной вещи.
P.then(_.bind(doWork, 'myArgString', _));
//Say the promise was fulfilled with the string 'promiseResults'
function doWork(text, data) {
console.log(text + " foo " + data);
//myArgString foo promiseResults
}
Или, если вы хотите, чтобы ваша функция успеха имела только один параметр (результат выполнения обещал), вы можете использовать его путь:
P.then(_.bind(doWork, {text: 'myArgString'}));
function doWork(data) {
console.log(data + " foo " + this.text);
//promiseResults foo myArgString
}
Это добавит text: 'myArgString'
в контекст this
внутри функции.
Возможно, самый простой ответ:
P.then(function(data) { return doWork('text', data); });
Или, поскольку это помечено ecmascript-6
, использование функций стрелок:
P.then(data => doWork('text', data));
Я нахожу это наиболее читаемым, и не слишком много, чтобы писать.
Использовать currying.
var P = new Promise(function (resolve, reject) {
var a = 5;
if (a) {
setTimeout(function(){
resolve(a);
}, 3000);
} else {
reject(a);
}
});
var curriedDoWork = function(text) {
return function(data) {
console.log(data + text);
}
};
P.then(curriedDoWork('text'))
.catch(
//some error handling
);
curriedDoWork
в обещание, выполнив return new Promise()
в первой строке этой функции, обещание выполняется, как только вы вызываете curriedDoWork()
(как вы делаете в ..then(curriedDoWork('text'))
– Flame
23 March 2018 в 18:39
call
вызывает функцию на месте,bind
создает новую функцию, однако оба принимают контекст выполнения в качестве своего первого аргумента. – sdgluck 2 October 2015 в 18:15