軟件的程序代碼的生成方法及裝置制造方法
【專利摘要】本發(fā)明公開了一種軟件的程序代碼的生成方法及裝置,其中,該方法包括:定義標記類并將標記類應(yīng)用到程序集中的目標類中,生成新的程序集,其中,標記類用于標記目標類的屬性特征,目標類為實現(xiàn)目標功能的程序代碼;通過T4模板和DTE來獲取新的程序集中標記類中的每個對象中的屬性值;將標記類中的每個對象中的屬性值替換目標代碼模板中的占位符,生成目標代碼,其中,目標代碼模板為預(yù)先定義的模板;將目標代碼輸出到程序集中的目標類中。本發(fā)明解決了現(xiàn)有技術(shù)在生成具有重復部分的代碼時,需要針對重復的部分手動依次輸入,導致生成代碼效率低的問題。
【專利說明】軟件的程序代碼的生成方法及裝置
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計算機領(lǐng)域,具體而言,涉及一種軟件的程序代碼的生成方法及裝置。
【背景技術(shù)】
[0002] 依賴屬性是軟件開發(fā)中應(yīng)用的重要手段之一,設(shè)計依賴屬性的目的就是根據(jù)多個 不同的輸入動態(tài)計算出屬性值,這些不同的輸入包括:資源文件、綁定、動畫、屬性繼承等, 現(xiàn)有技術(shù)對于依賴屬性的定義通常采取如下部分代碼:
[0003] ^public static readonly DependencyProperty IsSpinn/n^roperty = DependencyProperty.Register( "JsSpinning", typeof(boof), typeof(ExampkChss), new PropertyMetadata(£rw, /y5/7/>ww>^PropertyChangeCallback)H
[0004] 從上述代碼可知,定義依賴屬性非常繁瑣,每次定義都要手動輸入大量內(nèi)容,但是 從中可以發(fā)現(xiàn)規(guī)律,即除了上述斜體字,其他的字符都是固定不變的,現(xiàn)有技術(shù)中解決的方 案比如visual studio或Resharper等工具都可以在界面上自動生成上述固定不變的字符 串,即在IsSpinning或bool等依賴屬性的屬性值上采用斜體等特殊方式標識。用戶只需 針對有特殊標識的屬性值進行輸入,以解決上述輸入繁瑣的問題。
[0005] 這里需要說明的是,上述代碼中多次重復出現(xiàn)依賴屬性名稱,例如,IsSpinning, 用戶每次在修改依賴屬性的都要多次進行重復的輸入,最后生成依賴屬性的代碼,代碼生 成效率較低。
[0006] 針對現(xiàn)有技術(shù)在生成具有重復部分的代碼時,需要針對重復的部分手動依次輸 入,導致生成代碼效率低的問題,目前尚未提出有效的解決方案。
【發(fā)明內(nèi)容】
[0007] 本發(fā)明的主要目的在于提供一種軟件的程序代碼的生成方法和裝置,以解決現(xiàn)有 技術(shù)在生成具有重復部分的代碼時,需要針對重復的部分手動依次輸入,導致生成代碼效 率低的問題。
[0008] 為了實現(xiàn)上述目的,根據(jù)本發(fā)明實施例的一個方面,提供了一種軟件的程序代碼 的生成方法,該方法包括:定義標記類并將標記類應(yīng)用到程序集中的目標類中,生成新的程 序集,其中,標記類用于標記目標類的屬性特征,目標類為實現(xiàn)目標功能的程序代碼;通過 T4模板和DTE來獲取新的程序集中標記類中的每個對象中的屬性值;將標記類中的每個對 象中的屬性值替換目標代碼模板中的占位符,生成目標代碼,其中,目標代碼模板為預(yù)先定 義的模板;將目標代碼輸出到程序集中的目標類中。
[0009] 為了實現(xiàn)上述目的,根據(jù)本發(fā)明實施例的另一方面,提供了一種代碼生成的裝置。 該裝置包括:第一定義單元,定義標記類并將標記類應(yīng)用到程序集中的目標類,生成新的程 序集,其中,標記類用于標記目標類的屬性特征,目標類為實現(xiàn)目標功能的程序代碼;獲取 單元,用于通過T4模板和DTE來獲取新的程序集中標記類中的每個對象中的屬性值;替換 單元,用于將標記類中的每個對象中的屬性值替換目標代碼模板中的占位符,生成目標代 碼,其中,目標代碼模板為預(yù)先定義的模板;輸出單元,用于將目標代碼輸出到程序集中的 目標類中
[0010] 根據(jù)發(fā)明實施例,通過定義標記類;將標記類應(yīng)用到程序集中的目標類中,生成新 的程序集,其中,標記類用于標記目標類的屬性特征,目標類為實現(xiàn)目標功能的程序代碼; 通過T4模板和DTE來獲取新的程序集中標記類中的每個對象中的屬性值;將標記類中的每 個對象中的屬性值替換目標代碼模板中的占位符,生成目標代碼,其中,目標代碼模板為預(yù) 先定義的模板;將目標代碼輸出到程序集中的目標類中,本發(fā)明解決了現(xiàn)有技術(shù)在生成具 有重復部分的代碼時,需要針對重復的部分手動依次輸入,導致生成代碼效率低的問題。
【專利附圖】
【附圖說明】
[0011] 構(gòu)成本申請的一部分的附圖用來提供對本發(fā)明的進一步理解,本發(fā)明的示意性實 施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當限定。在附圖中:
[0012] 圖1是根據(jù)本發(fā)明實施例一的代碼生成方法的流程圖;
[0013] 圖2是根據(jù)本發(fā)明實施例一的優(yōu)選的代碼生成方法的示意圖;
[0014] 圖3是根據(jù)本發(fā)明實施例一的優(yōu)選的代碼生成方法的示意圖;
[0015] 圖4是根據(jù)本發(fā)明實施例二的代碼生成裝置的結(jié)構(gòu)示意圖;
[0016] 圖5是根據(jù)本發(fā)明實施例二的優(yōu)選的代碼生成裝置的結(jié)構(gòu)示意圖;以及
[0017] 圖6是根據(jù)本發(fā)明實施例二的優(yōu)選的代碼生成裝置的示意圖。
【具體實施方式】
[0018] 需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相 互組合。下面將參考附圖并結(jié)合實施例來詳細說明本發(fā)明。
[0019] 為了使本【技術(shù)領(lǐng)域】的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實施例中的 附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是 本發(fā)明一部分的實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù) 人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都應(yīng)當屬于本發(fā)明保護的范 圍。
[0020] 需要說明的是,本發(fā)明的說明書和權(quán)利要求書及上述附圖中的術(shù)語"第一"、"第 二"等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使 用的數(shù)據(jù)在適當情況下可以互換,以便這里描述的本發(fā)明的實施例。此外,術(shù)語"包括"和 "具有"以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元 的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒有 清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。
[0021] 本申請應(yīng)用術(shù)語解釋如下:
[0022] 1. Visual Studio :是微軟為開發(fā)人員提供的開發(fā)工具。
[0023] 2. Resharper :是Visual Studio的一個插件,主要是提供很多便利的功能,提高 開發(fā)效率。
[0024] 3. T4模板:集成在Visual Studio中代碼生成工具,主要用于自動生成代碼。
[0025] 4.分部類:就是將類拆分到多個文件中,每個文件是類的一部分,編譯時將所有 部分組合起來。
[0026] 5.分部方法:類似于分部類,就是將方法拆分到多個文件中,一個文件中給出方 法定義,一個文件中給出方法實現(xiàn)。
[0027] Custonier.cs 文仲 public partial cbss Customer { public string Customerld { get set;} partial void Buy();
[0028] } Ciistomer__action.es 文件 public partial cbss Customer { partial void Buy〇 C } }
[0029] 6. Attribute (特性):在.NET中定義的類、方法都是有元數(shù)據(jù)的,以類為例,類的 名稱、類型、命名空間,訪問修飾符(public、private)這些都相當于元數(shù)據(jù)信息,編譯好的 程序集包含這些元數(shù)據(jù)信息。特性也是一種元數(shù)據(jù)信息,編譯后程序集中保存了每個類應(yīng) 用的特性。
[0030] 7.反射:就是讀取程序集的元數(shù)據(jù),運行時創(chuàng)建類的實例,或從現(xiàn)有對象獲取類 型并調(diào)用其方法或訪問其字段和屬性。如果代碼中使用了特性,可以利用反射來訪問它們。
[0031] 8.工程:代碼組織方式,可以理解為存放代碼容器,可以包含文件夾、代碼文件、 XML文件、文本文件等。
[0032] 9.解決方案:同樣是一種代碼組織方式,比工程范圍更廣,一個解決方案包含多 個工程,還可以包含虛擬文件夾(因為解決方案中的文件夾不是真實存在的,不對應(yīng)具體 真實文件路徑,工程中的文件夾是對應(yīng)真實的文件路徑的)。
[0033] 10. DTE,開發(fā)環(huán)境,其實就是Visual Studio提供的編程接口,使用這些接口可以 針對Visual Studio進行編程,擴展Visual Studio的功能。
[0034] 實施例1
[0035] 本發(fā)明實施例提供一種軟件的程序代碼的生成方法,如圖1所示,該方法可以包 括:
[0036] 步驟S101,定義標記類,并將標記類應(yīng)用到程序集中的目標類,生成新的程序集, 其中,標記類用于標記目標類的屬性特征,目標類為實現(xiàn)目標功能的程序代碼。
[0037] 具體的,本實施例可以以生成依賴屬性的模板的代碼為例進行描述,本實施例提 供的方法可以首先定義上述標記類,上述標記類可以是DenpendencyPropertyAttribute, 上述標記類可以包含對象,上述對象可以是依賴屬性的至少一個特征,上述標記類 DependencyProperyAttribute則包含上述依賴屬性的至少一個特征。可選的,可以將定義 的標記類應(yīng)用到需要生成依賴屬性的程序集中,具體應(yīng)用到程序集中需要生成依賴屬性的 目標類中,上述程序集由于添加了標記類因而生成新的程序集。
[0038] 步驟S103,通過T4模板和DTE來獲取新的程序集中標記類中的每個對象中的屬性 值。
[0039] 步驟S105,將標記類中的每個對象中的屬性值替換目標代碼模板中的占位符,生 成目標代碼,其中,目標代碼模板為預(yù)先定義的模板。
[0040] 具體的,上述目標代碼模板可以為生成依賴屬性的模板,例如下面的代碼:
[0041] public partial class {2} c public static readonly Dependency Properly {0}Property = DependencyProperty,RegIster(ff{0},,f typeof({l})f %rpeof({2})# new PropertyMetacbta({3},{0}PropertyChafigeCallba€k)); public {1} {0} { get { return ({l})GetValiie({0}Property); } set { SetValueCIOJProperty, value);} } partial static void {0}PropertyChangeCallback (DependencyObject obj, DepenctencyProperlyChangedEventArgsargs); }
[0042] 在上述代碼中,占位符0、1、2、3可以對應(yīng)上述標記類的4個屬性。從上述模 板中可以看到第零個占位符為依賴屬性的名稱,第一個占位符為依賴屬性的類型,第二 個占位符為依賴屬性的擁有者,第三個占位符為依賴屬性的默認值。讀取到每個類的 DependencyPropertyAttribute的四個屬性值后,直接將上述四個占位符替換即可。
[0043] 步驟S107,將目標代碼輸出到程序集中的目標類中。
[0044] 可選的,在新的程序集中生成依賴屬性代碼之后,如果要修改依賴屬性的話,只需 要修改DependencyProperyAttribute的四個屬性值即可,不需要多處修改。比如以下的依 賴屬性的定義:
[0045]
[Dependency Property (Property Name= "IsSpinning", Type = "bool", Owner = "ExampteClass", DefaultValue = "false")] public partial cbss ExampleCbss { }
[0046] 如果用戶想修改依賴屬性的名稱,用戶只需要上述代碼中的斜字〃 I s Sp i nn i ng〃 即可,程序集中所有依賴屬性的名稱都會自動隨著改變,如果用戶想在程序集里添加依賴 屬性的時候,也不需要對多個重復的屬性值進行多次添加。只需要添加一處就可以了。
[0047] 本實施例通過定義標記類,并將標記類應(yīng)用到程序中的目標類,通過T4模板和 DTE來獲取上述標記類中的屬性值,添加到預(yù)先定義的目標代碼的模板中,從而生成目標代 碼,上述目標代碼中包含重復的部分。本實施例解決了現(xiàn)有技術(shù)在生成具有重復部分的代 碼時,需要針對重復的部分手動依次輸入,導致生成代碼效率低的問題。
[0048] 可選的,步驟S101中定義標記類的步驟還可以包括:
[0049] 步驟S201,定義標記類的對象,其中,標記類的對象包括至少一個屬性,在生成依 賴屬性的實例中,上述至少一個屬性可以是:名稱、類型、擁有者和默認值。
[0050] 具體的,上述標記類可以是DependencyPropertyAttribute,上述 DependencyPropertyAttribute可以包含依賴屬性的四個特征定義如下表1 :
[0051] 表 1 :
[0052]
【權(quán)利要求】
1. 一種軟件的程序代碼的生成方法,其特征在于,包括: 定義標記類,并將所述標記類應(yīng)用到程序集中的目標類,生成新的程序集,其中,所述 標記類用于標記所述目標類的屬性特征,所述目標類為實現(xiàn)目標功能的程序代碼; 通過T4模板和DTE來獲取所述新的程序集中所述標記類中的每個對象中的屬性值; 將所述標記類中的每個對象中的屬性值替換目標代碼模板中的占位符,生成目標代 碼,其中,所述目標代碼模板為預(yù)先定義的模板; 將所述目標代碼輸出到所述程序集中的所述目標類中。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述定義標記類的步驟包括: 定義所述標記類的對象,其中,所述標記類的對象包括至少一個屬性。
3. 根據(jù)權(quán)利要求2所述的方法,其特征在于,在定義標記類并將所述標記類應(yīng)用到程 序集中的目標類中,生成新的程序集之前,所述方法還包括: 接收用戶輸入的參數(shù),在所述標記類中生成屬性值,其中,所述參數(shù)分別對應(yīng)所述標記 類的對象。
4. 根據(jù)權(quán)利要求1至3中任意一項所述的方法,其特征在于,所述通過所述T4模板和 DTE來獲取所述新的程序集中所述標記類中的每個對象中的屬性值的步驟包括: 獲取所述T4模板所在的工程; 遞歸遍歷所述工程中的所述應(yīng)用了所述標記類的目標類; 獲取所述標記類中每個對象的屬性值。
5. 根據(jù)權(quán)利要求4所述的方法,其特征在于,所述獲取T4所在的工程的步驟還包括: 獲取T4模板在模板轉(zhuǎn)換引擎中的宿主; 使用所述宿主獲取所述DTE ; 使用所述DTE獲取所述T4模板所在的所述工程。
6. 根據(jù)權(quán)利要求5所述的方法,其特征在于,遞歸遍歷所述工程的所述應(yīng)用了所述標 記類的目標類的步驟還包括: 遍歷所述工程下所有工程項目; 循環(huán)遍歷所述工程項目中的代碼項目; 遞歸遍歷每個所述代碼項目并將所有所述代碼項目組建一個集合; 對所述集合篩選出含有所述應(yīng)用了所述標記類的目標類。
7. 根據(jù)權(quán)利要求2所述的方法,其特征在于,在將所述標記類應(yīng)用到所述程序集中的 目標類,生成所述新的程序集之前,所述方法還包括: 使用所述T4模板定義所述目標代碼模板,其中,所述目標代碼模板中包含至少一個屬 性,其中,所述目標代碼模板中至少一個屬性在所述目標代碼模板中使用不同的占位符替 換。
8. -種軟件的程序代碼的生成裝置,其特征在于,包括: 第一定義單元,定義標記類;并將所述標記類應(yīng)用到程序集中的目標類,生成新的程序 集,其中,所述標記類用于標記所述目標類的屬性特征,所述目標類為實現(xiàn)目標功能的程序 代碼; 獲取單元,用于通過T4模板和DTE來獲取所述新的程序集中所述標記類中的每個對象 中的屬性值; 替換單元,用于將所述標記類中的每個對象中的屬性值替換目標代碼模板中的占位 符,生成目標代碼,其中,所述目標代碼模板為預(yù)先定義的模板; 輸出單元,用于將所述目標代碼輸出到所述程序集中的所述目標類中。
9. 根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述第一定義單元還包括: 定義模塊,用于定義所述標記類的對象,其中,所述標記類的對象包括以至少一個屬 性。
10. 根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述裝置還包括: 接收單元,用于接收用戶輸入的參數(shù),在所述標記類中生成屬性值,其中,所述參數(shù)分 別對應(yīng)所述標記類的對象。
11. 根據(jù)權(quán)利要求8至10中任意一項所述的裝置,其特征在于,所述獲取單元還包括: 第一獲取模塊,用于獲取所述T4模板所在的工程; 遍歷模塊,用于遞歸遍歷所述工程中的所述應(yīng)用了所述標記類的目標類; 第二獲取模塊,用于獲取所述標記類中每個對象的屬性值。
12. 根據(jù)權(quán)利要求11所述的裝置,其特征在于,所述獲取模塊還包括: 第一子獲取模塊,用于獲取T4模板在模板轉(zhuǎn)換引擎中的宿主; 第二子獲取模塊,用于使用所述宿主獲取所述DTE ; 第三子獲取模塊,用于使用所述DTE獲取所述T4模板所在的所述工程。
13. 根據(jù)權(quán)利要求12所述的裝置,其特征在于,所述遍歷模塊還包括: 第一子遍歷模塊,用于遍歷所述工程下所有工程項目; 第二子遍歷模塊,用于循環(huán)遍歷所述工程項目中的代碼項目; 第三子遍歷模塊,用于遞歸遍歷每個所述代碼項目并將所有所述代碼項目組建一個集 合; 篩選模塊,用于對所述集合篩選出含有所述應(yīng)用了所述標記類的目標類。
14. 根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述裝置還包括: 第二定義單元,用于使用所述T4模板定義所述目標代碼模板,其中,所述目標代碼模 板中包含至少一個屬性,其中,所述目標代碼模板中至少一個屬性在所述目標代碼模板中 使用不同的占位符替換。
【文檔編號】G06F9/44GK104267967SQ201410545965
【公開日】2015年1月7日 申請日期:2014年10月15日 優(yōu)先權(quán)日:2014年10月15日
【發(fā)明者】馬燕龍 申請人:北京國雙科技有限公司