自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分析ASP.NET Routing最令人疑惑的設(shè)計(jì)

開(kāi)發(fā) 后端
您覺(jué)得ASP.NET Routing中最令人摸不著頭腦的設(shè)計(jì)是什么?筆者認(rèn)為是RouteBase類(lèi),想知道為什么?請(qǐng)閱讀下文。
  1. public abstract class RouteBase  
  2. {  
  3.     protected RouteBase() { }  
  4.     public abstract RouteData GetRouteData(HttpContextBase httpContext);  
  5.     public abstract VirtualPathData GetVirtualPath(  
  6.         RequestContext requestContext,  
  7.         RouteValueDictionary values);  

它為什么是一個(gè)沒(méi)有任何實(shí)現(xiàn)的抽象類(lèi),而不是一個(gè)接口(如下)?

  1. public interface IRoute  
  2. {  
  3.     RouteData GetRouteData(HttpContextBase httpContext);  
  4.     VirtualPathData GetVirtualPath(  
  5.         RequestContext requestContext,  
  6.         RouteValueDictionary values);  

這樣做難道不更漂亮一些嗎?這樣代碼中都可以使用IRoute類(lèi)型,避免RouteBase這種令人反感的命名出現(xiàn)(個(gè)人感覺(jué),不知道有沒(méi)有同意的群眾)。退一步說(shuō),命名上的“美感”是小事……但是抽象類(lèi)在.NET平臺(tái)中就產(chǎn)生了一個(gè)非常嚴(yán)重的限制:一個(gè)類(lèi)無(wú)法繼承多個(gè)基類(lèi)。因此,在.NET平臺(tái)上總是更傾向于使用接口,而不是抽象類(lèi)。

但是接口里不可以有任何實(shí)現(xiàn),那么可復(fù)用的功能又放在哪里比較合適呢?《Framework Design Guildlines》告訴我們:在一個(gè)類(lèi)庫(kù)中,***為接口定義一個(gè)默認(rèn)實(shí)現(xiàn),這樣也是開(kāi)發(fā)人員進(jìn)行“擴(kuò)展”的一個(gè)“參考”。也就是說(shuō),如果真有什么需要復(fù)用的實(shí)現(xiàn),我們完全可以這么做:

  1. public abstract class RouteBase : IRoute  
  2. {   
  3.     // reusable implementations  
  4. }  
  5.  
  6. public class Route : RouteBase  
  7. {  
  8.     // concrete implementations  

事實(shí)上,.NET平臺(tái)上有許多類(lèi)庫(kù)也遵循了這個(gè)做法。一個(gè)典型的做法便是ASP.NET AJAX框架的Extender模型:

  1. public interface IExtenderControl { }  
  2. public abstract class ExtenderControl : Control, IExtenderControl { } 

甚至在ASP.NET AJAX Control Tookit項(xiàng)目中,還有更進(jìn)一步的擴(kuò)展:

  1. public abstract class ExtenderControlBase : ExtenderControl { }  
  2. public class AnimationExtenderControlBase : ExtenderControlBase { }  
  3. public class AutoCompleteExtender : AnimationExtenderControlBase { } 

看來(lái)微軟在項(xiàng)目團(tuán)隊(duì)內(nèi)部推廣《Framework Design Guidelines》還不夠徹底。

在.NET平臺(tái)下,一個(gè)沒(méi)有任何實(shí)現(xiàn)的,純粹的抽象類(lèi)可謂有百害而無(wú)一利。我很懷疑寫(xiě)這段代碼的人剛從C++切換到C#——但是ASP.NET Routing中其實(shí)也有接口(如IRouteConstraint),為什么作者自己沒(méi)有意識(shí)到,也沒(méi)有人提出不同意見(jiàn)呢?微軟開(kāi)發(fā)團(tuán)隊(duì)?wèi)?yīng)該有著嚴(yán)格的Code Review過(guò)程,怎么會(huì)讓這樣的代碼正式發(fā)布?要知道一個(gè)接口一旦公開(kāi),就不可以刪除了。也就是說(shuō),微軟很難彌補(bǔ)這個(gè)錯(cuò)誤。

如果是方法名不好,或者職責(zé)有些不明確,這樣還可以在舊方法上添加ObsoleteAttribute(這樣編譯器便會(huì)提示用戶(hù)這個(gè)方法已經(jīng)過(guò)期),并且將舊方法的調(diào)用委托給新的實(shí)現(xiàn)。例如:

  1. public abstract class CodeDomProvider : Component  
  2. {  
  3.     [Obsolete(  
  4.         "Callers should not use the ICodeCompiler interface and should  
  5.          instead use the methods directly on the CodeDomProvider class.  
  6.          Those inheriting from CodeDomProvider must still implement this 
  7.          interface, and should exclude this warning or also obsolete this 
  8.          method.")]  
  9.     public abstract ICodeCompiler CreateCompiler();  
  10.  
  11.     [Obsolete(  
  12.         "Callers should not use the ICodeParser interface and should  
  13.          instead use the methods directly on the CodeDomProvider class.  
  14.          Those inheriting from CodeDomProvider must still implement this 
  15.          interface, and should exclude this warning or also obsolete this 
  16.          method.")]  
  17.     public virtual ICodeParser CreateParser();  
  18.  
  19.     ...  

可是,現(xiàn)在的問(wèn)題是一個(gè)“類(lèi)”,而這個(gè)類(lèi)已經(jīng)無(wú)處不在了,例如在RouteData中有一個(gè)屬性Route,它便是RouteBase類(lèi)型——如果將其修改為IRoute接口,那么至少也需要項(xiàng)目重新編譯之后才能夠“升級(jí)”。而作為一個(gè)公開(kāi)類(lèi)庫(kù),尤其是.NET這種成熟框架來(lái)說(shuō),應(yīng)該做到“無(wú)痛”才對(duì)。

本文來(lái)自趙劼博客園文章《ASP.NET Routing中最令人摸不著頭腦的設(shè)計(jì)

【編輯推薦】

  1. ASP.NET控件學(xué)習(xí)總結(jié)
  2. 有關(guān)ASP.NET MVC框架的一些基礎(chǔ)知識(shí)
  3. 再談ASP.NET緩存機(jī)制:開(kāi)發(fā)效率與優(yōu)化的平衡
  4. 如何避免ASP.NET緩存占用系統(tǒng)資源
  5. 點(diǎn)評(píng)一下ASP.NET的WEB控件
責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2009-08-19 09:23:40

ASP.NET Rou

2009-07-21 15:11:14

ASP.NET Rou

2009-10-15 14:50:34

ASP.NET Rou

2009-10-26 15:55:43

URL Routing

2009-03-12 10:42:38

RoutingIgnoreRouteASP.NET

2009-08-21 10:51:55

ASP.NET Rou解析URL

2014-08-26 09:22:40

ASP.NET MVCRouting

2009-07-27 11:09:09

ASP.NET招聘系統(tǒng)

2009-07-29 17:29:46

ASP與ASP.NET

2009-03-09 13:46:31

RoutingWebASP.NET

2009-08-10 13:32:15

ASP.NET TimASP.NET組件設(shè)計(jì)

2009-08-05 16:53:14

ASP.NET組件設(shè)計(jì)

2009-08-10 10:19:47

ASP.NET組件設(shè)計(jì)

2009-08-10 14:08:15

ASP.NET服務(wù)器控ASP.NET組件設(shè)計(jì)

2009-04-23 10:33:52

ASP.NET設(shè)計(jì)思想微軟

2015-06-18 14:13:36

ASP.NET

2009-07-22 17:45:35

ASP.NET教程

2009-08-03 14:22:33

什么是ASP.NET

2009-07-28 17:17:19

ASP.NET概述

2009-08-07 17:49:44

控件設(shè)計(jì)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)