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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

重复码

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 重复码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

在我們的Java應用程序中復制/粘貼代碼通常不好,但是有時這是不可避免的。 例如,項目License3j在Feature類中為其支持的每種XXX類型提供了一個isXXX方法。 在這種情況下,我們要做的就是寫

public boolean isBinary() { return type == Type.BINARY; } public boolean isString() { return type == Type.STRING; } public boolean isByte() { return type == Type.BYTE; } public boolean isShort() { return type == Type.SHORT; } and so on

應用程序支持的每種功能類型。 那里有一些類型:Binary,String,Byte,Short,Int,Long,Float,Double,BigInteger,BigDecimal,Date,UUID。 鍵入所有非常相似的方法不僅是無聊的任務,而且容易出錯。 很少有人擅長執行此類重復性任務。 為了避免這種情況,我們可以使用Java :: Geci框架,作為最簡單的解決方案,我們可以使用生成器Iterate。

POM依賴

要使用生成器,我們必須添加依賴項

< dependency > < groupId >com.javax0.geci</ groupId > < artifactId >javageci-core</ artifactId > < scope >test</ scope > < version >1.4.0</ version > </ dependency >

該庫僅在測試運行時執行,因此使用它并不意味著任何額外的依賴關系。 誰想要使用許可證3j庫都不需要使用Java :: Geci。 這只是test范圍中使用的開發工具。

單元測試運行

依賴關系不會自行運行。 畢竟依賴不是程序。 它是打包到JAR中的一堆類文件,可在類路徑上使用。 我們必須執行生成器,并且必須通過創建單元測試的框架來完成:

@Test @DisplayName ( "run Iterate on the sources" ) void runIterate() throws IOException { Geci geci = new Geci(); Assertions.assertFalse( geci.register(Iterate.builder() .define(ctx -> ctx.segment().param( "TYPE" , ctx.segment().getParam( "Type" ).orElse( "" ).toUpperCase())) .build()) .generate() , geci.failed() ); }

它創建一個Geci對象,使用生成器實例Geci ,然后在配置的框架Geci對象上調用generate() 。 就目前而言, define()調用似乎有點神秘。 稍后我們將闡明這一點。

源代碼準備

執行構建之前的最后一步是定義模板以及要插入模板的值。 無需編寫所有方法,而是編寫模板和編輯器折疊段:

/* TEMPLATE LOOP Type=Binary|String|Byte|Short|Int|Long|Float|Double|BigInteger|BigDecimal|Date|UUID public boolean is{{Type}}() { return type == Type.{{TYPE}}; } */ //<editor-fold id="iterate"> //</editor-fold>

當我們通過框架執行生成器時,它將為占位符Type每個值評估模板,并將每個{{Type}}替換為實際值。 生成的代碼將插入id “ iterate”的編輯器折疊段中。

查看模板,您會發現有一個占位符{{TYPE}} ,未在列表中定義。 這是統一測試define()進入圖片的地方。 它定義一個使用上下文的使用者,并使用該上下文讀取Type的實際值,創建該值的大寫版本并將其分配給名為TYPE的段參數。

通常就是這樣。 使用生成器還有其他功能,例如每次迭代定義多個值分配給不同的占位符,轉義或跳過行等。 關于這些內容的摘錄是您可以閱讀文檔的摘錄,您可以閱讀最新且完整的內容https://github.com/verhas/javageci/blob/master/ITERATE.adoc

文檔摘錄

在要使用生成器的Java源文件中,必須使用注釋@Geci("iterate")來注釋該類。
您也可以改用@Iterate批注,該批注在
javageci-core-annotations模塊。 這將指示Geci框架您要在給定類中使用iterate生成器。

TEMPLATE

模板在/\*TEMPLATE或TEMPLATE行之后開始。
/*和單詞之間前后可以有空格
TEMPLATE但線上不應有其他任何東西。 當生成器看到這樣的行時,它將開始收集以下行作為模板的內容。

模板的末尾由一行上帶有*/信號線表示,沒有其他內容(空格除外)。

模板的內容可以包含{{和}}之間的參數
字符,與胡子模板程序使用的字符類似。
(生成器不使用胡須,模板處理更為簡單。)

LOOP

在收集模板的行時,某些行被識別為模板的參數定義。 這些行不會進入模板的主干。 (這些行上的命令名稱始終為大寫。)

如您在簡介中所見

LOOP type =int|long|short

不是模板文本的一部分。 它通過類型指示發生器迭代并設置參數{{type}}在文本到int第一, long第二和short的最后。 這樣,您可以遍歷單個參數的多個值。

更復雜的模板可能需要多個參數。 在這種情況下,您可以將它們在LOOP行中列出為

LOOP type ,var=int,aInt|long,aLong|short,aShort

這將告訴生成器將參數設置{{type}}相同的方式,前三個迭代,但同時也設置了參數{{var}}到aInt在第一循環中,以aLong在第二循環中和最后一個循環中的aShort 。

如果值列表太長,則可以將列表分成多條LOOP行。 但是,在這種情況下,必須在第二行,第三行等等在LOOP行中重復這些變量。
它們的順序可能有所不同,但是如果某些LOOP行中存在未定義的變量,則將解析引用該變量的占位符并將其保留為{{placeholder}}形式。

上面的例子也可以寫成

LOOP type ,var=int,aInt LOOP var, type =aLong,long LOOP type ,var=short,aShort

并得出與上述LOOP相同的值:

LOOP type ,var=int,aInt|long,aLong|short,aShort

默認

從文件的開頭到結尾處理模板,并按此順序準備生成的代碼。
生成的代碼的內容將直接插入模板editor-fold的editor-fold部分。 雖然這樣的id的
editor-fold段并不是很有趣,您必須為每個段指定一個唯一的id 。 這是Java :: Geci框架的限制。

進階使用

EDITOR-FOLD-ID

您可能會遇到多個模板,這些模板遍歷不同的值,并且您希望結果進入相同的editor-fold
分割。 可以使用EDITOR_FOLD_ID 。

在下面的例子中

package javax0.geci.iterate.sutclasses; public class IterateOverMultipleValues { /* TEMPLATE {{ type }} get_{{ type }}Value(){ {{ type }} {{variable}} = 0; return {{variable}}; } LOOP type ,variable=int,i|long,l|short,s EDITOR-FOLD-ID getters */ // // nothing gets here // // int get_intValue(){ int i = 0; return i; } long get_longValue(){ long l = 0; return l; } short get_shortValue(){ short s = 0; return s; } // }

生成的代碼進入具有id名稱的editor-fold
getters即使這不是遵循模板定義的getters 。

使用此功能可以將生成的代碼從多個迭代模板發送到單個段中。 通常,將模板和段保持在一起是一個好習慣。

ESCAPE和SKIP

模板的結尾由*/ 。 這實質上是評論的結尾。 如果要在模板中包含注釋(如JavaDoc),會發生什么情況。 您可以在注釋行的末尾添加*/字符,但其中仍包含一些字符。 該解決方案不是很好,它實際上是一種解決方法。

要有一條完全是注釋結尾的行,或者是模板處理可以解釋的任何行,例如LOOP行,您應該在前一行中包含除ESCAPE任何行。 這將告訴模板處理將下一行包括在模板文本中,并在此后的行繼續進行正常處理。

同樣,您可以使用SKIP行來完全忽略下一行。
使用這兩個命令,您可以將任何內容包括到模板中。

一個示例顯示如何將JavaDoc注釋包括到模板中:

package javax0.geci.iterate.sutclasses; public class SkippedLines { /* TEMPLATE /** * A simple zero getter serving as a test example * @ return zero in the type {{ type }} ESCAPE */ // SKIP /* {{ type }} get_{{ type }}Value(){ {{ type }} {{variable}} = 0; return {{variable}}; } LOOP type ,variable=int,i|long,l|short,s EDITOR-FOLD-ID getters */ // /** * A simple zero getter serving as a test example * @ return zero in the type int */ int get_intValue(){ int i = 0; return i; } /** * A simple zero getter serving as a test example * @ return zero in the type long */ long get_longValue(){ long l = 0; return l; } /** * A simple zero getter serving as a test example * @ return zero in the type short */ short get_shortValue(){ short s = 0; return s; } // }

模板以注釋開頭,并且注釋實際上可以包含任何其他開頭的注釋。 Java注釋不嵌套。 模板的末尾是包含*/字符串的行。 我們希望該行成為模板的一部分,因此我們在該行之前
ESCAPE因此它不會被解釋為模板的末尾。 另一方面,對于Java,這將結束注釋。 要繼續模板,我們必須“返回”注釋模式,因為我們不希望Java編譯器將模板作為代碼來處理。 (最后但并非最不重要的一點是,因為使用占位符的模板可能不是語法上正確的Java代碼片段。)我們需要一個新的/*行,我們不想將其插入模板。
因此,此行之前包含// SKIP的行。 (跳過行在命令前可以具有// 。)

您可以在生成的代碼中看到的結果。 所有方法都具有正確的JavaDoc文檔。

SEP1和SEP2

遍歷值已與占位符的名字分開,并且| 值列表。 例如,上面的示例包含

LOOP type ,variable=int,i|long,l|short,s

兩個占位符名稱type和variable ,每個占位符三個值。
占位符不需要包含特殊字符,如果它們是標準標識符,則最好。 但是,這些值可能包含逗號或豎線。 在這種情況下,你可以重新定義字符串(不僅是單個字符),模板LOOP命令可以改用單一字符串,和| 。

例如線

SEP1 /

表示名稱和值應以/分隔,而不是一個和

SEP2 &

的值的列表應當由一個字符分隔&
串。 SEP1和SEP2僅在它們之前
LOOP命令,它們僅對所使用的模板有效。遵循上述命令, LOOP示例將如下所示:

LOOP type /variable =int /i &long /l &short /s

這樣,沒有什么可以阻止我們添加另一個值列表

LOOP type /variable =int /i &long /l &short /s &byte,int /z

最終將導致示例模板出現語法錯誤,但演示了重新定義名稱和值列表分隔符的要點。

組態

生成器由Geci框架支持的配置工具實現,并且所有參數都是可配置的。 您可以在類的注釋中或在編輯器折疊參數中,重新定義與模板的開始,結束,跳過等行相匹配的正則表達式,在創建生成器對象的單元測試中。

帶走

迭代生成器是一種非常易于使用的生成器,用于創建重復的代碼。 這也是主要的危險:您應該足夠強大才能找到更好的解決方案,并僅在最佳解決方案時才使用它。

翻譯自: https://www.javacodegeeks.com/2019/11/repeated-code.html

總結

以上是生活随笔為你收集整理的重复码的全部內容,希望文章能夠幫你解決所遇到的問題。

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