2009-06-18 72 views
1

在子系統設計,我有時看到有隻具有一個功能一個高層級的軟件設計:它的路線使用類到另一個某一類客戶端從一個客戶的電話想用。但是,它本身沒有任何功能。請採取以下方案:軟件設計問題:Router類

假設保齡球館子系統中有五個班級:一條衚衕,一條車道,一個投球手,控制檯和一個比分。每當子系統外部的客戶想要的任何數據顯示給用戶,它只會傳達給將調用任何它擁有獲取客戶端的請求的數據(例如得分類的控制檯(路由器):客戶端調用使用getScore()調用控制檯,調用Lane的getScore(),調用Bowler的getScore())。

我理解,這是一個不好的設計決定,但我想聽聽其後果你發現有這個路由器類(也可稱爲「中間人」)的真實世界的例子。隨着您所從事的系統的發展,您遇到了哪些問題?你會怎麼說服軟件設計師避免路由器類?

回答

0

我認爲,在一些設計中一個路由器是優選的設計模式,如在MVC框架委託處理程序的URL。在這種情況下,它確實很有幫助,因爲它提供了客戶端「看到」的內容與背後的實際邏輯之間的非常清晰的分離。

+0

查看上面關於「高內聚」違規的評論。例如,如果我是LaneView的LaneView,那麼爲什麼我要與控制檯交談以獲取LaneView數據?這沒有意義,因爲我正在顯示Lane數據。 (也許這將澄清我在軟件設計中所討論的陷阱)。 – jds2501 2009-06-19 01:48:13

0

我不知道,路由方法調用是總是個壞主意。

+0

路由器違反設計原則:高內聚,因爲你不直接說你的「朋友」,你是通過什麼(或者甚至不止一個東西)說話。 (考慮到這種情況,你只能通過只有路由的高層接口才能使用某些數據集)。 – jds2501 2009-06-19 01:44:56

+0

@ jds2501您似乎已經拒絕了每個建議的答案。那麼對於一個Router類,它是什麼模式? – laukok 2015-03-09 18:41:43

1

隨時子系統外部的客戶想要的任何數據顯示給用戶,它只會傳達給控制檯(路由器),將調用任何它擁有獲取客戶端的請求的數據類的

這聽起來像Facade pattern

至於中間人,在下面的例子中,難道不巷是罪魁禍首?

例如得分:客戶端調用操作檯與getScore(),它調用一個裏的getScore(),它調用一個投手getScore())

簡化了接口爲一個子系統子系統之外的客戶的好處可以被認爲是良好的設計。

+0

不一定。看不好的代碼味道:中間人。另請參見設計模式課堂筆記摘錄: 「第一次濫用來自於模式的簡單應用,因爲它僅僅是應用程序和子系統之間的」中介「,Facade中的大部分行爲僅僅是通過這些操作在子系統中調用單個操作,這不是比子系統提供的更高級別的界面,而且也沒有使它更容易使用,如果沒有更高級的界面,Facade的一個方面意圖不見了。「 – jds2501 2009-06-19 01:27:11

0

看起來你只會遇到與任何額外抽象層相關的問題 - 抽象可能會中斷,或者如果對底層的某些東西進行了更改,那麼這又是一件可能會行爲不當的事情。

我從來沒有見過任何所謂深比幾層更多,但我只是想象,增加額外的通話將使其更難以追查信息所採取的路徑,並進行故障排除變得更加困難。

但是,一個潛在的問題是,如果每個層都實現了自己的錯誤處理或重試過程,使得每個層次上的東西都無足輕重,那麼整個過程都是如此。例如,如果Lane試圖檢查投球手的分數,並且桌面進行3次嘗試檢查分數,那麼投球手失敗返回分數將導致6個查詢被做出。在投球手上加上30秒的超時時間,你會突然等待3分鐘,這需要30秒。

OldNewThing有大約在Windows操作系統的的這個例子中的文章,它造成的問題,但現在我似乎無法找到它。

0

我認爲無論是ASP.NET MVC和MVP模式利用這種類型的概念,你最終的東西簡單地處理那些從一端執行其他或代表下層到上層邏輯。這當然使得測試更容易執行,因此本身是一項主要優點。這種類型的模式的確會產生一些手動或者惡意的工作,因爲你可以點擊一個按鈕並讓它執行一項任務而不是點擊按鈕,讓某些東西攔截點擊,然後調用某個服務管理類來完成一些工作。但在保持代碼清晰可讀的前提下,更多的分離往往會更好。

如果您不是一個測試儀或並不十分關心的圖案,然後直接把它以另一種格式。您有一個將用戶帶到頁面的鏈接。由於目的地非常重要或使用很多,因此該鏈接遍佈整個場所。目的地改變。這可能是一個查找和替換操作......或者你可以插入一個RedirectService(按你的意思),當有人點擊一個鏈接需要改變,並指示點擊者到正確的位置。這允許位置在一個位置被定義一次,因此改變一次。經常查找和替換時間改變並不意味着改變的東西!

無論你如何看待這個......關注點的分離是一個很好的想法。 UI是一個問題。活動的控制者是另一個問題。活動本身也是另一個問題!

0

Facade模式,以及Mediator模式執行類似的任務,你所描述的。 Middleman名字的使用意味着Mediator對Facade模式的模式,因爲中間人負責在兩個實體之間進行協商,而兩個實體都不需要知道如何與另一個進行通信的具體細節。

您可以使用這些圖案,以減少耦合的客戶端類,其需要使用該系統中保或門面被掩蔽。在Facade模式的情況下,其目的是提供一種方便的方式來連接一個類的系統。對於Mediator模式,目的是從客戶端抽象出執行復雜任務所需的步驟。