日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#不如Java的地方:靜態(tài)導入

首先,請原諒我用了一個很土,很有爭議的標題。小弟才思枯竭,實在想不出來什么文雅的了,抱歉~~

前言

換了東家后,從一個死忠C# Fans搖身一變,客串了一把Java程序員,可能是受老趙的《Why Java Sucks》系列博文影響太大,剛開始那幾天有很大的抵觸情緒,后來想想,何不乘此機會深入了解一下Java。

扮演Java程序員兩個月以來,受到的折磨比較多,由于以前習慣了微軟的飯來張口,衣來伸手的策略,咋角色一轉(zhuǎn)變還真有點不適應,什么都得自己動手。雖然Java社區(qū)開源項目無數(shù),框架一大把,但可能是選擇太多就更迷茫,還是有點不適應。

我想寫《Java超過C#的地方》這個系列文章,主要是抱著從一個C#程序員的角度,向Java學習的態(tài)度,決沒有任何吵架的意思。汲取精華,去其糟粕嘛,呵呵。當然,這個系列是不是寫的下去,要看看我是否真的碰到了我覺得Java比C#好的地方,碰到了一個我就會記錄一篇~~

靜態(tài)導入

優(yōu)點

前言就說到這兒,現(xiàn)在進入今兒這篇文章的正題:靜態(tài)導入(static import)。

先看下面這段示例代碼:

 
 
 
  1. public class SayHelloTest{  
  2.         @Test  
  3. public void should_say_hello_when_given_your_name(){  
  4.            gotoPage("hello");  
  5.           input("name","yuyijq");  
  6.          click("sayButton");  
  7. assertThat(helloPage.getLabel(),is("hello yuyijq"));  
  8.     }  

這是一段典型的功能測試代碼。對于功能測試來說,關鍵的就是要模擬用戶場景,而不涉及技術(shù)細節(jié),用領域的語言來表達出測試。上面的測試用很清晰的步驟表達出了測試的意圖,要注意的是這里的gotoPage,input,click以及assertThat方法都不是SayHelloTest類的實例方法,都是定義在別的類甚至是第三方框架中的靜態(tài)方法。通過Java的靜態(tài)導入特性,使得現(xiàn)在代碼的可讀性更高:

 
 
 
  1. import static com.cnblogs.yuyijq.functionalTest.gotoPage; 

弊端

通過靜態(tài)導入,我們可以去掉類名的前綴,這樣就可以將代碼寫得更自然,更像是在描述一件事兒。但靜態(tài)導入也并不是沒有缺點。在軟件開發(fā)中,很多特性適當?shù)氖褂枚己芎?,但是一旦使用過度就有可能變成壞事,這就是那個名言:不要拿著錘子,就把啥都當釘子。請看下面的代碼:

 
 
 
  1. map.get(MOST_VIEWED.toString());  
  2. map.get(LAST_VIEWED.toString());  
  3. map.get(IS_LAST_ARTICLE.toString());  
  4. map.get(IS_SHOW_PICTURE.toString());  
  5. //....下面有類似代碼若干行  

咋一看還以為這些MOST_VIEWED什么的全部是常量,但***發(fā)現(xiàn)這些都是枚舉PortalOptions里的項,都是通過靜態(tài)導入導進來的。但由于沒了PortalOptions這個具有說明信息的枚舉名作為前綴,丟失了很多信息,造成這段代碼不是很容易看懂,不知道m(xù)ap.get出來的到底是什么。代碼雖然短了很多,但是如果加上PortalOptions,那么就能很直觀的直到我們需要從這個map里獲得PortalOptions相關的東東。

在C#里畫瓢

好的東西是要學習的,那我們?nèi)绾卧贑#里照樣畫個瓢呢??上#目前還不支持這種靜態(tài)導入,我也沒想到什么好法子能畫這個瓢。在C#里不要類名或?qū)嵗@個前綴,那除非這個方法是本類的方法,但我們肯定不可能為了使用這樣的東東,就給每個類添加這些方法,不過C#里有一個擴展方法特性,我們看看是不是能用擴展方法來畫這個瓢:

 
 
 
  1. public static class UnitTestExtensions  
  2.   {  
  3. public static T mock(this object o,Type mockType)  
  4.     {  
  5.     return (T)NMock.Mock(mockType);  
  6.        }  
  7.  }  

由于我們是給object類擴展的方法,所以在所有的類中都可以像是自己的方法一樣使用,也就可以寫下下面這樣的代碼了:

 
 
 
  1. public class SayHelloControllerTest  
  2.    {  
  3.        [Test]  
  4. public void should_load_user_when_given_username()  
  5.         {  
  6.         User user = new UserBuilder()  
  7.                .withUserName("yuyijq")  
  8.                 .withAge(80)  
  9.                 .withSex(male)  
  10.                  .build();  
  11.         UserDAO userDAO = mock(typeof(UserDAO));  
  12. when(userDAO.findByUserName("yuyijq")).thenReturn(user);  
  13.     replay(userDAO);  
  14. SayHelloController controller = new SayHelloController(userDAO);  
  15.       verify(userDAO);  
  16. ModelAndView mv = controller.show("yuyijq");  
  17.       assertModelAttribute(mv,"user",user);  
  18.       }  
  19.    } 

不過給object添加擴展方法實在不是一個好主意,污染太大了。目前也沒有想出更好的辦法,所以就此作罷~~

后語

靜態(tài)導入就記敘到這里,兩個月以來我還是對Java的語法嗤之以鼻,不過對Java社區(qū)對開源的采納程度卻是由衷的感嘆。

附加說明

我在這里沒有任何意思表明Java好于C#,只是我在使用Java過程中發(fā)現(xiàn)的一些挺好的地方。這些地方能讓我寫出我自己覺得更好的代碼,而且在我心里C#遠超過Java的

地方多得多,這是毋庸置疑的。


本文名稱:C#不如Java的地方:靜態(tài)導入
轉(zhuǎn)載注明:http://www.dlmjj.cn/article/djeccdp.html