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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Scala的啟發(fā):代碼本質(zhì)與過度包裝的平衡

本文來自王在祥先生的博客(blogspot),原標(biāo)題為《重溫 scala》。對于代碼簡潔化與可讀性矛盾的解決,Scala語言無疑是一種啟發(fā)。以下為原文:

創(chuàng)新互聯(lián)是專業(yè)的路北網(wǎng)站建設(shè)公司,路北接單;提供成都網(wǎng)站設(shè)計、網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行路北網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

編輯推薦:Scala編程語言專題

#t#最近,在閱讀項目組的代碼時,再次陷入了苦思:基于Java、Hibernate的商業(yè)應(yīng)用開發(fā)確實(shí)陷入到了一個很痛苦的境界,這個問題實(shí)際上正在進(jìn)行開發(fā)的大部分開發(fā)人員都不會感覺到,因為大家都覺得這就是正常的程序員生活。再說,幾乎所有的框架都在力捧Hibernate這樣的ORM工具能夠極大的簡化程序的開發(fā),要不,你去使用使用 JDBC試試。

在Java中基于JDBC編程,確實(shí)有些匯編語言的感覺,摘抄一份實(shí)際項目的代碼:

 
 
 
  1. public void updateTerminalStatus(String timeout, String transtime) throws Exception {  
  2.         //更新超時終端的狀態(tài)值(9為超時)   
  3.         String updateTerminal = "update T_Terminal set Status=9 "   
  4.             + " where TerminalID in (select TerminalID from T_Terminal where TO_CHAR(latestDate, 'yyyymmddHH24miss')<=? and (status=0 or status=2) ) ";  
  5.           
  6.         //查詢超時的終端信息,且該終端號在故障表中沒有未處理的超時記錄,(包含該終端號在故障表中沒有超時記錄的情況)。  
  7.         String queryTimeOutTerm = "SELECT te.TerminalID FROM T_TERMINAL te WHERE te.status=9 ";  
  8.         String queryTerm = "SELECT terminalid FROM T_TROUBLELOG tr " +  
  9.                 " WHERE tr.DeviceID='COMMMODULE' AND tr.TroubleID='CommTimeOut' " +  
  10.                 " AND tr.SolveDate IS NULL GROUP BY  terminalid ";  
  11.           
  12.         //向故障表中添加一條新的故障記錄。  
  13.         String insertTrouble = "insert into T_TroubleLog (LogID, TerminalID, DeviceID, TroubleID, HappenDate) " 
  14.             + " values (?, ?, 'COMMMODULE', 'CommTimeOut', TO_DATE(?,'yyyymmddHH24miss')) ";  
  15.           
  16.         //更新故障表中的終端超時記錄,該終端號的狀態(tài)已經(jīng)不超時,則超時故障處理完畢。  
  17.         String updateTrouble = "UPDATE T_TROUBLELOG tl SET tl.SolveDate=TO_DATE(?,'yyyymmddHH24miss') " +  
  18.                 " WHERE terminalid IN" +  
  19.                 " (SELECT tm.terminalid FROM T_TERMINAL tm,T_TROUBLELOG tl " +  
  20.                 " WHERE tm.Status != 9 AND tm.TerminalID=tl.TerminalID )" +  
  21.                 " AND tl.DeviceID='COMMMODULE' AND tl.TroubleID='CommTimeOut' AND tl.SolveDate IS NULL ";  
  22.           
  23.         Connection conn = null;  
  24.         PreparedStatement pstmt = null;  
  25.         PreparedStatement pstmtInsert = null;  
  26.         ResultSet rs = null;  
  27.         List terlist = new ArrayList();  
  28.         List noterlist = new ArrayList();  
  29.         try {  
  30.               
  31.             conn = transDataSource.getConnection();  
  32.             conn.setAutoCommit(false);  
  33.  
  34.             pstmt = conn.prepareStatement(updateTerminal);  
  35.             pstmt.setString(1, timeout);  
  36.             pstmt.executeUpdate();  
  37.             pstmt.close();  
  38.               
  39.             pstmt = conn.prepareStatement(updateTrouble);  
  40.             pstmt.setString(1, transtime);  
  41.             pstmt.executeUpdate();  
  42.             pstmt.close();  
  43.             log.debug("更新完成");  
  44.  
  45.             //生成32位的隨機(jī)ID,使用Hibernate中的UUID算法。  
  46.             Properties props = new Properties();  
  47.             props.setProperty("separator", "");  
  48.             IdentifierGenerator gen = new UUIDHexGenerator();  
  49.             ( (Configurable) gen ).configure(Hibernate.STRING, props, null);  
  50.               
  51.             pstmtInsert = conn.prepareStatement(insertTrouble);  
  52.  
  53.             pstmt = conn.prepareStatement(queryTerm);  
  54.             rs = pstmt.executeQuery();  
  55.             while(rs.next()){  
  56.                 String termid = rs.getString(1);  
  57.                 terlist.add(termid);  
  58.             }  
  59.             log.debug("查詢終端號在故障表中沒有未處理的超時記錄完成");  
  60.             rs.close();  
  61.             rs = null;  
  62.             pstmt.close();  
  63.             pstmt = null;  
  64.               
  65.               
  66.             pstmt = conn.prepareStatement(queryTimeOutTerm);  
  67.             rs = pstmt.executeQuery();  
  68.             while (rs.next()) {  
  69.                 String term = rs.getString(1);  
  70.                 noterlist.add(term);  
  71.             }  
  72.             log.debug("查詢超時的終端信息完成" + noterlist.size());  
  73.               
  74.             for(int j = 0; j < noterlist.size(); j++){  
  75.                 String terminalid = noterlist.get(j).toString();  
  76.                 if(terlist.contains(terminalid)){  
  77.                     continue;  
  78.                 }  
  79.                 pstmtInsert.setString(1, (String) gen.generate(nullnull));  
  80.                 pstmtInsert.setString(2, terminalid);  
  81.                 pstmtInsert.setString(3, transtime);  
  82.                 pstmtInsert.addBatch();  
  83.             }  
  84.             pstmtInsert.executeBatch();  
  85.  
  86.             conn.commit();  
  87.             log.debug("向故障表中添加新的故障記錄完成");  
  88.               
  89.         } catch (Exception ex) {  
  90.             try{  
  91.                 conn.rollback();  
  92.             }catch (Exception e) {  
  93.             }  
  94.             throw ex;  
  95.         } finally {  
  96.             if (rs != null) {  
  97.                 try {  
  98.                     rs.close();  
  99.                 } catch (Exception ex) {  
  100.                 }  
  101.             }  
  102.             if (pstmt != null) {  
  103.                 try {  
  104.                     pstmt.close();  
  105.                 } catch (Exception ex) {  
  106.                 }  
  107.             }  
  108.             if (pstmtInsert != null) {  
  109.                 try {  
  110.                     pstmtInsert.close();  
  111.                 } catch (Exception ex) {  
  112.                 }  
  113.             }  
  114.             if (conn != null) {  
  115.                 try {  
  116.                     conn.close();  
  117.                 } catch (Exception ex) {  
  118.                 }  
  119.             }  
  120.         }  
  121.     }  
  122.  

這份代碼長達(dá)120行,要去理解它還是得花一些時間的,如果使用 scala來寫的話,可以怎么寫呢?

 
 
 
  1. implicit val conn: Connection  = transDataSource.getConnection()  
  2. transaction {  
  3.  
  4.     update("""update T_Terminal set Status=9 where TerminalID in   
  5.         (select TerminalID from T_Terminal where TO_CHAR(latestDate, 'yyyymmddHH24miss')<= ? and (status=0 or status=2))  
  6.         """, timeout);  
  7.       
  8.     update("""UPDATE T_TROUBLELOG tl SET tl.SolveDate=TO_DATE(?,'yyyymmddHH24miss') WHERE terminalid IN   
  9.         (SELECT tm.terminalid FROM T_TERMINAL tm,T_TROUBLELOG tl  WHERE tm.Status != 9 AND tm.TerminalID=tl.TerminalID )   
  10.         AND tl.DeviceID='COMMMODULE' AND tl.TroubleID='CommTimeOut' AND tl.SolveDate IS NULL  
  11.         """, transtime);  
  12.  
  13.     val terlist: List[String] = List()  
  14.     query("""SELECT terminalid FROM T_TROUBLELOG tr   
  15.             WHERE tr.DeviceID='COMMMODULE' AND tr.TroubleID='CommTimeOut' AND tr.SolveDate IS NULL   
  16.             GROUP BY  terminalid  
  17.         """).foreach { (row) =>  
  18.         terlist += row("terminalid")  
  19.     }  
  20.     log.debug("查詢終端號在故障表中沒有未處理的超時記錄完成");  
  21.  
  22.     val noterlist: List[String] = List()  
  23.     query("SELECT te.TerminalID FROM T_TERMINAL te WHERE te.status=9").foreach { (row)=>  
  24.         noterlist += row("terminalid")  
  25.     }  
  26.     log.debug("查詢超時的終端信息完成" + noterlist.size());  
  27.  
  28.     val psInsert = conn prepareStatement """insert into T_TroubleLog (LogID, TerminalID, DeviceID, TroubleID, HappenDate)   
  29.         values (?, ?, 'COMMMODULE', 'CommTimeOut', TO_DATE(?,'yyyymmddHH24miss'))"""  
  30.  
  31.     for(val terminalId <- noterlist){  
  32.         psInsert << uuid() << terminalid << transtime <
  33.     }  
  34.  
  35. }  
  36.  

這是一個直譯的版本,代碼函數(shù)為34行,瘦身到25%左右。不僅代碼行數(shù)更短,而且新的代碼的可讀性也更高得多。

最近一直在思考,我們對JDBC是否做了過度的包裝?包括事務(wù)處理,DAO等從EJB1.0時代產(chǎn)生的設(shè)計模式,到后續(xù)的O-R-M框架,看上去代碼是越發(fā)簡潔,實(shí)際上已經(jīng)遠(yuǎn)遠(yuǎn)的遠(yuǎn)離代碼的本質(zhì)。這種基于Scala的JDBC簡單封裝,即便于我,也還遠(yuǎn)不如原始的4GL的簡潔,但相比傳統(tǒng)的jdbc或者后續(xù)的orm、spring+dao等等,則要簡化得多。

scala到底能不能投入實(shí)際項目應(yīng)用?開發(fā)人員的學(xué)習(xí)成本有多高?這個問題一直讓我痛苦,最近,看到 dcaoyuan 先生的netbeans scala ide,讓我重新點(diǎn)燃對scala的欲望,或許,在我們的平臺中,接下來就可以嘗試 scala了:至少在我看來,scala可以有效的消除我們目前代碼中不必要的 DAO 模式以及復(fù)雜的事務(wù)處理模型等。如果能夠在有限的范圍內(nèi)進(jìn)行嘗試,進(jìn)而進(jìn)行推廣。或許能夠在接下來能進(jìn)一步的提高工作效率。


名稱欄目:Scala的啟發(fā):代碼本質(zhì)與過度包裝的平衡
文章轉(zhuǎn)載:http://www.dlmjj.cn/article/cdessji.html