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

Scala的啟發(fā):代碼本質(zhì)與過(guò)度包裝的平衡

開(kāi)發(fā) 后端
基于Java、Hibernate的商業(yè)應(yīng)用開(kāi)發(fā)確實(shí)陷入到了一個(gè)很痛苦的境界,而大家卻都覺(jué)得這就是正常的程序員生活。不過(guò),一段Scala直譯JDBC的代碼,卻引發(fā)了另一番思考。

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

51CTO編輯推薦:Scala編程語(yǔ)言專(zhuān)題

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

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

  1. public void updateTerminalStatus(String timeout, String transtime) throws Exception {  
  2.         //更新超時(shí)終端的狀態(tài)值(9為超時(shí))   
  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.         //查詢(xún)超時(shí)的終端信息,且該終端號(hào)在故障表中沒(méi)有未處理的超時(shí)記錄,(包含該終端號(hào)在故障表中沒(méi)有超時(shí)記錄的情況)。  
  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.         //更新故障表中的終端超時(shí)記錄,該終端號(hào)的狀態(tài)已經(jīng)不超時(shí),則超時(shí)故障處理完畢。  
  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("查詢(xún)終端號(hào)在故障表中沒(méi)有未處理的超時(shí)記錄完成");  
  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("查詢(xún)超時(shí)的終端信息完成" + 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.  

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

  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("查詢(xún)終端號(hào)在故障表中沒(méi)有未處理的超時(shí)記錄完成");  
  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("查詢(xún)超時(shí)的終端信息完成" + 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.  

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

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

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

責(zé)任編輯:yangsai 來(lái)源: Wang Zai Xiang
相關(guān)推薦

2010-09-14 15:34:41

Scala

2023-05-09 09:04:29

代碼設(shè)計(jì)語(yǔ)言

2009-07-22 07:45:00

Scala代碼重復(fù)

2021-02-06 23:21:35

SaaS開(kāi)發(fā)低代碼

2009-07-21 08:54:35

Scala富包裝器

2009-12-09 09:15:47

從Java走進(jìn)ScalTwitter API

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

軟件開(kāi)發(fā)耦合代碼

2022-02-24 18:51:04

跨端框架方案

2013-04-27 10:24:03

2018-11-08 15:50:18

前端Javascript重用性

2020-10-31 17:33:18

Scala語(yǔ)言函數(shù)

2009-07-08 12:43:59

Scala ServlScala語(yǔ)言

2016-05-30 09:43:58

HDS

2022-07-27 19:24:16

SQL

2012-03-21 10:09:12

2009-09-15 18:27:59

equals實(shí)現(xiàn)canEqualScala

2009-07-24 13:41:03

IIS ASP.NET
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: cao在线| 成人午夜影院 | 成人在线h | 一级毛片网| 在线播放国产一区二区三区 | 欧美日韩国产中文字幕 | 欧美精品一区二区三区四区 在线 | 亚洲国产欧美在线人成 | 国产在线不卡 | 日韩中文字幕视频 | a黄视频 | 91免费福利在线 | 免费看a | 亚洲精品久久久 | 午夜精品一区二区三区在线观看 | 综合网中文字幕 | 中文字幕 在线观看 | 97影院在线午夜 | 久久久久久艹 | 久久99国产精一区二区三区 | 国产9 9在线 | 中文 | 理论片午午伦夜理片影院 | 刘亦菲国产毛片bd | 国产精品国产三级国产aⅴ无密码 | 免费久久精品视频 | 久久国产精品一区 | 国产乱码精品1区2区3区 | 成人精品高清 | 色偷偷噜噜噜亚洲男人 | 视频国产一区 | 精品国产精品 | 久久中文网| 日韩av一二三区 | 蜜桃av人人夜夜澡人人爽 | 69av网| 九九热国产精品视频 | 精品国产一区久久 | 国产欧美一区二区三区在线播放 | 另类专区成人 | 国产一区二区精品在线观看 | 久久蜜桃资源一区二区老牛 |