JavaScript веб-интерфейс имеет общие антишаблоны

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

  HARDCODED

  Hard кодировки ( Hard-кодирование) строки, число, дата ...... вы можете написать все мертвые люди пишут вещи будут мертвы. Это анти-модель , включая женщин и детей, но и наиболее широко используется антишаблоном. Hard-закодированы в наиболее типичным является , вероятно , машинный код (Platform-связанной), который относится к коду для конкретной машины или среды может правильно выполнить, может работать только на вашей машине, он может быть только в ОС Windows недогрузки.

  Например, в написании сценария НПМ мертвый сценарий путь / Users / harttle / bin / fis3 , причина может заключаться в установке очень трудно и может быть установлен для того , чтобы избежать дублирования, они могут быть просто потому , что это так. В любом случае, это все мои коллеги приходят к вам , чтобы спросить, «Почему я здесь буду жаловаться.» Решение состоит в том, чтобы поместить его в управление зависимостями, если есть определенные требования к версии могут использовать пакет блокировку, если все остальное не может рассматриваться как внешние зависимости могут быть помещены в и удалены из локального файла конфигурации контроля версий (например , как Git).

  Например, в Cli инструмент писать специальные папки Death / TMP, ~ / .cache или разделителей или \\ /. Такие строки могут быть получены в основном Node.js встроенного модуля (или другой средой выполнения API), такие , как использование os.homedir, os.tmpdir, как path.sep.

  Повторите код

  Повторите код ( Дублирование) особенно часто встречается в бизнес - коде, почти все от первоначального намерения поддержания стабильности бизнеса. Например: страница нужна хорошее окно поиска, и на странице B, есть ровно один. Тогда программист брат столкнулся с трудным выбором (если прямая копия будет слегка нарушена словами):

  •   B копию, хотят изменить способ A.
  •   В в окне поиска , чтобы реконструировать С, В и А из этого эталонного кода.

  Из - за нехватки времени хотят оставить работу рано, или из - за изменения плохой потребности B , чтобы взять на себя ответственность (PM: Почему A B позволяет сделать плохой ответ на этот вопрос является более сложным, когда первый пропуск), поразмыслив решил взять программу через 2.

  В этот момент вся эта история очень естественно и очень гладкой, что, вероятно , является причиной повторяющегося кода широко используется. Эта история имеет несколько точек на вопрос:

  •   B так легко изменить плохое описание B не считает повторное использование. Тогда вы не должны повторно использовать код B, если она не решает взять на себя техническое обслуживание.
  •   Ответственность B, чем изменить плохой программист брат: был ли ли автор написал тест B, страница тестер регрессионного тестирования B?
  •   Время работает не обязательно приводит к анти-паттерна, а не в качестве причины, чтобы убедить себя. Есть также краткосрочный план достижения элегантности.

  Решение: извлечение кода Б перепланировка образует окно поиска сборки C, чтобы использовать его в странице. Одновременно использовать младший партнер в будущем, в том числе и авторы также призывают к B C мигрировать унифицированное обслуживание.

  Ложный AMD

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

  Поскольку JavaScript в качестве исходной страницы сценария, есть много ссылок на глобальную область грамматики, а также многие методы , основанные на глобальных переменных. JQuery пример $, BOM обеспечивают окно, опуская Var определенные переменные. AMD это сообщество JavaScript ранее модульная спецификация. Это джентльменское соглашение, проблема заключается здесь. Есть бесчисленное множество способов , чтобы написать поддельные модули AMD:

  •   Нет возвращаемого значения. Да, то есть, к побочным эффектам.
  •   Требует прямое определение. Право, это должно быть выполнено немедленно.
  •   Побочные эффекты. Изменение окна или другие общие переменные такие как статические свойства других модулей.
  •   вопросы параллелизм. Неизвестные зависимости легко привести к проблемам параллелизма.

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

  // Файл: login.js

  DEFINE ( ​​'вход', функция () {

  выборки ( '/ аккаунт / Войти'). то (х => {

  window.login = верно

  })

  })

  требуется ([ 'Войти'])

  Модуль AMD и писать непосредственно в <сценария> нет разницы, точнее неконтролируемой (реализация requirejs не является асинхронной). Она не может быть использована другими модулями (например, для достижения снова войти в систему после выхода), потому что он не вернулся любой интерфейс. Кроме того, наличие этого модуля параллелизм задач (Race Condition): Используйте window.login определить , является ли знак в контакте.

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

  определить (функция () {

  возвращать выборки ( «/ счета / логин»)

  .then (() => истина)

  .catch (е => {

  console.error (е)

  вернуться ложным

  }

  })

  расширение Примечания

  Примечания намерение состоит в том, чтобы дать читателям лучше понять намерения кода, но на практике может быть как раз наоборот. Например, прямая жизнь:

  // судья Baidu версия телефона более чем 15

  если (navigator.userAgent.match (/ Chrome: (\ d +)) [1] <15) {

  // ...

  }

  Ха - ха Когда вы читаете этот абзац, я считаю , что выше комментарий успешно потреблять ваше время. Если в первый раз вы видите такие комментарии могут быть невероятно, но истинные проекты большинства комментариев этого состояние. Поскольку код не всегда помнить , чтобы поддерживать указания по техническому обслуживанию, кроме поддержания кода, как правило , больше , чем один человек. Осложнения программы на языке C , чем переменная с именем «Чанг написал комментарий» также очень плохое учение.

  Четкое решение использовать логику для размещения комментариев, пример код переписан следующим образом:

  если (isHttpsSupported ()) {

  // Функция извлекая + имя, чтобы избежать добавления комментариев

  }

  функционировать isHttpsSupported () {

  вернуть navigator.userAgent.match (/ Chrome: (\ d +)) [1] <15

  }

  Функция-расширение

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

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

  Функция SubmitForm () {

  var username = $('form input#username').val()

  if (username === 'harttle') {

  username = 'God'

  } else {

  username = 'Mortal'

  if ($('form input#words').val().indexOf('harttle')) {

  username = 'prophet'

  }

  }

  $('form input#username').val(username)

  $('form').submit()

  }

  这只是用来示例,十几行还远远没有达到“又臭又长”的地步。 但已经可以看到各种目的的修改让 submitForm() 的职责远不止提交一个表单。 一个可能的重构方案是这样的:

  function submitForm() {

  normalize()

  $('form').submit()

  }

  function normalize() {

  var username = parseUsername(

  $('form input#username').val(),

  $('form input#words').val()

  )

  $('form input#username').val(username)

  }

  function parseUsername(username, words)

  if (username === 'harttle') {

  return 'God'

  }

  return words.indexOf('harttle') ? 'prophet' : 'Mortal'

  }

  在重构后的版本中,我们把原始输入解析、数据归一化等操作分离到了不同的函数, 这些抽离不仅让 submitForm() 更容易理解,也让进一步扩展业务更为方便。 比如在 normalize() 方法中对 input#password 字段也进行检查, 比如新增一个 parseWords() 方法对 input#words 字段进行解析等等。

  总结

  常见的反模式还有许多,比如 == 和 != 的使用;扩展原生对象;还有 Promise 相关的 等等。

рекомендация

отwww.cnblogs.com/gcghcxy/p/11304127.html