потребности в синхронном программировании

#oop #programming-languages #asynchronous

#ооп #программирование-языки #асинхронный

Вопрос:

РЕДАКТИРОВАТЬ: Этот вопрос был неправильно выражен. Что я действительно хотел спросить, так это:

Есть ли что-нибудь, что нельзя написать на языках OO (с поддержкой замыканий), используя стиль передачи продолжения?

Вы можете погуглить, что означает CPS, или просто придерживаться определения функции / метода, который никогда ничего не возвращает, всегда куда-то отправляет данные — используя переданный обратный вызов.

И после вашего первоначального вопроса я могу даже ответить себе — ничего подобного нет. И, кроме того, это на самом деле очень хороший принцип OO, который называется Скажи, не спрашивай

 function getName(){
  return this.name;
}

console.log(xyz.getName())
  

против.

 function pushNameTo(callback){
  callback(this.name);
}

xyz.pushNameTo(console.log)
  

хорошо, но на этот раз он был назван в честь того, как он это делает, давайте назовем его в честь того, что он делает, и сделаем его еще более ОО:

 function renderOn(responseBuilder){
  var b = responseBuilder;

  //or just string, whatever, depending on your builder implementation
  b.field("Name: ", this.name);
  b.field("Age: ", this.age);
  b.image("Profile photo", this.imageData);
}

person.renderOn(htmlBuilder);
  

суть здесь в том, что объект инкапсулирует не только свои данные, но даже поведение, дух, индивидуальность. Кто еще должен отвечать за выражение представления person, а не за самого person?

Конечно, это не обязательно означает, что в вашем коде должен быть html, builder служит для этой цели. Он может даже генерировать некоторый xml или другой формат данных для фактического уровня рендеринга пользовательского интерфейса. Но это всегда push вместо pull.

Комментарии:

1. Функциональные языки программирования основаны на этом принципе, поэтому ответ, очевидно, ничего .

2. да, я полностью упустил этот факт, спасибо 🙂

3. @deceze: как javascript связан с функциональными языками программирования?

4. вопрос касается общей разработки . Итак, либо мы обсуждаем какой-то конкретный тип PL (который, очевидно, предназначен для таких трюков), либо не упоминаем исключения (поскольку природа вопроса общая , и мы не ожидаем никаких «но» в ответах).

Ответ №1:

Разумеется, ничего. Подумайте: если у вас есть программа, которая полностью последовательна, вы могли бы просто вставить ее в какую-нибудь оболочку, например document.onload(). Тогда последовательная программа будет запущена асинхронно.

С другой стороны, если все, что у вас есть, — это синхронный язык, вы всегда можете написать асинхронный вариант, имея таблицу выполняемых элементов и внутренний цикл, который проверяет, что было включено, и берет это из таблицы для выполнения. фактически, это было бы очень похоже на базовую среду выполнения, в которой выполняется ваш javascript.

Ответ №2:

Существует два типа программ — императивные и функциональные.

Императивные программы последовательны — один шаг за другим. C , Java и т.д. Являются примерами.

Функциональные программы могут быть не последовательными. Большинство асинхронных шаблонов используют программирование в стиле продолжения, которое является типом функционального программирования с императивными обертонами.

JavaScript — это императивный язык, который обладает первоклассными функциями, то есть он также допускает определенные парадигмы функционального программирования.

То, что вы описали в своем вопросе, является асинхронным программированием в стиле «продолжения». Обратите внимание, что значение «продолжения» — это «остальная часть программы после этой строки». Следовательно, теоретически, каждая императивная программа может быть переписана в стиле «продолжения» (т. е. первая строка с продолжением остальной части программы, начинающейся со второй строки, и так далее, и тому подобное). Например:

 Statement #1
Statement #2
Statement #3
  

может быть переписан как:

 do(Statement #1, function{
  do(Statement #2, function{
    Statement #3
  })
})
  

где второй параметр to do является продолжением инструкции.

Циклы, хотя и сложнее, но их также можно переписать аналогичным образом — по сути, передав тело цикла itsslef в качестве продолжения.