Как избежать запутанного кода в [закрытом] JavaScript

Это обсуждается на нескольких других потоках здесь в настоящее время. Я - последовательный сторонник хранимых процедур, хотя некоторые хорошие аргументы для Linq к Sql представляются.

запросы Встраивания в Вашем коде связывает Вас плотно с Вашей моделью данных. Хранимые процедуры являются хорошей формой договорного программирования, означая, что DBA имеет свободу изменить модель данных и код в процедуре, пока контракт, представленный вводами и выводами хранимой процедуры, сохраняется.

Настраивающиеся производственные базы данных могут быть чрезвычайно трудными, когда запросы прокладываются под землей в коде а не в одном центральном, легком для управления местоположением.

[Редактирование] Здесь другой текущее обсуждение

13
задан Federico Builes 15 October 2009 в 15:38
поделиться

6 ответов

Один из вариантов - иметь переменную, которая показывает текущее состояние, и иметь функцию «контроллер», которая всегда является функцией обратного вызова AJAX. В зависимости от текущего состояния функция контроллера вызовет следующую функцию в строке. Чтобы упростить функцию контроллера, я бы, вероятно, сохранил последовательность функций для вызова в объекте Javascript, поэтому все, что выполняет функция контроллера, - это поиск и переход к следующей функции в последовательности. Этому подходу может способствовать наличие одного объекта Javascript, который всегда является параметром функции (и содержит все данные, которые были возвращены предыдущими вызовами AJAX.

Пример:

var user = {};
var currentState = 1;

var someFunction = function(user) {//stuff here that adds data to user via AJAX, advances currentState, and calls controllerFunction as callback};
var someOtherFunction = function(user) {//stuff here that does other things to user, advances currentState, and calls controllerFunction as callback}

var functionSequence = {1:someFunction, 2:someOtherFunction}

var controllerFunction = function() {
   //retrieve function from functionSequence based on current state, and call it with user as parameter 
}
4
ответ дан 2 December 2019 в 01:31
поделиться

Вы можете контролировать этот вид спагетти с помощью таких вещей, как шаблон Наблюдатель . В некоторых фреймворках JavaScript есть готовые к использованию реализации этой функции, например, функции публикации / подписки Dojo .

2
ответ дан 2 December 2019 в 01:31
поделиться

Если вы хотите, чтобы ваши функции могли работать независимо, снабдите асинхронные функции общими обратными вызовами вместо вызовов "следующей" функции в строке. Затем, как сказал JacobM, настройте «контроллер», который будет вызывать их по очереди. Я изменил ваш пример кода ниже, чтобы продемонстрировать (будьте осторожны, это не было протестировано):

gadgets.util.registerOnLoadHandler(userSetupController())
...
function setupUser(callback) {
  var req = [get data and setup request]
  req.send(some_url, some_data, function(response) { callback(response.user) });
}

function getFriendsFor(user,callback) {
  var friends = [get friends from user]
  var req = [setup request] 
  req.send(some_other_url, some_other_data, function(response { callback(response.friends) });
}

function validateFriendsResponse(friends) {
  if (friends.valid())
    return true;
  else
    return false;
}

function userSetupController() {
    setupUser(function(user){
        getFriendsFor(user,function(friends){
            if (validateFriendsResponse(friends)) {
                loadCanvas();
            } else {
                // don't load the canvas?
            }
        });
    });
}

Создание обратных вызовов становится немного сложным, если вы с ними не знакомы - вот достойное объяснение: http: / /pixelpushing.net/2009/04/anonymous-function-callbacks/. Если вы хотите усложнить задачу (опять же, как предложил JacobM), вы можете написать код, который обрабатывает это автоматически - дайте ему список функций, и он выполняет их по порядку, передавая данные обратного вызова. Удобно, но может оказаться излишним для ваших нужд.

0
ответ дан 2 December 2019 в 01:31
поделиться

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

То, как вы обрисовали код, работает лучше всего, если это лишь один из многих путей, по которым может следовать пользователь; требуется несколько циклов туда и обратно, потому что при каждом взаимодействии вы узнаете, чего хочет пользователь, и другой ответ отправил бы вас в другом направлении. Это когда действительно проявляется слабосвязанный стиль кода, который вы пренебрегаете. Похоже, что каждый шаг не связан с тем, что было раньше, потому что действия пользователя управляют действиями.

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

Вы узнаете, что хочет пользователь, и другой ответ отправил бы вас в другом направлении. Это когда действительно проявляется слабосвязанный стиль кода, который вы презираете. Похоже, что каждый шаг не связан с тем, что было раньше, потому что действия пользователя управляют активностью.

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

Вы узнаете, что хочет пользователь, и другой ответ отправил бы вас в другом направлении. Это когда действительно проявляется слабосвязанный стиль кода, который вы пренебрегаете. Похоже, что каждый шаг не связан с тем, что было раньше, потому что действия пользователя управляют действиями.

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

Это когда действительно проявляется слабосвязанный стиль кода, который вы презираете. Похоже, что каждый шаг не связан с тем, что было раньше, потому что действия пользователя управляют активностью.

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

Это когда действительно проявляется слабосвязанный стиль кода, который вы пренебрегаете. Похоже, что каждый шаг не связан с тем, что было раньше, потому что действия пользователя управляют активностью.

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

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

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

1
ответ дан 2 December 2019 в 01:31
поделиться

Код для обработки функций отображения, скрытия и состояния должен быть извлечен в функции. Затем, чтобы избежать "спагетти", можно использовать встроенные анонимные функции.

function setupUser() {
  var req = [get data and setup request]
  req.send(some_url, some_data, function(response) { 
    var friends = [get friends from user]
    var req = [setup request] 
    req.send(some_other_url, some_other_data, function(response {         
      if (friends.valid())
      ...
      loadCanvas();
    });
  });
}
1
ответ дан 2 December 2019 в 01:31
поделиться

Создайте свой клиент javascript с архитектурой MVC

1
ответ дан 2 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: