试图避免紧密耦合应用程序参数

时间:2013-05-15 16:10:36

标签: code-structure tightly-coupled-code

我的网络应用程序有一个解析URL参数的方法。

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

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

最近,有些事情发生了类似的变化。 " ActiveWells"图层名称已更改为" Surface Participation Wells。" " BoreStick"图层名称已更改为" WellBores。" 因此,该部门的预设网址参数不再有效。

我的经理告诉我添加可以改变" 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参数的责任。

我不知道我是否过度思考这个问题。我对这种发展观感到陌生。 我知道这个问题已经得到了解答,但对我的这个新想法的任何进一步评论都将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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

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

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