用Helper对类的行为进行修饰以便复用(附:外三篇)
本文是?代碼“中間地帶”的封裝與復用?的后續。
?
咱不談設計模式這種“高檔”貨,也不談M××,只談怎么消除Copy+Paste,消除拖窗體設置屬性這類耗時、易錯的動作。
前些天和我徒弟聊天,他沾沾自喜的說他一天要寫500行css,俺打擊他說,啥時候他一天寫到100行時才算悟了。
?
寫代碼就是一個由多到少的過程:
(1)見山是山時,一天能寫1000行,大量的Copy+Paste,這叫代碼迷宮
(2)見山不是山時,一天能寫500行,Copy+Paste變成了大量的設計模式,這叫類的迷宮,Java程序尤其擅長這個,搞得我現在不敢看Java程序了。開個玩笑,重構到模式,實際上是從一種垃圾(代碼迷宮)重構到另一種垃圾(類的迷宮)
(3)見山還是山時,一天能寫100行,回歸本源
?
先描述一個很常見的 Copy+Paste 場景:為客戶端程序添加NotifyIcon,當關閉窗體時,窗體消失,縮小到托盤,雙擊托盤圖標,則窗體又重現。
對于這一需求,msdn 的樣例如下:
Code?
于是,我們開發Client程序時,當需要這一功能,就把這樣的代碼復制過來,改吧改吧就完成了。
復制粘貼很惡心,一次兩次還好,次數多了自己就煩了。并且這樣一來,導致代碼量膨脹——功能一多,一個Form的代碼量就近千行,很不方便測試和維護。因此,有必要進行抽象和復用。
這種抽象,屬于對類的局部行為進行修飾(設計模式放在括號里談,不想看的可以忽略——它不同于Mediator,也不同于Wrapper,一時也想不出好的名字),就叫Helper了。單純的Helper又體現不出具體的意圖,俺就命名為FormConfig。下面是 FormConfig 的代碼:
Code?
使用起來很簡單:
Code?
其實這個還可以簡化,因為畢竟還要聲明一個FormConfig,再new一個,再Attach一下子,3行代碼。進一步偷懶的話可以設計一個擴展方法,然后把FormConfig實例放在一個公共對象中進行管理,當Form退出時,再在公共對象中置空FormConfig。就不寫代碼了,簡化到目前這個地步,俺已經滿足了。
?
== 附外3篇 ==
?
下面這兩篇和上面的這篇都是昨天晚上寫的。第一篇是對這一段時間代碼整理的總結,有點私人化。第二篇是講通用驗證碼識別的一個思路,不是完整的文章,同時……又涉及點技術秘密,沒辦法完全透露。再附一篇完全搞笑的。
?
附1:代碼整理的總結
?
搞了四個月的工作室,失敗了,散了,好在成本嚴格控制住了,也沒虧多少,最大的收獲就是得到了證實——此路不通。
還是堅持當IT宅男,堅持向產品和高端轉型,增強競爭優勢。我希望投資回報是一條上升的線,而不是一條下降的線。
?
于是最近做的事情主要是整理代碼和復習和學習數學。今后將玩數學了,主要做數學密集的應用。(看現在經濟形勢,10年內會新出現7000萬白領,會減少7000萬藍領,藍領的平均工資將于白領持平。國內又提供不了這么多白領崗位,IT界的競爭將無比的殘酷。作為沒有組織做后盾的IT宅男,俺必須早點布局。好在現在大部分大學生大學都是白混的,是數學白癡,和以前的俺一樣)。
?
一、應用結構
?
1、??采用C-S結構,關鍵部分的計算放在S端,方便升級、收費。今后將引入P2P。
2、??自己用的話,用WPF開發界面,客戶用的,用Winform開發。核心代碼盡量與UI無關。
3、??將不再承接Web開發為主的項目,不承接數據庫開發為主的項目
?
二、項目結構
?
1、微觀結構
?
bin
lib
release
src
?
2、宏觀結構
?
?
(1)Orc基礎庫主要封裝一些常用的類、擴展方法、Mediator,以及一些基礎設施,順帶儲存自己用的snippets
?
?
嘿嘿,俺自定義的snippet只有一個:
?
Code?
(2)OrcSmart庫計劃包括
(a)Orc.SmartImage,對常用的圖像處理、分析、識別算法進行封裝,基于AForge.Net和OpenCV進行開發,并新添一些這兩個庫尚未實現的算法。目前基本成型。
(b)Orc.SmartText,對常用的文本分析,NLP算法進行封裝,這個庫現在還是一個空架子,還未行動。
Orc.SmartCore被我歸入Orc基礎庫里面,這個主要實現常用統計計算和機器學習算法。
?
(3)Orc協議庫對常用協議進行實現與封裝,目前實現了QQ2005-2007的協議,YMsg協議,封裝了MSNP協議。今后將主要針對基于http的Web應用進行封裝。
?
(4)OrcEntity庫,封裝常用實體類。
?
(5)Forsaken庫主要針對3D應用,基于XNA,目前還是空架子,還未行動(一沒時間,二外部環境還不成熟)。嘿嘿,主要目標是3D仿真。
?
三、第三方庫選擇:
(1)???????使用nunit?進行單元測試(nunit比vs自帶的單元測試好用很多)
(2)???????使用log4net?記錄日志
(3)???????使用protobuf?進行序列化
(4)???????圖像處理庫:AForge.Net,OpenCV(Emgu CV)
(5)???????數學庫:MathNet.Iridium
?
附2:通用驗證碼識別的一個思路
?
要實現通用的驗證碼程序,我認為應該具備以下2點:
(1)???????不需要切割
(2)???????不需要分離背景和前景
?
下面是我的思路:
(1)???????邊緣檢測獲得邊緣
(2)???????計算樣本的ShapeContext,因為要考慮到干擾線,ShapeContext沒法歸一化
(3)???????計算測試圖片的ShapeContext(也可以是其它的描述子,但我感覺對于驗證碼來說,ShapeContext更好用一些,抗干擾能力更強一些。也可以計算不同Scale下的ShapeContext,來解決樣本和測試圖片中字符大小不一致的問題)
(4)???????將測試圖片的ShapeContext存入多維索引中,便于查詢
(5)???????對于樣本,設定一個匹配的閾值,為每個點尋找測試圖片中的匹配點(每個尋找2-3個匹配點),這樣,所有的匹配點會在2D空間內呈現一種分布,這種分布會有0個或數個聚集區,每一個聚集區就是一個候選區,通過聚類算法尋找聚集區
(6)???????假定圖片中有一個字符W,這個字符既可以匹配W,又可以匹配V,甚至能匹配I,L這兩個字符,因此應該設計一個篩選算法
?
附3:江湖
?
本文轉自xiaotie博客園博客,原文鏈接http://www.cnblogs.com/xiaotie/archive/2009/11/12/1601456.html如需轉載請自行聯系原作者
?
xiaotie?集異璧實驗室(GEBLAB)
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的用Helper对类的行为进行修饰以便复用(附:外三篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钱伯斯的遗产:思科与集成虚拟网络堆栈
- 下一篇: django中的认证登陆与用户的创建