成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Scala的啟發:代碼本質與過度包裝的平衡

開發 后端
基于Java、Hibernate的商業應用開發確實陷入到了一個很痛苦的境界,而大家卻都覺得這就是正常的程序員生活。不過,一段Scala直譯JDBC的代碼,卻引發了另一番思考。

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

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

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

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

  1. public void updateTerminalStatus(String timeout, String transtime) throws Exception {  
  2.         //更新超時終端的狀態值(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.         //更新故障表中的終端超時記錄,該終端號的狀態已經不超時,則超時故障處理完畢。  
  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位的隨機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.  

這份代碼長達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.  

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

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

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

責任編輯:yangsai 來源: Wang Zai Xiang
相關推薦

2010-09-14 15:34:41

Scala

2023-05-09 09:04:29

代碼設計語言

2009-07-21 08:54:35

Scala富包裝器

2009-07-22 07:45:00

Scala代碼重復

2009-12-09 09:15:47

從Java走進ScalTwitter API

2021-02-06 23:21:35

SaaS開發低代碼

2009-09-09 14:09:35

Scala Trait

2010-01-22 00:06:26

戴爾綠色

2019-09-02 22:17:01

英特爾

2022-04-19 20:51:20

軟件開發耦合代碼

2018-11-08 15:50:18

前端Javascript重用性

2022-02-24 18:51:04

跨端框架方案

2020-10-31 17:33:18

Scala語言函數

2009-07-08 12:43:59

Scala ServlScala語言

2013-04-27 10:24:03

2012-03-21 10:09:12

2016-05-30 09:43:58

HDS

2022-07-27 19:24:16

SQL

2025-07-01 03:15:00

2009-09-15 18:27:59

equals實現canEqualScala
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 亚洲欧美日韩国产综合 | 精品三级| 一级爱爱片 | 国产精品日韩欧美一区二区 | 国产视频久久久 | 久久国产精品久久久久久 | 欧美aaa | 亚洲一区国产精品 | 成人在线电影在线观看 | 亚洲精品久久久久久国产精华液 | 久艹网站 | 羞羞视频免费观 | 精品一二区| 日韩久久久久久 | 在线精品一区二区 | 免费一级淫片aaa片毛片a级 | 久色网 | 中文字幕在线观看一区二区 | 天天操天天天干 | 九九在线视频 | 久久久高清 | 久久69精品久久久久久久电影好 | 毛片a级 | 国产一区二区精品在线 | 成人福利网站 | www.亚洲成人网 | 日韩福利片 | 亚洲欧美在线一区 | 久久久久国产一区二区三区不卡 | 国产日产欧产精品精品推荐蛮挑 | 最近最新中文字幕 | 国产人成精品一区二区三 | 亚洲xxxxx| 91资源在线 | 国产日韩精品在线 | 国产精品视频999 | 国产精品视频一二三区 | 91久久国产精品 | 久久在视频 | 玖玖国产精品视频 |