java 语义_Java文件合并变得语义化
java 語義
與任何程序員交談,并詢問他應該如何進行合并:“它應該理解代碼,對其進行解析,然后根據結構進行合并” –他很可能會說。
而這恰恰是SemanticMerge for Java所做的:它解析要合并的文件(加上祖先或“文件在更改之前的狀態”)并根據該信息進行操作。
為什么所有關于合并的嗡嗡聲?
開發軟件是一個協作過程。 如果您在團隊中工作,遲早會有兩個開發人員修改同一個文件。 每當發生這種情況
您必須合并。 實際上,合并并不僅限于創建分支(很多人會說),而是合并到處理相同文件的開發人員,即使他們在同一分支上進行合并(如果兩個人在同一分支,同一文件上工作)他們將必須在簽到時合并-或在Git行話中“提交”。
在合并方面,新一代的分布式版本控制系統(DVCS)比上一代做得更好。 這就是為什么許多人從SVN,CVS和較早的替代產品跳入Git的原因。
下一步不僅是在如何處理文件方面的更好算法,下一步是創建一種更好的機制來合并“文件內部”,這正是SemanticMerge的全部意義所在。
SemanticMerge旨在降低保持代碼干凈的成本
在開發合并工具時,我們始終牢記兩個圖形:1981年的Barry Bohem的更改成本和20年后的Kent Beck的相同圖形:
一代又一代的開發人員被教導“波西姆原理”:“進行生產變更,與分析階段引入的相同變更相比,這將花費您一筆巨款”。
然后,貝克提出了類似的建議:“保持代碼干凈,更改成本將保持不變”,這是敏捷方法背后的基石。
而這恰恰是SemanticMerge背后的口頭禪:保持代碼干凈。 為什么? 因為它有回報。
通常,您會看到需要重新布置的類:“放下這兩個私有方法,將公共構造函數上移,將私有字段移到底部……”但是您不這樣做的原因是,也許有人觸摸該文件,合并將變得地獄。 這正是SemanticMerge所解決的問題:它“知道”您移動了一個方法,因此不會被它所愚弄。
語義合并
現在讓我們研究一個典型的語義合并案例。 假設您有一個帶有幾種方法的類。 第一個開發人員將其中一個方法移動到類中的其他位置,并且還修改了該方法。 同時,第二個開發人員在原始位置修改了該方法。
查看下圖:
常規的基于文本的合并工具將無法處理這種情況,但是SemanticMerge能夠識別該方法發生了什么并提出以下合并情況:
如您所見,它標識方法“ onBuildHeaders”已被并行修改(檢查打印方法名稱的欄兩邊的“ c”圖標)并已移至其中一個貢獻者(選中“ m”圖標)。
現在,進行合并的開發人員可以在“ onBuildHeaders”方法上運行“合并”,該方法將僅合并沖突的方法,并保留新位置。
SemanticMerge如何工作?
您可能會猜到,SemanticMerge首先解析所涉及的3個文件的代碼(原始文件加上兩個貢獻者),然后計算每個文件的結構:這是樹的代碼表示形式。
完成此操作后,SemanticMerge開始使用3棵樹:首先計算一個貢獻者與原始版本之間的差異,然后與另一個貢獻者重復該過程。
第三步是合并計算本身:它將遍歷兩對差異并檢查它們是否碰撞。 如果它們這樣做,則存在合并沖突。 如果相同的方法已被移動或修改兩次,以此類推,則可能發生這種情況。 計算稍微復雜一點,因為不僅必須在沖突相同方法時還要計算沖突,而且還必須在其容器中存在沖突時計算沖突(例如,在父類之間進行“有區別的”重命名等)。
還值得補充的是,為了在重命名方法(或字段,屬性等)時跟蹤它們,SemanticMerge計算“相似性索引”以查看方法主體之間的接近程度以及匹配度何時良好,它假定它是相同的元素。
一些數字
我們重新運行了約4萬個合并,下載了將近500個開源項目。 這意味著我們拉出存儲庫,找到所有合并,然后通過SemanticMerge工具再次運行它們。
這樣做,我們發現了以下數字:
- 當前的合并中有23%是“語義”的,這意味著它們具有的內容不是“變-變”沖突。 它可以是代碼移動,在同一位置添加多個方法,移動和更改方法等等。
- 在這4萬次合并中,我們發現1.54%的合并從手動變為全自動。 這不是一個很大的數字,這意味著一旦團隊開始使用SemanticMerge,它就會增長。 (這些數字是使用與當前語言無關的合并工具重新運行合并的結果,因此開發人員傾向于避免對文件進行復雜的更改)。
- 在通過SemanticMerge和傳統的基于文本的合并工具運行代碼時,我們計算了合并沖突中涉及的行數,我們發現,使用SemanticMerge,沖突中涉及的代碼行減少了97%……這意味著工作量減少了去做!!
免費開源
在測試SemanticMerge時,我們提取了約500個長期運行,狂熱的開放源代碼存儲庫,然后我們“重放”了所有合并。 在列表中,有像hibernate,openjdk,apache-lucene,jbos,monodevelop,mono,monomac,monogame,nhibernate之類的存儲庫,這確實很有幫助。
因此,我們決定免費為對開源項目做出貢獻的開發人員免費使用SemanticMerge,因為我們相信可以回饋。 您可以在這里查看 !
翻譯自: https://www.javacodegeeks.com/2013/06/java-file-merging-goes-semantic.html
java 語義
總結
以上是生活随笔為你收集整理的java 语义_Java文件合并变得语义化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓轰炸机永久免费版下载(安卓轰炸)
- 下一篇: 华硕a43s笔记本拆机图解(华硕a43s