C#編碼簡單性之函數篇(如何編寫簡短的C#代碼,隨時更新)

作者:陳勇

出處:blog.csdn.net/cheny_com

?

這是編碼簡單性系列中的其中一篇,之前幾篇包括代碼篇和語義篇。

因為要積累案例,會隨時更新。

?

之前提到:編碼簡單性的“心法”就是:只要屏幕上有任何兩部分代碼看上去相似,則一定有合并辦法。
但在代碼層面,無論如何簡化,都常常剩下一堆相似代碼,這時候就需要編寫函數了。

這里指的函數,包括HtmlHelper這類用C#解決Html的函數。

?

應隨時關注代碼中的“不簡潔”現象,一旦放任其發生,軟件將很難維護。


案例1 從Html代碼抽取MVC HtmlHelper

為了在屏幕上顯示一些大按鈕(下方顯示其文字),編寫了這些代碼。為了對齊/消除邊框/Hover效果等,動用了幾個class來設置格式。按鈕很多,所以需要相當數量的拷貝粘貼,其中文字-alt-title還是重復的,每次都要改動三個地方……

這些,都是代碼正在變復雜的壞味道。

?

以其中兩次重復為例,說明修改方法:

??????????? <td class = "noborder nopaddingv">
??????????????? <div class = "aligncenter">
??????????????????? <a href="/Home/Index">
??????????????????????? <img src="../../Resouces/Images/Agile/Menu/Campass48.png" alt = "站點地圖" title = "站點地圖" class = "imagelink"/></a><br />
??????????????????????? 站點地圖
??????????????? </div>
??????????? </td>
??????????? <td class = "noborder nopaddingv">
??????????????? <div class = "aligncenter">
??????????????????? <a href="/Home/Index" target = "_blank">
??????????????????????? <img src="../../Resouces/Images/Agile/Help/Help48.png" alt = "幫助" title = "幫助" class = "imagelink"/></a><br />
??????????????????????? 幫助
??????????????? </div>
??????????? </td>

手段就是做HtmlHelper(以前沒做過復雜的,所以推到現在才做),結果是:

?

??????? @Html.MenuImageButtonV("站點地圖", false, "/Home/Index", "../../Resouces/Images/Agile/Menu/Campass48.png")
??????? @Html.MenuImageButtonV("幫助", true, "/Home/Index", "../../Resouces/Images/Agile/Help/Help48.png")

Helper的內容就不展示了,網上一查都會。唯一說明的就是class變成了style,因為在函數內部引用class是危險的,不能保證被復用后class也在。

突然想起來當年曾經寫過一句話很好地概括了這種技法:當兩段代碼相同時,可以變成一個函數和兩次調用,相同的部分就是函數,不同的部分就是調用參數。

可以看到本例中,只有文字(title/alt)、是否新窗口打開、鏈接、圖片不同,所以就是一個有四個參數的函數。

?


案例2 2011-05-04 函數接口的簡潔性?

不是編寫了函數就萬事大吉了,不好的函數接口依然不簡潔。下面是一個剛改好的例子:

@Html.ImageLink("燃燒圖", true, "../../Resouces/Images/Agile/CurrentSprint/BurndownData16.png", "icons", false, "/Agile/CurrentSprint/BurndownData", null, null)

@Html.ImageLink("迭代計劃", true, "../../Resouces/Images/Agile/Sprints/Index16.png", "icons", false, "/Agile/Sprints/Index", null, null)

...

像這樣的函數重復上幾回也很讓人頭痛的,關鍵臭長的函數還看不到尾部,很容易出錯或影響閱讀。

這時候的技法是:如果函數在重復調用時有些參數變化,有些參數基本不變("icons", true, false, null....),后者應該變成一些可選參數并設置缺省值。

修改后的結果(另外一段代碼):

@Html.ImageLink("迭代計劃", "/Agile/Sprints/Index", true) //這個true有些地方不太一樣所以留下了。
@Html.ImageLink("迭代故事", "/Agile/Sprints/SprintStories", true)

...
唯一的不太好理解的是圖片的鏈接哪去了。我在后臺目錄做了一套命名規則,若imgPath為缺省值null,則會根據命名規則生成默認圖片名稱,保證圖片可以用Area/Controller/Actoin定位。這樣也簡化了實現和維護,不用去在腦海里便維護一套圖片與鏈接的對應關系,也是編碼簡單性的一種體現。


案例3 2011-05-04 MS Chart Winform版本與MVC3 Razor Helper的比較

在Winform版本中,一個Chart除了要在aspx中放置控件外,還要這樣設置參數:

Chart1.Series["Series1"].ChartType = (SeriesChartType) Enum.Parse( typeof(SeriesChartType);

Chart1.Series["Series2"].ChartType = (SeriesChartType) Enum.Parse( typeof(SeriesChartType); ChartTypeList.SelectedItem.Text, true );

Chart1.Series["Series1"].IsValueShownAsLabel = true;
Chart1.Series["Series2"].IsValueShownAsLabel = true;
Chart1.Series["Series1"]["LabelStyle"] = PointLabelsList.SelectedItem.Text;
Chart1.Series["Series2"]["LabelStyle"] = PointLabelsList.SelectedItem.Text;
...

這是非常難讀的代碼,至少相當的不直觀,MVC3的程序員顯然要厲害得多(應該是MS意識最好的程序員了,要不做好不MVC),他們的代碼長得這個樣子:

new Chart(400, 200, ChartTheme.Blue)
.AddTitle(title)
.DataBindTable(data, "X")
.Write("png");
看來是由于工作量問題,beta版本實際上只實現了很有限的幾個函數,但實現得卻很漂亮。按照這種風格寫上面那個Chart1,應該是(僅展示風格):

new Chart()

??? .AddSeries( new Series("Series1",

??????? ChartType: (SeriesChartType) Enum.Parse( typeof(SeriesChartType)),

??????? IsValueShownAsLabel: true)

??????? .AddLable( new Label(

??????????? LableStyle:PointLabelsList.SelectedItem.Text)

??? ....

這種風格很類似JQuery中的風格,是一種“寫得少,做得多”的風格,其心法就是:代碼里邊沒有任何兩個地方看上去相似。


案例4 2011-05-05 函數接口不簡潔的深層原因

01年左右曾經有一家國內排名前3的家電廠商做了一款機頂盒在我們公司聯合測試。此機頂盒穩定性很差,其程序員長駐現場有問題就改,而問題也從不停息,比同期測試的其他幾家機頂盒差很多。一年后有一個偶然的機會被請去評價一段機頂盒代碼是否可用,從函數名稱等蛛絲馬跡判斷就是這個廠家的代碼,答案是:不可用。

那些代碼外觀的第一感覺是像一篇小說,每行都很長,能自成段落的都有,有點像案例3中開始不好的代碼且更甚之,最后對代碼進行了局部改造,量化評價的結果是實際所需代碼大概是已有代碼的1/6。

怎么才能變成案例3里邊后面那種長得像詩詞而不是小說的代碼呢?

當時我們分析那段機頂盒代碼,問題出在類的封裝上,總結一下包括:

1. 類的內聚性不好,多數函數屬于哪個類都不好,因為哪個類的變量都不足以支撐計算,只得在單獨聲明一個函數(當時是用C++,C#不允許了),傳入大量類。

2. 類的封裝不好,多數類都使用public的內部數據,很容易出現Chart1.Series["Series2"]["LabelStyle"] = ...這種從chart挖到Series,從Series挖到LableStyle才能干活的情況,所以函數調用臭長。

再深入挖掘一下形成這種結果的原因,在于多數程序員(本人也一樣)都喜歡先從類的變量而非類的函數開始設計,最終導致類更適合存放數據而不適合做事。一種解決辦法就是所謂調用驅動開發,就是先把要調用的代碼寫出來,打樁,再實現

?

點擊下載免費的敏捷開發教材:《火星人敏捷開發手冊》

?

轉載于:https://www.cnblogs.com/spring3/archive/2011/04/29/2401485.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378465.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378465.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378465.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

R學習筆記(1):R是什么

本文最新版已更新至http://thinkinside.tk/2013/05/03/r_notes_1_what.html 在學習量化投資的時候&#xff0c;我發現了R&#xff08;www.r-project.org&#xff09;。R到底是什么呢&#xff1f;在開始之前&#xff0c;先看看R的神奇之處。 1. R初窺 從CRAN&#xff08;The Co…

oracle網卡,Oracle_bond網卡配置

***************************loyu*******************************************************雙網卡創建bond虛擬網卡實驗*************************cat > /etc/sysconfig/network-scripts/ifcfg-bond0 << EofDEVICEbond0BOOTPROTOstaticONBOOTyesIPADDR172.16.116.60N…

Python | 展示一個break語句示例

break is a keyword in python just like another programming language and it is used to break the execution of loop statement. 就像另一種編程語言一樣&#xff0c; break是python中的關鍵字&#xff0c;用于中斷loop語句的執行。 In the given example, loop is runni…

數字圖像處理知識總結

一&#xff1a;基本概念 數字圖像&#xff1a;指由被稱作像素的小塊區域組成的二維矩陣。將物理圖像行列劃分后&#xff0c;每個小塊區域稱為像素&#xff08;pixel&#xff09;。每個像素包括兩個屬性&#xff1a;位置和灰度。圖像數字化一般分為采樣、量化與編碼三個步驟。數…

三、“滌綸纖維和棉纖維兩組分纖維在滌/棉混紡織物燃燒過程中有著明顯的物理相互作用和化學相互作用”,解釋這兩種作用。

“滌綸纖維和棉纖維兩組分纖維在滌/棉混紡織物燃燒過程中有著明顯的物理相互作用和化學相互作用”,解釋這兩種作用。 收集資料階段 棉纖維燃燒后炭化,而滌綸燃燒時熔融滴落,由于棉纖維成為支持體,可使熔融纖維聚集,并阻止其滴落,使熔融纖維燃燒更加劇烈,即所謂"支架效應…

關于性能測試的通俗解釋

關于性能測試的通俗解釋: http://www.docin.com/p-645879730.html 轉載于:https://www.cnblogs.com/preftest/archive/2013/05/03/3057231.html

oracle marley,滾石雜志500大專輯,對歐美音樂感興趣的可以找來聽聽。

滾石雜志于2003年11月評選出的滾石雜志五百大專輯。值得一提的是&#xff0c;披頭士樂隊占據了前五中的三席&#xff0c;前五十中的7席&#xff0c;正式出版的專輯幾乎全部入選前五百。排名 演唱者 專輯001 披頭士樂隊(The Beatles) Sgt. Peppers Lonely Hearts Club Band002 海…

ci中使用smarty

<p>d</p> <?php defined(BASEPATH) or die(Access restricted!);/** 作者&#xff1a;晉勇*/require(APPPATH.libraries/smarty/Smarty.class.php);classCismarty extendsSmarty{public$exttpl;public$dir;public$layoutlayout/main;/** * 構造函數 * * access…

kinect中psi是什么_PSI的完整形式是什么?

kinect中psi是什么PSI&#xff1a;每平方英寸磅/國際人口服務 (PSI: Pound per Square Inch / Population Services International) 1)PSI&#xff1a;每平方英寸磅 (1) PSI: Pound per Square Inch) PSI is an abbreviation of Pound per Square Inch. Pound per Square Inch …

jupyter notebook指定工作目錄

【1】打開Anaconda Navigator 打開Anaconda Navigator&#xff0c;點擊左側Environments&#xff0c;點擊base(root)->open Terminal 【2】輸入指令jupyter notebook --generate-config 按下回車鍵&#xff0c;彈出config所在位置。 以VS Code打開文件 【3】修改第26…

四、纖維素纖維使用P-N系阻燃劑協同作用的原理?

纖維素纖維使用P-N系阻燃劑協同作用的原理? 收集資料階段 某些含氮、磷化合物可以增強化合物的阻燃性,原因就是磷、氮在反應過程中形成含 N-P 鍵的中間體,可以改善羰基反應活性和磷酰化速率,進而提高成炭率;另一個重要的原因是氮化合物可以延緩凝聚相中含磷化合物的會揮發…

oracle tns 連接關閉,ORA-12537 TNS:連接關閉

今天遇到&#xff1a;ORA-12537 TNS&#xff1a;連接關閉&#xff0c;監聽正常&#xff0c;集群正常&#xff0c;數據庫正常&#xff0c;查了一下才發現問題。LISTENER日志報錯TNS-12546: TNS:permission deniedTNS-12560: TNS:protocol adapter errorTNS-00516: Permission de…

多模態大模型:關于RLHF那些事兒

Overview 多模態大模型關于RLHF的代表性文章一、LLaVA-RLHF二、RLHF-V三、SILKIE多模態大模型關于RLHF的代表性文章 一、LLaVA-RLHF 題目: ALIGNING LARGE MULTIMODAL MODELS WITH FACTUALLY AUGMENTED RLHF 機構:UC伯克利 論文: https://arxiv.org/pdf/2309.14525.pdf 代碼…

c# 整數類型轉byte_C#中數據類型的整數類型

c# 整數類型轉byteHere is the list of the built-in integral types of data types in C#, sbyte, byte, char, short, ushort, int, uint, long and ulong 這是C&#xff03;&#xff0c; sbyte &#xff0c; byte &#xff0c; char &#xff0c; short &#xff0c; ushort…

COM+組件注冊方法

COM組件注冊方法 有兩種方式注冊組件&#xff1a;一種是調用regsvr32.exe&#xff1a;例如我們運行regsvr32.exe c:\test.dll來注冊位于C:盤根目錄下的test.dll。另外一種是在MTS&#xff08;微軟事務服務器&#xff09;中注冊。MTS是值得推薦的&#xff0c;因為它具有下列優點…

【智能車Code review】—曲率計算、最小二乘法擬合

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 系列文章 【智能車Code review】—曲率計算、最小二乘法擬合 【智能車Code review】——坡道圖像與控制處理 【智能車Code re…

五、“嵌段共聚醚酯型”易去污整理劑的結構特點及對織物服用性的影響?

“嵌段共聚醚酯型”易去污整理劑的結構特點及對織物服用性的影響? 收集資料階段 嵌段共聚醚酯型易去污整理劑(簡稱聚醚酯)是滌綸最早的一種耐久性易去污劑,其商品名稱為Permalose T,由英國ICI公司生產,它能使滌綸及其混紡織物具有優良的易去污、抗濕再沾污和抗靜電性能。…

linux服務器指示燈,【轉】明明白白你的Linux服務器——故障篇 | 旺旺知識庫

在Linux/unix服務器的維護過程中&#xff0c;遇到各種各樣的問題&#xff1b;有的嚴重&#xff0c;有的很好解決&#xff0c;有的解決過程我就記錄下來與大家分享下&#xff0c;希望能給大家帶來幫助。故障一、今天早上來的第一件事&#xff0c;就是檢查昨天晚上剛剛重新安裝的…

構件圖(Component Diagram)—UML圖(八)

構件圖是顯示代碼自身結構的實現級別的圖表。構件圖由諸如源代碼文件、二進制代碼文件、可執行文件或動態鏈接庫 (DLL) 這樣的構件構成&#xff0c;并通過依賴關系相連接 下面這張圖介紹了構件圖的基本內容&#xff1a; 下面這張圖是個構件圖的實例&#xff1a; 轉載于:https:/…

GAE work

https://appengine.google.com/ can visit in Home, but cannot visit in Office.Download a java SDK for GAE, will write something here.轉載于:https://www.cnblogs.com/cnyao/archive/2011/05/05/2038161.html