Попытка избежать тесной привязки параметров приложения

В моем веб-приложении есть метод, который анализирует такие параметры URL-адреса.

...
layerName = HtmlPage.Document.QueryString["Layer"] . . . ;
...

В одном из отделов нашей компании есть список URL-адресов с параметрами для этого приложения, которые сложно изменить по неизвестным мне причинам. Они могут использовать такой URL-адрес. ... / default.aspx? Service = Wells & Layer = ActiveWells & Query = XYZ IN ('1234567890 ...')

В последнее время кое-что изменилось примерно так. Название слоя «ActiveWells» изменено на «Лунки участия на поверхности». Имя слоя «BoreStick» изменено на «WellBores». Таким образом, предустановленные параметры URL этого отдела больше не работают.

Мой менеджер сказал мне добавить код, который изменил бы любые экземпляры «ActiveWells» на что-то вроде «Наземные колодцы участия». Затем менеджер сказал, что позже, когда отдел с параметрами URL изменит их все на новые имена, мы сможем удалить этот код.

Я не знаю точно, что такое «тесная связь»; но я знаю, что это плохо, и это звучит как пример этого. Мне также кажется плохой идеей добавлять код с намерением сохранить его временно и удалить позже, потому что этот код может никогда не быть удален и превратиться в окаменелость.

Но я выполнил свои заказы и добавил такой код:

layerName = NameConverter.LayerNameChange(layerName);

В статическом методе LayerNameChange есть оператор switch.

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

Я полагаю, что другой сценарий, похожий на этот, был бы, если бы у приложения на базе консоли или Windows были параметры, которые он ожидал для

Main(string[] args){...}

Есть ли лучший способ сделать это?


Изменить:

Что, если бы вместо того, что я сказал выше, я сделал бы что-то вроде этого псевдокода ниже.

private void MethodToParseURL_Parameters(Func<string, string> nameReplace)
{
   . . .
   layerName = nameReplace(layerName);
   . . .
}

Вызывающий метод будет иметь что-то вроде,

MethodToParseURL_Parameters(new Func<string, string>(NameConverter.LayerNameChange));

Почему метод синтаксического анализа должен знать о существовании класса NameConverter?
Я спросил себя об этом.
В конце концов, это не входит в обязанности синтаксического анализа параметров URL, как я это вижу.

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


person Beebok    schedule 15.05.2013    source источник
comment
Вы начинаете перерабатывать это решение. Вы проделали отличную работу. Меня больше беспокоит SQL-инъекция, поскольку для ее безопасности требуется нечто большее, чем просто анализ URL.   -  person Bob Dalgleish    schedule 17.05.2013


Ответы (1)


Это не проблема сцепления. Передача параметров по имени в функцию (даже в веб-службу) не представляет особой проблемы.

Прежде чем заходить слишком далеко, необходимо решить проблему безопасности SQL Injection, которая просто ... Я полагаю, последний параметр в вашем списке является частью оператора SQL. Что происходит, когда кто-то создает фрагмент оператора SQL, который наносит ущерб вашему сайту? Исследование "SQL-инъекция".

Вы правильно сделали, добавив прокладку NameConverter. Он выполняет перевод имен именно так, как вы должны, и предоставляет локализованный изолированный метод для переназначения имен. Предположим, другой отдел хочет продержаться вечно? Ваш код останется таким навсегда. Однако я бы посоветовал вам использовать более общую функцию карты, используя Map. Таким образом, у вас будет более четкое разделение между данными и контролем.

А что может делать ваш коллега в будущем? Что ж, надеюсь, у вас проблемы с системой выдачи билетов, например, с Bugzilla или Jira. Просто отправьте заявку на неопределенный будущий выпуск, в которой описывается оболочка NameConverter и способы ее изменения. При хорошей дисциплине продажи билетов люди будут знакомы со всеми незавершенными билетами и смогут отозвать их при необходимости.

person Bob Dalgleish    schedule 15.05.2013
comment
Расскажите подробнее о функции карты и об использовании карты. Это шаблон? Чем это отличается от того, что я сделал? Большое спасибо. - person Beebok; 16.05.2013
comment
Под отображением я подразумеваю структуру данных, которая отображает строку в другую строку. В Java это обычно выражается как тип данных Map ‹String, String›; другие языки имеют похожие конструкции. Это означает, что вам не нужен оператор switch или if-cascade для выполнения сопоставления. - person Bob Dalgleish; 17.05.2013
comment
Превосходно. Очень признателен. - person Beebok; 17.05.2013