В прошлом выпуске мы обсудили дизайн компонента управления очередями и дали ему громкое и уникальное имя: Smart Queue. На этот раз мы собираемся применить предыдущие результаты проектирования на практике и реализовать их с помощью кода.
Во-первых, нам нужно рассмотреть структуру исходного файла, то есть решить, как разбить код на независимые файлы. Зачем это делать? Помните, в конце прошлого выпуска я упоминал, что этот компонент будет использовать «внешний код»? Чтобы различать назначение кода, было решено разделить код как минимум на две части: файл внешнего кода и файл Smart Queue.
Различение целей — это только одно, а во-вторых, распределение их по независимым файлам полезно для обслуживания кода. Представьте, что однажды в будущем вы решите добавить некоторые новые расширенные функции к существующим базовым функциям управления очередью или упаковать их в компонент, реализующий конкретную задачу, но вы хотите сохранить существующие функции (внутренняя реализация) и вызвать метод (внешний интерфейс) остаются неизменными, то лучшим выбором будет запись нового кода в отдельный файл.
Что ж, в следующий раз мы остановимся на теме расположения файлов, а теперь перейдем к делу. Первым шагом, конечно же, является создание собственного пространства имен для компонента. Весь код компонента будет ограничен этим пространством имен верхнего уровня:
вар SmartQueue = window.SmartQueue ||
SmartQueue.version = '0.1';
Если во время инициализации вы столкнулись с конфликтом пространства имен, перенесите его и используйте. Обычно этот конфликт вызван повторным обращением к коду компонента, поэтому «перемещение» приведет к переписыванию объекта с той же реализацией; в худшем случае, если на странице окажется другой объект, также называемый SmartQueue, это будет неловко, я бы это смутил; переопределить вашу реализацию — если больше нет конфликтов имен, в основном два компонента могут работать без происшествий. Также дайте ему номер версии.
Далее создайте три очереди для SmartQueue по трем приоритетам:
var Q = SmartQueue.Queue = [[], [], []];
Каждый из них представляет собой пустой массив, поскольку задачи еще не добавлены. И, кстати, создайте для него «ярлык». Если вы захотите получить доступ к массиву позже, просто напишите Q[n].
Далее наш главный герой Задача выглядит величественно — здесь описано, как создать новую Задача:
Я не буду вдаваться в конкретные детали внутри. С необходимыми комментариями, в целом наш код может быть самоописывающимся, и то же самое справедливо и для последующих кодов. Здесь мы говорим заказчику (пользователю): Если вы хотите создать новый экземпляр SmartQueue.Task, вы должны передать этому конструктору хотя бы один параметр (последние три можно опустить для обработки по умолчанию), иначе будет выдано исключение.
Но этого недостаточно. Иногда клиенты хотят клонировать новый экземпляр из существующей задачи или восстановить «исправное тело» (реальный экземпляр объекта задачи) из «отключенного тела» (объекта с некоторыми атрибутами задачи) путем. Описанный выше способ построения немного неудобен — заказчику приходится писать так:
var Task1 = новый SmartQueue.Task(obj.fn, 1, '', obj.dependentities);
Источник: Alipay UED.
var T = SmartQueue.Task = функция (fn, уровень, имя, зависимости) {
if(typeof fn !== FUNCTION) {
throw new Error('Неверный тип аргумента: fn.');
}
это.фн = фн;
this.level = _validateLevel(уровень) ? уровень: LEVEL_NORMAL;
// определяем тип имени
this.name = typeof name === STRING && name ? name: 't' + _id++;
// зависимости могут быть получены как «Объект», поэтому вместо этого используйте instanceof.
this.dependents = зависимости экземпляр массива зависимости: [];
};