2013-05-15 105 views
1

我的web應用程序有一個解析URL參數的方法。試圖避免應用程序參數的緊密耦合

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

一個部門在我們公司有哪些網址爲這個應用程序是很難改變的原因不明,以我的參數列表。 他們可能會使用這樣的URL。 .../Default.aspx的?服務=韋爾斯&層= ActiveWells &查詢= XYZ IN( '1234567890 ...')

最近,有些事情改變類似於以下。 「ActiveWells」圖層名稱更改爲「曲面參與井」。 「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參數的責任的一部分。

我不知道我是否過度這個。我對這種發展水平感到陌生。 我知道這個問題已經得到解答,但對於這個我的新想法的任何進一步的評論將不勝感激。

+0

您已開始過度設計此解決方案。到目前爲止,你做得很好。我會更關注SQL注入,因爲這不僅僅需要URL解析來保證它安全。 –

回答

1

這不是一個耦合問題。將參數按名稱傳遞給函數(甚至是Web服務)並不是一個特別的問題。

在你走得太遠之前必須處理的一個問題是SQL注入安全問題,就是......坐在那裏。我猜想,列表中的最後一個參數是SQL語句的一部分。當有人制作一段會損害您的網站的SQL語句片段時會發生什麼?研究「SQL注入」。

您做了正確的事,添加了墊片NameConverter。它會按照您應有的方式進行名稱翻譯,併爲重新映射名稱提供本地化的獨立方法。假設另一個部門想永遠堅持下去?你的代碼將永遠保持這種方式。不過,我建議你使用Map來使用更一般的地圖功能。這樣你就可以更清晰地分離數據和控制。

至於你的同事未來可以做什麼?那麼,我希望你有一個麻煩的票務系統,比如Bugzilla或Jira。只需爲未定義的未來發行版發佈一張票,該發行版描述了NameConverter墊片以及如何更改它。憑藉良好的售票紀律,人們將熟悉所有未付的門票,並在需要時召回。

+0

請告訴我更多關於「地圖功能」和「使用地圖」的信息。這是一種模式嗎?這與我所做的有什麼不同?非常感謝。 – Beebok

+0

編輯添加到問題 – Beebok

+0

通過映射,我的意思是將字符串映射到另一個字符串的數據結構。在Java中,這通常表示爲數據類型Map ;其他語言也有類似的結構。這意味着你不需要switch語句或if-cascade來執行映射。 –