Chinaunix
標題: 動詞算子式代碼生成器簡介【理論隨筆】 [打印本頁]
作者: jerry_shen 時間: 2018-06-04 10:58
標題: 動詞算子式代碼生成器簡介【理論隨筆】
本帖最后由 jerry_shen 于 2018-06-04 16:59 編輯
動詞算子式代碼生成器簡介 【理論隨筆】
動詞算子式代碼生成器具體說來就是無垠式/和平之翼代碼生成器陣列。是筆者所寫的一系列易用的Java通用代碼生成器。所有版本的動詞算子式代碼生成器都支持SGS(標準生成器腳本)語言。新版本的動詞算子式代碼生成器支持使用Excel模板生成Java項目。(包括無垠式代碼代碼生成器SimpleJEE 1.0.1版Ada,無垠式代碼生成器JEEEU版1.5 Beta6 Ada,和平之翼代碼生成器SMEU版 3.1 烏篷船)
動詞算子式生成器的主要概念是動詞算子,域?qū)ο蠛屠庵?
動詞算子其實是功能的代名詞,比如有一個動詞算子稱為ListAll,它會列出一個數(shù)據(jù)對象在數(shù)據(jù)庫里的所有實例。所以ListAll動詞算子和域?qū)ο骃tudent的結合會產(chǎn)生一個具體的方法組ListAllStudents。它包括Dao,DaoImpl,Service, ServiceImpl, Facade和HTML5頁面上的兩個JS方法。這個方法組即是代碼生成的目標。
棱柱是圍繞一個域?qū)ο蟮乃袆釉~算子的功能的組合。如一個域?qū)ο骃tudent,它對應的棱柱StudentPrism包含十余個動詞如ListAll,Delete,SoftDelete,SearchByFieldsByPage等等,一個棱柱包含若干界面和驅(qū)動其所有界面的代碼邏輯。
動詞算子式代碼生成器生成是不需要數(shù)據(jù)庫連接,它可以生成所有的數(shù)據(jù)庫腳本,您可以將生成的zip包導入Eclipse JEE版進行進一步的功能代碼開發(fā)。
如此易用的Java代碼生成器您值得一試。
以下是主要的代碼生成器的項目地址,敬請您的到來。
https://gitee.com/jerryshensjf/InfinityJEEEU
https://gitee.com/jerryshensjf/InfinitySimpleJEE
https://gitee.com/jerryshensjf/PeaceWingSMEU
https://gitee.com/jerryshensjf/InfinityGPGenerator
作者: jerry_shen 時間: 2018-06-04 10:58
代碼生成器技術亂彈一,多對多關系與雙域動詞
在動詞算子式代碼生成器(無垠式代碼生成器,和平之翼代碼生成器)中的中心概念是如下三種,動詞算子,域?qū)ο蠛屠庵。本文主要分析如下技術場景,使用上述概念分析和實現(xiàn)代碼生成器中的多對多關系。
我們知道,大多數(shù)代碼生成器生成的功能大家都稱之為單表操作,在動詞算子式代碼生成器中有一個對應的概念稱為單域動詞。在和平之翼代碼生成器1.5實現(xiàn)多對多關系以前,所有的動詞算子式代碼生成器只支持單域動詞,也就是說和現(xiàn)在大多數(shù)代碼生成器是一樣的。多對多關系為何不同?
原因是多對多關系不是單表操作,而是一種雙表操作。使用動詞算子式代碼生成器的術語,這是一種雙域動詞。描述了主域?qū)ο蠛蛷挠驅(qū)ο笾g的關系。具體說來為了實現(xiàn)兩個對象之間的多對多關系,在和平之翼代碼生成器1.5和以后的其它實現(xiàn)中,都實現(xiàn)了如下四個雙域動詞:ListMy,ListMyAvailable,Assign和Revoke,和單域動詞不同,單域動詞只屬于其域?qū)ο蟮睦庵,而雙域動詞關系到兩個棱柱。比如對域?qū)ο骍ser而言,ListAll單域動詞明顯屬于UserPrism棱柱。而User和Role之間的多對多關系應該屬于User Prism還是RolePrism? 答案很簡單,看誰是主域?qū)ο,誰是從域?qū)ο蟆H绻鸘ser是主域?qū)ο,動詞分別結合為ListMyRolesByUserId,ListMyAvailableRolesByUserId, AssginRolesToUser,RevokeRolesFromUser,這時很明顯這些功能都從屬于UserPrism。
從理論上說,多對多關系意味者兩個數(shù)據(jù)對象之間存在著一張聯(lián)系表,其聯(lián)合主鍵是兩個對象的主鍵。在動詞算子式代碼生成器中,主鍵即所有域?qū)ο蠖加械膁omainid字段。所以很容易構造出兩個域?qū)ο笾g的多對多關系。
對多對多的典型三欄式多對多單頁式彈性界面如圖所示,使用了一個單域動詞和4個雙域動詞。
如圖:
左側(cè)的User列表框是User域?qū)ο蟮腖istActive單域動詞驅(qū)動的。中間的列表框,是ListMy雙域動詞。右側(cè)的列表框是ListMyAvailable雙域動詞驅(qū)動的。中間和右側(cè)列表框之間的兩個按鈕,是Assign和Revoke雙域動詞驅(qū)動的。一目了然,非常清晰,希望您可以理解。
作者: jerry_shen 時間: 2018-06-04 10:59
代碼生成器技術亂彈二,一對多關系的分析與實現(xiàn)
類似多對多關系,其實一對多關系也是兩個域?qū)ο笾g的關系。一個域?qū)ο蟮腎d記錄在其他域?qū)ο笾写泶擞驅(qū)ο蟮乃行畔ⅰ?
但是與多對多關系必須依賴雙域動詞不同,一對多關系可以使用兩個單域動詞來完成需要的功能。
可以做如下分析。
在我實現(xiàn)的動詞算子式代碼生成器中所有域?qū)ο蠖即嬖谌齻特殊字段:domainid,domainname,activefield即域?qū)ο蟮闹麈I,域?qū)ο髽藴拭趾陀驅(qū)ο蠡钴S字段(可以看作反置的軟刪除標志,如果此字段被命名為deleted或delete時,系統(tǒng)會自動使用軟刪除標志的語義)。一對多關系要解決的是如下兩個問題:輸入或查詢字段時候變成下拉列表,在Grid字段里使用domainname代替數(shù)據(jù)庫里實際保存的domainid值。
解決這個問題有兩種思路,使用聯(lián)合查詢或者使用兩次查詢。實際上在現(xiàn)有的動詞算子式代碼生成器的實現(xiàn)采用的是兩次查詢,把完整的動作拆成兩部,采用單域動詞實現(xiàn)。第一步是把主域?qū)ο蟛樵兂鰜恚梢允褂肔istAll,ListActive,ListAllByPage或者是最新的主查詢SearchByFieldsByPage。然后使用從域?qū)ο蟮腖istActive單域動詞將活躍的domainid翻譯成domainname。下拉列表中的所有從域?qū)ο笄鍐味际荓istActive單域動詞列出來的。
作者: jerry_shen 時間: 2018-06-04 10:59
代碼生成器技術亂彈三,所有字段搜索的主查詢SearchByFieldsByPage
對動詞算子式代碼生成器有所了解的同學都知道,動詞算子式代碼生成器有過兩種界面,手寫的藍白兩色的界面和后來的JQuery EasyUI界面。兩者其實是不同的,支持的功能也并不完全一致。藍白界面或者我們稱之為經(jīng)典界面支持如下的動詞:ListAllByPage,SearchByName,Add,Update,Delete,SoftDelete,DeleteAll和SoftDeleteAll。而新的EasyUI界面支持更多的動詞,如下SearchByFieldsByPage,Add,Update,Delete,SoftDelete,DeleteAll,SoftDeleteAll,Toggle和ToggleOne。
很明顯最大的不同是新的界面采用了所有字段的查詢動詞SearchByFieldsByPage,代替了原有實現(xiàn)中的ListAllByPage和SearchByName兩個動詞。這個動詞是現(xiàn)有所有動詞中最復雜和最難開發(fā)的動詞。本文著重分析這個動詞的實現(xiàn)。
很直觀,這個動詞的場景如下:當頁面加載時,相當于不加任何限制條件查詢某域?qū)ο蟮臄?shù)據(jù)庫表,應該返回所有表中的數(shù)據(jù),這種情況下,返回的數(shù)據(jù)其實和ListAllByPage是完全一致的。而如果查詢domainname,這時返回的結果是和SearchByNameByPage是一致的。但是新的主查詢支持對更多字段的查詢。
這個動詞的難點是要生成正確的動態(tài)的查詢語句,并以正確的順序和數(shù)量設置查詢鍵值并返回結果。在其MyBati實現(xiàn)和JDBC實現(xiàn)中都使用了類似技術。
關鍵是要對字段逐一判斷其是否為空,如果為空,就不生成相應字段的查詢和設置鍵值的兩段操作。值得注意的是這兩段查詢的位置順序和判斷空的條件必須完全匹配,否則會出現(xiàn)千奇百怪的錯誤。
在我的實現(xiàn)中查詢邏輯是和字段的類型綁定在一起的,是String類型進行l(wèi)ike查詢,其他字段進行相等查詢。實現(xiàn)的結果您可以參考代碼生成器的生成物或者代碼生成器本身的源碼。
作者: jerry_shen 時間: 2018-06-04 11:00
代碼生成器技術亂彈四,彈性萬能界面
在代碼生成器的實現(xiàn)中,有一個問題也是制約大家能否研發(fā)出代碼生成器的關鍵之一。那就是界面。大家知道代碼生成器是有一定靈活性的。如果一個代碼生成器不能指定數(shù)據(jù)對象的字段,所有的關系都是僵死的,這樣的代碼生成器相信不會有太多用戶,所以,代碼生成器需要有一定的彈性。
在動詞算子式代碼生成器中,解決這個問題的是使用了我稱之為彈性萬能界面的技術,或者更準確的說是單頁式彈性萬能界面。
在動詞算子式代碼生成器中有三個特殊字段domainid,domainname和activefield。而彈性萬能界面也有三個,主頁模板基本上沒有功能,單表操作的Grid單頁式彈性萬能界面和專用于多對多關系的三欄式多對多彈性萬能界面。
可以做如下分析,彈性萬能界面最大的問題在于,如何處理不同對象的不同的字段。動詞算子式代碼生成器的解決方案是把變化集中于域?qū)ο。對域(qū)ο蠖詆etDomainId返回主鍵,getDomainName返回域?qū)ο蟮臉藴拭,getFields返回所有字段,getFieldsWithoutId返回除了主鍵的所有其他字段。如此等等,有了這些方法,您就可以賦予界面以彈性。
下圖是Grid彈性萬能界面的截圖:
下圖是多對多彈性萬能界面的截圖:

作者: jerry_shen 時間: 2018-06-04 11:00
代碼生成器技術亂彈五,動詞算子淺析
無垠式和和平之翼代碼生成器統(tǒng)稱為動詞算子式代碼生成器。您是否知道為什么這類型的代碼生成器稱為動詞算子式代碼生成器?這里的主要問題是什么是動詞算子。我們知道,所謂程序大師們給了一個公式:
程序=數(shù)據(jù)結構+算法
而我可以給一個公式,在動詞算子式代碼生成器中:
程序=域?qū)ο?動詞算子
也就是說,動詞算子在某種程度上是算法的等價物。
那么,到底什么是動詞算子,我的定義是動詞算子是一組命名的函數(shù)級代碼生成器堆棧。也就是說動詞算子一旦和相應的域?qū)ο蠼Y合(如果是單域動詞就是一個動詞算子和一個域?qū)ο蠼Y合,如果是雙域動詞,是一個動詞算子和兩個域?qū)ο蠼Y合)。生成的結果是一個完整的方法堆棧包括了指定動詞的Dao,DaoImpl,Service,ServiceImpl,F(xiàn)acade和JSButton和JSJsonAction的一系列方法。包括5個java方法和兩個JavaScript方法。
為何如此?答案是標準化,固定化以簡化測試,降低通透測試需要的測試量。本質(zhì)上,函數(shù)調(diào)用是一張網(wǎng),一個函數(shù)可以調(diào)另一個函數(shù)。這是叫測試人員抓狂的測試工作量之網(wǎng)。不能這樣干否則您的測試人員或者用戶會把您吃了。所以我的解決方法是把某個函數(shù)固定搭配起來,比如ListAll的Facade方法只能調(diào)用LIstAll的ServiceImpl的方法,而ListAll的ServiceImpl也只能調(diào)用List All的DaoImpl方法,不知您編寫過讓人抓狂的方法調(diào)用Controller的DoGet方法調(diào)用ServiceImpl的listAllStudents方法,ServiceImpl的listAllStudents方法里調(diào)用queryAllPuple方法,而頁面上的js方法叫另外一個古怪的方法。這是程序員的地獄。在動詞算子式代碼生成器中,命名是很有規(guī)律的。
世界清靜了?沒這么簡單,曾經(jīng),在無垠式代碼生成器0.8以前。ListAll里面的方法永遠是一致的,一個已經(jīng)失落的程序員的天堂,為什么?因為有時和技術的綁定的關系。
在和平之翼代碼生成器中,動詞算子SearchByFieldsByPage就是一個例子,比如它和student的結合在Facade層稱為SearchStudentsByFieldsByPage,但是問題是分頁查詢,mysql里是limit ? offset ?,參數(shù)不對ByPage里是pagenum和pagesize不是這兩個參數(shù)。所以需要把pagenum和pagesize換成limit和offset。我的解決方案是其dao和daoimpl的方法名是SearchStudentsByFieldsByLimit。一個動詞算子的各層的名字不一致了。我也沒辦法,網(wǎng)狀的調(diào)用模型在暗笑。
作者: jerry_shen 時間: 2018-06-04 11:01
代碼生成器技術亂彈六,編譯器在拈花微笑
到底什么是代碼生成器,如何驅(qū)動代碼生成器?這個問題不能一概而論,各家的做法也很不一致。有使用XML的,有使用JSON的,有使用SQL的,更多的,是采用圖形界面操作的,定義數(shù)據(jù)對象,定義施加在這些操作對象上的各種操作,有時非常繁瑣,有時非常易錯。在我得到的唯一付費的代碼生成器研發(fā)工作期間,我被授命開發(fā)一種"無碼開發(fā)“的代碼生成器。
我的看法是,代碼生成器是一種生成力很高,但是表現(xiàn)力受限的編譯器。和大多數(shù)代碼生成器一樣。動詞算子式代碼生成器也是基于模板法的。但是如果您研究過這些代碼生成器,您可以發(fā)現(xiàn),它們是一種數(shù)據(jù)中心的代碼生成器,不需要定義施加在數(shù)據(jù)即上的操作,只需要定義數(shù)據(jù),也就是域?qū)ο螅陀驅(qū)ο笾g的關系,即可生成一個可以運作的系統(tǒng)。而且,不同的動詞算子式代碼生成器的架構很不相同,大概有近10種不同的架構。但是這些代碼生成器支持的標準生成器腳本(SGS)卻十分相似,在很多情況下,您只需要修改一下項目的technicalstack字段,比如從smeu改成jeeu。生成的代碼就從Spring, Mybatis變成了html5,JDBC的了。
為什么是這樣?其實也很簡單,這是編程的普遍規(guī)律。使用代碼生成器的動機是什么,當然是省力。如何才能省力,當然是使用的工具高級。我有一比,在使用高級語言之前,程序員們使用的是匯編語言。工作量之艱巨叫現(xiàn)代人抓狂。據(jù)說,蘇聯(lián)人使用匯編語言編寫了他們的巡洋艦的驅(qū)動代碼110K,這是一個壯舉,但也是成本高昂的。為啥匯編語言這么難寫,易錯,不易調(diào)試?我認為是其中的細節(jié)太多了,一種語言表現(xiàn)力越強,功能越強,其運用的難度,學習的難度,必然提高。就像一個雕塑家雕一座雕像,他必然是先用斧子,錘子等重工具把石頭大致砍成基礎的形狀再使用刻刀的。在匯編語言時代,程序員就是面臨著使用刻刀雕刻一尊雕像的煩惱。而代碼生成器就是程序員的開山斧,是程序開發(fā)初期的利器。
所以,代碼生成器必須比高級語言生成力更高,否則,您為何要使用它呢?有沒有辦法?也很簡單,約定優(yōu)先于配置,簡化關系的描述,最重要的,就是數(shù)據(jù)驅(qū)動,把程序?qū)Σ僮鞯拿枥L,盡可能省略掉。我對此的理解是,需要使用一種生產(chǎn)力比高級語言高10倍乃至于100倍的超級語言驅(qū)動代碼生成器,代碼生成器才有真正的意義,F(xiàn)在動詞算子式代碼生成器使用的是一種稱為標準生成器腳本(SGS)的自定義語言,非常簡略和高效,并有可以使用與此種語言等效的Excel模板來生成代碼的選項。
超級語言還是一種編程語言,還是跳不出編譯器的五指山。所以,編譯器在拈花微笑。
作者: jerry_shen 時間: 2018-06-04 11:36
代碼生成器技術亂彈三,所有字段搜索的主查詢SearchByFieldsByPage
對動詞算子式代碼生成器有所了解的同學都知道,動詞算子式代碼生成器有過兩種界面,手寫的藍白兩色的界面和后來的JQuery EasyUI界面。兩者其實是不同的,支持的功能也并不完全一致。藍白界面或者我們稱之為經(jīng)典界面支持如下的動詞:ListAllByPage,SearchByName,Add,Update,Delete,SoftDelete,DeleteAll和SoftDeleteAll。而新的EasyUI界面支持更多的動詞,如下SearchByFieldsByPage,Add,Update,Delete,SoftDelete,DeleteAll,SoftDeleteAll,Toggle和ToggleOne。
很明顯最大的不同是新的界面采用了所有字段的查詢動詞SearchByFieldsByPage,代替了原有實現(xiàn)中的ListAllByPage和SearchByName兩個動詞。這個動詞是現(xiàn)有所有動詞中最復雜和最難開發(fā)的動詞。本文著重分析這個動詞的實現(xiàn)。
很直觀,這個動詞的場景如下:當頁面加載時,相當于不加任何限制條件查詢某域?qū)ο蟮臄?shù)據(jù)庫表,應該返回所有表中的數(shù)據(jù),這種情況下,返回的數(shù)據(jù)其實和ListAllByPage是完全一致的。而如果查詢domainname,這時返回的結果是和SearchByNameByPage是一致的。但是新的主查詢支持對更多字段的查詢。
這個動詞的難點是要生成正確的動態(tài)的查詢語句,并以正確的順序和數(shù)量設置查詢鍵值并返回結果。在其MyBati實現(xiàn)和JDBC實現(xiàn)中都使用了類似技術。
關鍵是要對字段逐一判斷其是否為空,如果為空,就不生成相應字段的查詢和設置鍵值的兩段操作。值得注意的是這兩段查詢的位置順序和判斷空的條件必須完全匹配,否則會出現(xiàn)千奇百怪的錯誤。
在我的實現(xiàn)中查詢邏輯是和字段的類型綁定在一起的,是String類型進行l(wèi)ike查詢,其他字段進行相等查詢。實現(xiàn)的結果您可以參考代碼生成器的生成物或者代碼生成器本身的源碼。
作者: jerry_shen 時間: 2018-06-04 13:16
本帖最后由 jerry_shen 于 2018-06-05 09:34 編輯
代碼生成器技術亂彈七,動詞算子式代碼生成器的透明性
動詞算子式代碼生成器的原理和人類手寫編程一模一樣?梢院腿魏慰蚣艽钆洌灰愀铝松善鲀(nèi)部的動詞和配置文件,就可以生成任意代碼。您有興趣可以仔細檢查無垠式/和平之翼代碼生成器陣列中的任何一個代碼生成器,它們都不會添加任何筆者自己寫的Jar包,您甚至可以手動移除代碼生成物中的jar包,再手工添加,如果您添加的jar是兼容的,代碼生成物即可運行,完全是透明的。
作者: jerry_shen 時間: 2018-06-05 09:37
本帖最后由 jerry_shen 于 2018-06-07 09:05 編輯
代碼生成器技術亂彈八,系統(tǒng)族與笛卡爾空間
大家認為代碼生成器是一個神奇的東西,有些人認為它是一種類似于傳說中的阿拉丁神燈之類的魔幻工具,您只需要對神燈下達命令,就會有一個燈神出來,為您寫好您需要的程序,這種神奇東西是存在的,只是您光使用代碼生成器還是不夠的。一個寫程序的神燈不是代碼生成器,而是一個程序員配上一套很好的代碼生成器軟件。
好了,玩笑說完,我們談論一下真實的代碼生成器,在代碼生成器研發(fā)的歷史上,有一本書叫做《產(chǎn)生式編程》是一組德國人寫的,他們沒有寫出可用的代碼生成器,但是卻整出了代碼生成器的理論。我2004年買過這本書,而無垠式代碼生成器是2014年得到可用的系統(tǒng)的。在這期間,曾經(jīng)瀏覽過這本厚厚的書。
書中對工業(yè)化,流水線,自動化生產(chǎn)提供了很好的思路和史實。其中提到了系統(tǒng)組的思想。在代碼生成器實現(xiàn)以后,我發(fā)現(xiàn)其中代碼生成器的能力其實可以用系統(tǒng)族和系統(tǒng)族的迪卡兒空間表示,一個代碼生成器可以產(chǎn)生的系統(tǒng)族的笛卡爾空間越大,其能力就越強。
系統(tǒng)族是可以使用其動詞算子的數(shù)量和域?qū)ο髮ψ侄蜗拗频某潭葍蓚維度表示。在最新的無垠式代碼生成器JEEEU版1.5中。共有ListAll, ListActive, SearchByFieldsByPage, SoftDelete, Delete, Add, Update, DeleteAll, SoftDeleteAll, Toggle, ToggleOne 11個單域動詞和幾個不完全的輔助性動詞和ListMyActive, ListMyAvailableActive, Assign , Revoke四個雙域動詞組成。而域?qū)ο鬀]有明確的字段限制只是要求每個域?qū)ο蟊仨毦哂衐omainid,domainname,activefield 三個特殊字段。
這約20個動詞和域?qū)ο蟮目勺冃砸约坝驅(qū)ο笾g的一對多和多對多關系。動詞算子式代碼生成器的變幻的笛卡爾空間是足夠強大的。你只需要寫下您的域?qū)ο笄鍐魏退麄兊囊?guī)約,當然,不要忘了對它說一聲call magic,你就可以得到系統(tǒng)族的饋贈,一個可以運行的一個子系統(tǒng)。
代碼生成器的生成空間就是代碼生成器能生成的所有子系統(tǒng)的空間之和。也就是代碼生成器的笛卡爾空間。根據(jù)上面的分析,無垠式代碼生成器JEEEU版Ada 1.5的生成空間為(N-3)×20×3,我們可以簡單記為60N,為字段,動詞算子和關系三者的笛卡兒積。和平之翼代碼生成器SMEU版3.1 烏篷船的生成空間為(N-3)×20×3×2,我們可以簡記為120N,為字段,動詞算子,關系和數(shù)據(jù)庫類型四者的笛卡爾積。讓我們?nèi)翰呷毫,開發(fā)1000N級別(或者可以稱之為1000倍率)的代碼生成器吧。
作者: jerry_shen 時間: 2018-06-06 20:47
本帖最后由 jerry_shen 于 2018-06-08 11:26 編輯
代碼生成器技術亂彈九,代碼變變變,代碼生成器之度量
代碼生成器是一種具有強大變形能力的編程工具,現(xiàn)在國內(nèi)的代碼生成器已經(jīng)非常多了,如此形形色色的代碼生成器究竟有沒有一個客觀的標準來衡量不同的代碼生成器的代碼生成能力呢?
我認為衡量代碼生成器變形能力的客觀標準是存在的,這就是一個代碼生成器所能夠生成的所有子系統(tǒng)的代碼空間之和,或稱為一個代碼生成器的笛卡爾空間或生成空間?紤]到一個待生成的系統(tǒng)的字段總數(shù)是N個字段,我們來算一下動詞算子式代碼生成器的生成笛卡爾空間。
代碼生成器的生成空間就是代碼生成器能生成的所有子系統(tǒng)的空間之和。也就是代碼生成器的笛卡爾空間。根據(jù)上面的分析,無垠式代碼生成器JEEEU版Ada 1.5的生成空間為(N-3)×20×3,我們可以簡單記為60N,為字段,動詞算子和關系三者的笛卡兒積。和平之翼代碼生成器SMEU版3.1 烏篷船的生成空間為(N-3)×20×3×2,我們可以簡記為120N,為字段,動詞算子,關系和數(shù)據(jù)庫類型四者的笛卡爾積。很顯然,源代碼沒有變形能力,所以,源代碼的生成笛卡爾空間為 1N。當然,如果某個源代碼同時支持Mysql和Oracle兩種數(shù)據(jù)庫,根據(jù)上面的分析,他的笛卡爾生成空間是2N。
讓我們?nèi)翰呷毫Γ_發(fā)1000N級別(或者可以稱之為1000倍率)的代碼生成器吧。所有SGS(標準生成器腳本)體系的笛卡爾空間考慮到動詞算子式代碼生成器大概有十來種架構,如果每一種架構的笛卡爾空間是60N,總空間大概是600N,就是有600倍率的變形能力。
作者: jerry_shen 時間: 2018-09-30 17:20
本帖最后由 jerry_shen 于 2018-09-30 22:31 編輯
代碼生成器技術亂彈十一,伽羅華理論與代碼生成
最近,看到了最悲劇的天才數(shù)學家伽羅華的際遇及其群論的思想。發(fā)現(xiàn)群論可以成為代碼生成器理論的數(shù)學基礎。
以群論的語言,代碼生成笛卡爾空間就是代碼生成置換群,定義在此群上的算子不是四則混合運算,而是動詞算子,是ListAll,ListAllByPage,ListActive,FindById,FindByName,SearchByName,SearchByFieldsByPage,Delete,DeleteAll, SoftDelete,SoftDeleteAll,Toggle,ToggleOne,Update。只要Domain的有限集即代碼生成伽羅華域上此置換群不會產(chǎn)生邏輯矛盾。對群論理解尚淺,故記下以備忘。
可以認為,代碼生成器置換群上定義的算子即運算越多,此置換群的空間越大,能力也越強。故引入群論或者說組合數(shù)學的理論基礎,有助于使代碼生成器的基礎理論成為有數(shù)學基礎的一門科學。
伽羅華生于1811年,故以亂彈十一為紀念。
代碼生成器的基礎理論需要解決的問題。
為什么代碼生成器能夠工作?
哪些動詞在整個置換群上是正確的,那些在一定條件下是正確的?哪些會引入錯誤?
在整個代碼生成器空間都正確的動詞算子的約束條件。
哪些動詞有內(nèi)在矛盾,是包含錯誤的?
代碼生成空間的域?qū)ο蟮囊?guī)則是什么?
代碼生成器的極限在哪里?
存在多少個代碼生成器空間?
想到哪寫到哪,備忘。
作者: jerry_shen 時間: 2018-11-05 14:25
本帖最后由 jerry_shen 于 2018-11-05 20:50 編輯
代碼生成器技術亂彈十,動詞與多維空間,動詞變格理論簡述
在動詞算子式代碼生成器中,有若干遵循的基本設計準則,簡述如下:
- 動詞算子化
- 動詞變格理論
- 面向棱柱
- 超級語言驅(qū)動
- 技術棧中立
- 超泛型實現(xiàn)
- 一次編程,兩處調(diào)試
- 內(nèi)置代碼模板,經(jīng)過詳細測試,代碼模板不開放,通過版本更新和代碼生成器分支來支持新功能。
現(xiàn)在我們詳細分析一下其中的第二項:動詞變格理論。
其理念如下,在代碼生成的多維笛卡爾空間,存在著某個抽象的動詞算子比如說是ListAll,它在多維空間的投影產(chǎn)生出比如DaoImpl,Dao,ServiceImpl,Service,F(xiàn)acade,JSAction和JSButton這7個動詞算子的影子。在和某個域?qū)ο蟊热缯f是Student結合以后,會形成7個具體的ListAllStudents函數(shù)。
這種現(xiàn)象非常類似于英語中的時態(tài)變化或者說是動詞變格,所以這種代碼生成器的設計被稱為動詞變格理論。就比如所對英語動詞Have來說,Has, Had和Haven是動詞have的變格,上述我們對動詞算子ListAll的分析發(fā)現(xiàn),在和平之翼代碼生成器中,動詞算子一共有7個格。動詞中,擁有7個格的形態(tài)的動詞算子是全棧動詞,而部分動詞格缺失的動詞算子是非全棧動詞。
為什么這么設計,這是為了標準化和簡化不同層級的函數(shù)的調(diào)用關系,并簡化代碼調(diào)用之網(wǎng)。從而降低開發(fā)時的測試工作量和代碼生成器的品質(zhì)。
您有何種看法?歡迎跟帖。
作者: jerry_shen 時間: 2018-11-06 17:34
代碼生成器技術亂彈十二,步槍,T型車到代碼生成器,模板法的工業(yè)魔術
在《產(chǎn)生式編程》一書中,作者帶我們重述歷史,去探尋自動化的緣起。人類歷史上第一種工業(yè)化產(chǎn)品,沒錯,是一種武器。19世紀,美國生產(chǎn)出人類歷史上第一種真正工業(yè)化的產(chǎn)品,一種可以互換零件使用的步槍。這是一次技術革命,從此,制品有了型號,標準,公差,互換零件等等一系列手工制作階段沒有的嶄新概念。一種互換零件的步槍的強大之處之一是你可以從兩把爛步槍湊出一把好步槍。這是從來沒有過的事情。這其實就是模板法第一次展現(xiàn)它的工業(yè)魔術。
而后,福特的T型車是模板法的第二次魔法,第一次人類歷史上出現(xiàn)了生產(chǎn)流水線的概念。在互換零件的步槍的裝配時還沒有生產(chǎn)流水線,也許是因為步槍比較輕,不需要太多力氣就可以搬動。而汽車的生產(chǎn),流水線的使用可以大幅度提高效率。
代碼生成器時代,其實,形形色色的代碼生成器都是模板法的杰作,他們帶來了工業(yè)化編程方式。動詞算子是代碼生成器也是基于模板法的。但是,動詞算子式代碼生成器的模板是切成原子化的Verb的。只有一個域?qū)ο蠼Y合了恰當?shù)膭釉~算子,它才能生成具體的代碼。動詞算子其實是一組函數(shù)級代碼生成器,只需結合恰當?shù)挠驅(qū)ο,就可以生成具體的函數(shù)。而且,域?qū)ο笠脖粚訉忧虚_,分成了Type,F(xiàn)ield ,Var,Signature等等。這些東西在動詞算子式代碼生成器中統(tǒng)一稱為化身變量。動詞算子式代碼生成器就是靠徹底分解和重新組合擁有了代碼生成的魔力的。
根據(jù)動詞算子式代碼生成器的設計哲學。從系統(tǒng)層面,只存在著域?qū)ο,名詞和各種動詞算子,模板法是具體的實現(xiàn)機制,是被屏蔽的。所以動詞算子式代碼生成器的模板是藏起來的,實現(xiàn)新功能,您就等著新版本和新分支吧。沒有合適的話,您不妨自己分支一個。
歡迎大家的看法和意見。
歡迎光臨 Chinaunix (http://72891.cn/) |
Powered by Discuz! X3.2 |