На курсе по стилям программирования нас просят реализовать некоторый код как в «стиле передачи продолжения», так и в «стиле конфетной фабрики».
Мы читаем книгу «Упражнения по стилям программирования» Кристины Видейры Лопес (главы 5 и 8).
Нас просят реализовать коды примеров из книги на другом языке (в книге на Python, сейчас я использую Javascript).
Чтобы понять мою проблему, я покажу вам два основных отличия, показанных в книге:
Стиль конфетной фабрики
#!/usr/bin/env python
read_file(path_to_file):
"""
Takes a path to a file and returns the entire contents of the
file as a string
"""
with open(path_to_file) as f:
data = f.read()
return data
def filter_chars_and_normalize(str_data):
...
.
.
.
print_all(sort(frequencies(remove_stop_words(scan(
filter_chars_and_normalize(read_file(sys.argv[1]))))))[0:25])
Стиль продолжения-перехода
#!/usr/bin/env python
def read_file(path_to_file, func):
with open(path_to_file) as f:
data = f.read()
func(data, normalize)
def filter_chars(str_data, func):
pattern = re.compile(’[\W_]+’)
func(pattern.sub(’ ’, str_data), scan)
.
.
.
read_file(sys.argv[1], filter_chars)
JavaScript
const fs = require('fs');
var myArgs = process.argv.slice(2);
function read_file(path_to_file,callback){
fs.readFile(path_to_file, "utf-8",(err, data) => {
if (err) throw err;
callback(data);
});
}
function string_to_lower(str_data,callback){
var data = str_data.toLowerCase()
callback(data)
}
.
.
.
function TermFrequency(){
read_file(myArgs[0],function(result){
string_to_lower(result, function(result2){
remove_non_alphanumeric(result2,function(result3){
remove_stop_words(result3,function(result4){
frequencies(result4,function(result5,result6){
sort(result5,result6,function(result7,result8){
write_out(result7,result8)
})
})
})
})
})
})
}
Из того, что я понял, и из примеров из книги, то, что написано выше на Javascript, — это передача Continuation, так как функция передается в качестве параметра. Но в то же время, чтобы вызвать основную функцию, вы используете тот же вызов «в конвейерном стиле», что и конфетная фабрика.
Как можно добиться стиля конфетной фабрики с помощью кода, написанного на JS выше? Является ли этот код (который основан на обратных вызовах) конфетной фабрикой или стилем передачи продолжения? Как я могу написать приведенный выше код, не используя обратные вызовы и в то же время доверяя JS?
TermFrequency
, которую вы описываете, определенно относится к стилю передачи продолжения. Если ваши служебные функции проще, так чтоstring_to-lower
, например, просто принимает строку и возвращает ее версию в нижнем регистре, то вы можете легко переписать ее, чтобы она была заметно проще с помощью промисов илиasync
/await
. Вы не можете избавиться от лежащей в основе асинхронности. Если вы включаете асинхронную функциюread_file
, все, что ее касается, также должно быть асинхронным. - person Scott Sauyet   schedule 24.09.2018