Рефакторинг "включить файл ад" - PullRequest
5 голосов
/ 27 сентября 2008

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

РЕДАКТИРОВАТЬ: Одна вещь, которую я забыл спросить: есть ли в vbscript какой-либо механизм для предотвращения включения файла дважды? Сорта, как # ifndef из C?

Ответы [ 6 ]

14 голосов
/ 27 сентября 2008

Есть несколько основных вещей, которые вы можете сделать, взяв на себя классическое приложение ASP, но вы, вероятно, пожалеете, что сделали их.

  1. Исключить дубликаты включаемых файлов . У каждого классического ASP-приложения, которое я когда-либо видел, было 5 страниц «login.asp» и 7 файлов «datepicker.js» и так далее. Выследите и удалите все дубликаты, а затем при необходимости измените ссылки в остальной части приложения. Будьте внимательны при проверке каждого файла при его удалении - часто дублированные файлы имеют небольшие различия, потому что первоначальный автор скопировал их, а затем изменил только копию. Это отличная вещь для Evolution, но не для кода.
  2. Создайте рациональную структуру папок и переместите все файлы в нее. Это очевидно, но это то, о чем вы будете сожалеть больше всего. Независимо от того, являются ли ссылки в приложении относительными или абсолютными, вам придется изменить большинство из них.
  3. Объедините все ваши включаемые файлы в один большой файл . Затем вы можете логически упорядочить все функции и разбить их на отдельные файлы с разумными именами. Затем вам придется просматривать приложение по страницам и выяснять, какими должны быть операторы включения на каждой странице (или придерживаться одного файла, и просто включать его на каждой странице - я не помню, действительно ли это хорошая идея в ASP). Я не могу понять уровень боли, связанный с этим, и это предполагает, что существующие файлы включений не используют интенсивно одноименные глобалы.

Я бы этого не делал. Перефразируя Стива Йегге (я думаю): « нет ничего плохого в классическом приложении ASP, которое нельзя исправить с помощью полной перезаписи ». Я очень серьезно отношусь к этому - я не думаю, что в этом мире тратится больше времени программиста, чем на поддержку приложения ASP, и проблема только усугубляется, поскольку ASP становится все более устаревшей.

10 голосов
/ 27 сентября 2008

@ MusiGenisis Список маркеров - хороший совет, но я не согласен с -

«Я бы этого не делал. Перефразируя Стива Йегге (я думаю),« нет ничего плохого в классическом приложении ASP, которое нельзя исправить с помощью полной перезаписи ». Я очень если серьезно, я не думаю, что в этом мире время программиста тратится больше, чем на поддержку приложения ASP, и проблема только усугубляется, поскольку ASP становится все более устаревшей. "

Все очень хорошо, но если это значительное устаревшее приложение, полное переписывание часто невозможно из-за нехватки времени / ресурсов разработчика.

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

  1. Там, где требуется новая функциональность, она реализована в ASP.NET. Это происходит в 95% случаев. 5% крайних случаев, как правило, заключаются в том, что существует большое количество точек, в которых новый код приложения касается старого приложения, что требует от нас большой перестройки классического ASP, потенциально делая приложение более хрупким.

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

В ответ на ваш вопрос о # ifndef, боюсь, не существует эквивалента.

3 голосов
/ 29 сентября 2008
  1. Используйте один файл для глобальных заголовков и включает в себя (назовите его t-head.asp). Этот файл включен во все файлы asp.
  2. Используйте один файл, чтобы сделать сайт визуальным глобальным заголовком (логотипы, меню и т. Д.) И сразу же включите его. Пусть это называется t-begin.asp
  3. Используйте один файл, чтобы сделать сайт визуально глобальным нижним колонтитулом (авторские права, аналитика Google и т. Д.) И закрыть все div или таблицы, открытые в t-begin.asp. Давайте назовем этот файл t-end.asp
  4. Используйте одну папку для размещения файлов бизнес-логики, которая называется BUS. Файлы в этой папке не могут иметь включений. Каждой функции внутри файла должно предшествовать имя логической единицы (IE: все функции в products.asp должны начинаться с product _ *)
  5. Используйте одну папку, чтобы поместить некоторый повторно используемый код UI. Файлы в этой папке не могут иметь включений.

Пример:

<%@  Language=VBScript %>
<% Option Explicit %>
<% Response.Buffer = true%>
<html>
<head>
<!--#include file="../general/t-head.asp"-->
<!--#include file="../bus/product.asp"-->
<title>Products page</title>
</head>
<body>
<!--#include file="../general/t-begin.asp"-->

   <% 'all your code  %>

<!--#include file="../general/t-end.asp"--> 
</body>
</html>
1 голос
/ 29 сентября 2008

Ничего себе. Меня постоянно удивляет, сколько людей ненавидят ASP. В приличных руках это отлично способный язык для разработки веб-приложений.

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

У меня, как правило, один включаемый файл (initialise.asp или что-то подобное), который сам включает ссылки на несколько библиотек функций (lib_http.asp, lib_mssql.asp или аналогичные), и все функции библиотеки являются автономными, поэтому не нужно беспокоиться о пересечении переменных. Любые глобальные переменные объявляются и устанавливаются в мастер-файле. Это означает, что я могу использовать функцию в любом месте, в любое время и не беспокоиться о том, где она была определена, она просто предназначена для использования. А IDE, такие как Visual Studio и Primalscript, имеют возможность «переходить к определению», когда вы находите вызов функции, которую вы не можете распознать.

Затем все специфичные для сценария включения включаются в сценарий после вызова этого основного файла включения.

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

Краткая структура каталогов является обязательной и легко разрабатывается, но может оказаться непростой задачей пролистать весь код на существующем сайте и изменить любые ссылки или вызовы mappath. Также имейте в виду, что некоторые администраторы IIS запрещают '..\' метод обхода каталогов через VBScript, поэтому все ссылки на файлы должны быть абсолютными путями.

0 голосов
/ 01 октября 2008

Я не знаю, как предотвратить двойное включение, кроме как получить сообщение об ошибке. Вы видите включенные элементы по всей странице, что затрудняет их поиск?

Кроме того, вы работаете с копией кода и базой данных на сервере разработки? Исходя из моего опыта, первое, что нужно сделать, это отделиться от живого сайта как можно скорее. Изначально это доставит вам массу хлопот, но даст вам свободу вносить изменения, не портя живой сайт. Легко сделать одно крошечное изменение во включении и BAM! весь сайт отключается.

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

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

Меньшие проекты - я открываю все в IDE и просто начинаю поиск по всем файлам проекта для функций / саба, чтобы получить знания о логике включения. Практически каждый раз все распространяется повсюду, поэтому я начинаю перестраивать включенные элементы, организованные бизнес-логикой. Я также наткнулся на встроенный код (необработанный код, а не подпрограммы или функции), добавленный во include, поэтому обычно я просто перетаскиваю код обратно на страницу для последующего рефакторинга.

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

0 голосов
/ 27 сентября 2008

Я думаю, вам следует рассмотреть возможность перемещения вашего кода из ASP VBScript в Visual Basic COM DLL. это облегчит вам слишком много включений.

...