1

我的 Web 应用程序有一个方法可以解析这样的 URL 参数。

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

我们公司的一个部门有一个包含此应用程序参数的 URL 列表,由于我不知道的原因,这些参数很难更改。他们可能会使用这样的 URL。.../default.aspx?Service=Wells&Layer=ActiveWells&Query=XYZ IN ('1234567890...')

最近,发生了类似于以下情况的变化。“ActiveWells”图层名称更改为“Surface Participation Wells”。“BoreStick”图层名称更改为“WellBores”。因此,该部门的预设 URL 参数不再起作用。

我的经理告诉我添加将“ActiveWells”的任何实例更改为“Surface Participation Wells”之类的代码。经理接着说,稍后当带有 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 参数的责任的一部分。

我不知道我是不是想多了。我对这种发展感知水平是新手。我知道这个问题已经得到解答,但如果对我的这个新想法有任何进一步的评论,我们将不胜感激。

4

1 回答 1

1

这不是耦合问题。按名称将参数传递给函数(甚至是 Web 服务)并不是什么特别的问题。

在你走得太远之前必须解决的一个问题是 SQL 注入安全问题,它只是......坐在那里。我想,您列表中的最后一个参数是 SQL 语句的一部分。当有人制作损坏您网站的 SQL 语句片段时会发生什么?研究“SQL 注入”。

您做对了,添加了 shim NameConverter。它按照您应该的方式对名称进行翻译,并提供一种本地化的、隔离的方法来重新映射名称。假设另一个部门想永远坚持下去?您的代码将永远保持这种状态。但是,我建议您使用更通用的地图功能,使用地图。这样,您就可以更清晰地分离数据和控制。

至于你的同事将来能做什么?好吧,我希望你的票务系统有问题,比如 Bugzilla 或 Jira。只需为未定义的未来版本提交一张票,其中描述了 NameConverter 垫片以及如何更改它。凭借良好的票务纪律,人们将熟悉所有未处理的票,并在需要时可以召回。

于 2013-05-15T16:52:33.280 回答