從系列文章開篇到現在,已經實現的很多擴展了,但過多的擴展會給我們帶來很多麻煩,試看下圖:
面對這麼多“泛濫”的擴展,很多人都會感到很別扭,的確有種“喧賓奪主”的感覺,想從中找出真正想用的方法來太難了!盡管經過擴展後的string類很“強大”,但易用性確很差。
很多人因此感覺擴展應適可而止,不該再繼續下去...其實這是一種逃避問題的態度,出現問題我們應該主動去解決,而不是去回避!
有很多種方法可以解決以上問題,最簡單的就是使用將擴展放入不同namespace中,使用時按需using相應namespace,可達到一定效果。但這種方法有很大缺點: 一個命名空間中的擴展若太多同樣會讓我們的智能提示充斥著擴展方法,擴展太少每次使用都要using多個命名空間,很麻煩。
先介紹一種簡單的方式,先看效果:
圖1中前三個以As開始的三個擴展就是采用分組技術後的三類擴展,分別是中文處理、轉換操作、正則操作,後面三個圖分別對就這三類擴展的具體應用。圖2中的有三個中文處理的擴展ToDBC、ToSBC、GetChineseSpell分別是轉為半角、轉為全角、獲取拼音首字母。
通過這樣分組後,string類的智能提示中擴展泛濫的現象得到了解決,使用AsXXX,是以字母A開始,會出現在提示的最前面,與原生方法區分開來。
采用這種方式有幾個缺點:
1.使用一個擴展要先As一次,再使用具體擴展,比之前多了一步操作:這是分組管理必然的,建議使用頻率非常高的還是直接擴展給string類,不要分組。只對使用頻率不高的進行分組。
2.擴展後的智能提示不友好,擴展的方法與Equals、ToString混在了一起,而且沒有擴展方法的標志。
先給出這種方法的實現參考代碼,再來改進:
1 public static class StringExtension
2 {
3 public static ChineseString AsChineseString(this string s) { return new ChineseString(s); }
4 public static ConvertableString AsConvertableString(this string s) { return new ConvertableString(s); }
5 public static RegexableString AsRegexableString(this string s) { return new RegexableString(s); }
6 }
7 public class ChineseString
8 {
9 private string s;
10 public ChineseString(string s) { this.s = s; }
11 //轉全角
12 public string ToSBC(string input) { throw new NotImplementedException(); }
13 //轉半角
14 public string ToDBC(string input) { throw new NotImplementedException(); }
15 //獲取漢字拼音首字母
16 public string GetChineseSpell(string input) { throw new NotImplementedException(); }
17 }
18 public class ConvertableString
19 {
20 private string s;
21 public ConvertableString(string s) { this.s = s; }
22 public bool IsInt(string s) { throw new NotImplementedException(); }
23 public bool IsDateTime(string s) { throw new NotImplementedException(); }
24 public int ToInt(string s) { throw new NotImplementedException(); }
25 public DateTime ToDateTime(string s) { throw new NotImplementedException(); }
26 }
27 public class RegexableString
28 {
29 private string s;
30 public RegexableString(string s) { this.s = s; }
31 public bool IsMatch(string s, string pattern) { throw new NotImplementedException(); }
32 public string Match(string s, string pattern) { throw new NotImplementedException(); }
33 public string Relplace(string s, string pattern, MatchEvaluator evaluator) { throw new NotImplementedException(); }
34 }