Я пишу файловый процессор в JavaScript (Node.js). Упрощенный псевдо-код, как показано ниже. Для каждой строки в файле она выводится на вывод, и если строка является индикатором включения, она рекурсивно обрабатывает включенный файл.JavaScript - рекурсивный вызов частичной прикладной функции
function fileProcessor (file) {
// read lines from file
lines.forEach(function (line) {
// #1 - include processor:
if line matches "#include includefile"
fileProcessor(includefile);
// #2 - output processor:
// write line to output
});
}
Следующий шаг я хочу улучшить свой дизайн, отключив файловый процессор и линейный процессор. Я знаком с OO, он должен выглядеть как диаграмма классов. Но теперь я хочу попробовать это в FP.
Определить функцию, которая возвращает fileProcessor, которые применяются процессоры линии.
var fileProcessorGen = function (lineProcessors) {
return function (file) {
// read lines from file
lines.forEach(function (line) {
lineProcessors.forEach(function (processor) {
processor.call(this, line);
});
});
};
};
Моя цель - добиться разделения проблем. В этом примере есть только два линейных процессора, но на самом деле их будет больше. И вызывающий абонент будет использовать некоторые линейные процессоры в своей цели. Поэтому я не перекодирую их в файловый процессор или линейные процессоры.
var fileProcessor = fileProcessorGen([includeProcessor, outputProcessor]);
Теперь моя проблема заключается в том, как я могу назвать fileProcessor (который является частичным приложением) внутри моего включенного процессора?
function includeProcessor(line) {
if line matches "#include includefile"
fileProcessor(includefile); // <--- how to get fileProcessor ?
};
function outputProcessor(line) {
// write line to output
}
Возможно, мне нужно передать файлПроцессор в качестве аргумента в includeProcessor, но как?
function includeProcessor(line, fileProcessor) {
if line matches "#include includefile"
fileProcessor(includefile);
};
var fileProcessorGen = function (lineProcessors) {
return function (file) {
// read lines from file
lines.forEach(function (line) {
lineProcessors.forEach(function (processor) {
processor.call(this, line, ???); // <-- how to pass the parameter?
});
});
};
};
Моя цель - добиться разделения проблем. В этом примере есть только два линейных процессора, но на самом деле их будет больше. И вызывающий абонент будет использовать некоторые линейные процессоры в своей цели. – aleung
BTW, интересно, в моем решении функции линейного процессора действительно созданы каждый раз, когда он называется? Я думаю, что функции создаются один раз путем объявления, а ссылки передаются в массиве. Я новичок в JavaScript, пожалуйста, исправьте меня, если я ошибаюсь. – aleung
@aleung Надеюсь, я мог бы это немного разъяснить. Вы не одиноки с этой путаницей. Люди часто начинают искать самые причудливые функции, а затем через некоторое время возвращаются к использованию самых простых функций, потому что их легко писать/читать/поддерживать/не испортить и обычно выполнять намного лучше :) – Winchestro