日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

将25k行C#转换为Java的经验教训

發(fā)布時間:2023/12/3 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将25k行C#转换为Java的经验教训 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

由于各種原因,我最近完成了一個將復雜的財務應用程序從C#轉換為Java的項目。 港口的原因大部分是非技術性的,相反,這是有關企業(yè)的一項戰(zhàn)略舉措。

這是一次有趣的經歷,我在此過程中吸取了一些經驗教訓,可以分享這些經驗。

1.在現(xiàn)有系統(tǒng)上構建語言中立的測試。

我將從最重要的一課開始。 移植系統(tǒng)時,由于任何原因它可能是任何端口,因此必須具有確定該端口是否成功的標準。 最好的方法是圍繞原始系統(tǒng)構建一整套測試,這些測試可以“ 無需更改就導出”到新系統(tǒng)。 因此,例如,如果要將系統(tǒng)從Java遷移到不支持JUnit的其他語言,則沒有一套JUnit測試是不好的。 我不能過分強調測試的更改從字面上可以從舊系統(tǒng)復制到新系統(tǒng)而無需干預的重要性,這是多么重要。

JUnit測試的另一個問題是它們通常與現(xiàn)有的實現(xiàn)緊密地聯(lián)系在一起。 由于將要重寫實現(xiàn),因此測試無法在實現(xiàn)之間移植。

我們選擇的并且非常有效的策略是使用Cucumber測試。 幾乎所有語言都有Cucumber的綁定,IDE(至少是IntelliJ和Visual Studio都)很好地支持了Cucumber,此外,該測試是人類可讀的。 這樣,您可以讓非技術用戶參與測試的準備工作,以準備端口。 (順便說一句,我們試圖通過記錄舊系統(tǒng)所做的所有事情并圍繞這些需求構建測試來讓用戶定義新系統(tǒng)的需求,但這不足為奇,這并不奇怪。基于構建測試用例要好得多而不是嘗試為新系統(tǒng)發(fā)明它們!)。

使用Cucumber確實是成功的,每當系統(tǒng)之間存在差異時,我們都會創(chuàng)建一個新的測試。 到完成時,我們已經有了大約1000種方案,我們對新系統(tǒng)的正確性充滿信心。 它為我們提供了堅實的基礎,我們需要繼續(xù)開發(fā)新系統(tǒng)中的其他功能和重構。

2.嘗試并使盡可能多的翻譯自動化。

當面對超過25k行的C#時,考慮將每行手動翻譯成Java是一件非常艱巨的任務。 幸運的是,那里提供了非常有用的工具。 我們使用的產品來自有形軟件解決方案 。 花了幾百美元,它實際上節(jié)省了數(shù)百個工時。 它無論如何都不是完美的,但是它將為您提供Java代碼的結構(部分允許C#中的類的代碼被拆分成多個文件),并做出了使您可以使用Java的相當不錯的嘗試。

在我們的案例中,幾乎沒有任何生成的代碼可以實際編譯,但這確實是一個很好的起點。 我的類比是OCR的早期嘗試。 您可以掃描文檔,但是當您在編輯器中打開文檔時,您會發(fā)現(xiàn)許多未正確識別的單詞帶有紅色下劃線。 這是要遍歷所有紅色底線并弄清楚單詞應該是什么的問題。 自動翻譯產生的代碼大同小異,當它被導入IDE時,會出現(xiàn)許多編譯器錯誤。 有時自動化會留在原始C#中,并說無法自動完成翻譯。 值得稱贊的是,該工具總是偏于保守,它從未對所產生的Java犯錯,這一點很重要。

3.不要著急翻譯

運行自動翻譯后,您需要返回代碼并手動修復編譯錯誤。 如果我有時間,我將花費10倍以上的時間來確保對代碼所做的每個更改都是絕對正確的。 由于我不是C#專家,所以有時我會假設C#庫的工作方式。 這些假設并不總是正確的,有時我會付出沉重的代價進行調試,在這種情況下,如果我在原始譯文中更加謹慎,就永遠不會有問題。 花時間閱讀要翻譯的類的C#API絕對值得。 我發(fā)現(xiàn)在使用Date和DateTime對象時,這一點特別重要。

花時間學習Visual Studio IDE也是值得的。 并行調試時,如果您知道如何正確使用IDE,從長遠來看將節(jié)省時間。

4.使用Java 8

除了使用Java 8的所有顯而易見的原因(這是Java的最新版本,所以為什么不使用它……)之外,Stream API也可以很好地映射到C#Linq。 語法略有不同,例如Java使用'->'和C#使用'=>' ,但是使用Java 8的新功能確實有助于保持代碼的可比性,這在進一步調試時都很有幫助。

5.注意意外行為

語言的某些功能是您不應該依賴的,但可能會完全一樣。 讓我舉一個我花了太多時間的例子來說明。 C#代碼使用的是Dictionary ,代碼生成器將Dictionary正確翻譯為HashMap 。 兩者都是無序地圖。 然而,盡管Dictionary是無序的合同(還有一個OrderedDictionary )當?shù)ㄟ^Dictionary似乎保留插入順序。 HashMap并非如此,并且由于元素的順序對于結果HashMap ,因此我們發(fā)現(xiàn)了難以調試的差異。 解決方案是用確實保留順序的LinkedHashMap替換HashMap所有實例。

6.不要過早重構

從代碼生成器生成的代碼不是很漂亮。 實際上,這看起來非常恐怖,幾乎違反了有關命名約定等的所有規(guī)則。隨著時間的流逝,它很容易整理。 抵制這種誘惑,直到所有單元測試都通過為止。 您以后總是可以整理一下。 重構(甚至重命名)可能會引入錯誤,尤其是在定義上您不熟悉的代碼庫中。 同樣,您可能決定在某個地方重新運行代碼生成器,并且所有整理工作最好都需要合并,最糟糕的是浪費時間。

結論

即使您不太熟悉C#,將相當復雜的程序從C#轉換為Java也并非不可能。 使用正確的工具和技術,并嚴格進行可靠和可重復的測試,將對您的項目成功產生重大影響。

翻譯自: https://www.javacodegeeks.com/2015/05/lessons-learnt-translating-25k-line-of-c-into-java.html

總結

以上是生活随笔為你收集整理的将25k行C#转换为Java的经验教训的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。