有沒有研究過函式自動分解工具?把一個編程工程中的多個模塊中的每一個程序函式用代碼“分解”提取出來,把表單,模塊也分解出來。
目標就像是做一個把手機電路板的CPU,記憶體螢屏等自動拆解的智能機器人。
把編程的基礎元素提練出來,然后做高度整合,提高代碼復用率,表單,模塊做到一次撰寫永久使用的目的,達到1+1=2,2+2=4,100次之后那將是無窮大了。1+1+1+**,100次也只有100.如果你的工資這個月1萬,下個月2萬,那****
uj5u.com熱心網友回復:
英語中有一句諺語叫做No Silver Bullet,有一本書就叫這個,翻譯成中文叫做《沒有銀彈》這個“銀彈”可以指很多東西,包括lz說的這個。
uj5u.com熱心網友回復:
你拆一堆廢舊iphone5,這些零件可以組合出一臺可以用的iphone5。你拆一堆廢舊的note2,這些零件可以組合出一臺可以用的note2。
你把iPhone4和note2的零件堆在一起,你除了iphone5和note2之外并不能拼出新的機型。因為他們內部的介面、孔洞、尺寸都不是標準化的。除了自己的那一堆,和別家的不兼容,除非你對這些模塊進行修改。當然,并不排除有些相同的芯片可以互換使用,因為他們的輸入輸出相同、內部邏輯相同、外形尺寸相同……
我們的程式也一樣,你把你的函式原原本本的拷貝到別的工程里面立馬能用?除了一些標準的公共函式、API之類的可以替換,但是芯片可能壞了替換一下,代碼除非函式版本不同,要不然有啥好替換的。
uj5u.com熱心網友回復:
拆IPHONE5不能用于IHPONE8,這就像是VB6的代碼不能用于VB.NET。但是VB6相當于IPHONE5,所有的代碼可以互換。而且這個產品20幾年了一直活著。
當然也可以直接就上升到VB.NET,原理是一樣的。
寫一個代碼分析工具,把模塊拆解,再拆解函式,最后每一行的變數,字串全能識別出來。
就是想弄一個代碼工具,把一些網上下載的工程進行拆解,把有用的函式用起來,不過一般情況下,手工復制出來也夠用了。
想省點事
uj5u.com熱心網友回復:
比如下面的函式,怎么拆解出來分析。函式型別:SUB還是FUNCTION
有幾個引數,每個引數型別,是否有默認值,函式用了幾個變數
把函式整理成標準寫法格式,把所有的變數定義放在函式最前面。
怎么寫個代碼實作這個功能?
Private _
Function jia2(a As Long, _
ByVal b As Integer) As Long '加法 函式
jia = a + b: Dim k As Long: k = 3
Dim S: S = "中國人 " '88382':"
End _
Function
uj5u.com熱心網友回復:
把dim提前,給你寫了一段試試看。后來覺得只是提前太沒有意思了,把格式化縮進也給你做了個樣例。只是個例子,里面的關鍵字列得不全,需要的話自己再加。
假設你輸入的都是function 或者sub哈,其他的你自己添加代碼。
至于提取引數個數,懶得寫代碼了,就是第一行取()中間的部分用逗號split一下,再去逐個分析就了事了。
Option Explicit
Private Sub Command1_Click()
Dim strTest As String
strTest = strTest & " Private _" & vbCrLf
strTest = strTest & "Function jia2(a As Long, _" & vbCrLf
strTest = strTest & "ByVal b As Integer) As Long '加法 函式" & vbCrLf
strTest = strTest & " jia = a + b: Dim k As Long: k = 3" & vbCrLf
strTest = strTest & "Dim S: S = ""中國人 "" '88382':" & vbCrLf
strTest = strTest & "if 1=1 then" & vbCrLf
strTest = strTest & "for i = 1 to 100" & vbCrLf
strTest = strTest & "doevents:debug.print i " & vbCrLf
strTest = strTest & "next " & vbCrLf
strTest = strTest & "elseif 1=2 then " & vbCrLf
strTest = strTest & "doevents:debug.print i " & vbCrLf
strTest = strTest & "else " & vbCrLf
strTest = strTest & "doevents:debug.print i " & vbCrLf
strTest = strTest & "end if " & vbCrLf
strTest = strTest & "End _" & vbCrLf
strTest = strTest & "Function"
Debug.Print strTest
Debug.Print vbCrLf & "分隔線---------------------------" & vbCrLf
Debug.Print formatVBcode(strTest)
End Sub
Private Function formatVBcode(ByVal strin As String) As String
Dim strTmp As String
Dim aryTmp() As String
Dim colcode As New Collection
Dim i As Long, j As Long
Dim lngDimRow As Long, lngTabCnt As Long
Dim strTab As String
'去他媽的所有換行連接
strTmp = Replace(strin, " _" & vbCrLf, " ")
'去他媽的冒號并行,當然這邊可能把字串里面的冒號也折行了,自己改進一下吧。
strTmp = Replace(strTmp, ":", vbCrLf)
'按行拆分
aryTmp = Split(strTmp, vbCrLf)
'去空行,去前后空格,然后塞進我個人喜歡的集合
For i = LBound(aryTmp) To UBound(aryTmp)
If aryTmp(i) <> "" Then
colcode.Add Trim(aryTmp(i))
End If
Next
lngDimRow = 2
For i = 2 To colcode.Count - 1 '第一行和第二行懶得處理了,
If GetKeyWord(colcode(i)) = "DIM" Then '遇到dim,加挪到最前面去
colcode.Add colcode(i), , lngDimRow
colcode.Remove i + 1
End If
Next
'添加縮進,輸出
lngTabCnt = 1
formatVBcode = formatVBcode & Trim(colcode(1)) & vbCrLf
For i = 2 To colcode.Count - 1 '第一行和第二行懶得處理了,
strTab = Replace(Space(lngTabCnt * 4), " ", vbTab) '需要縮進的tab
If GetKeyWord(colcode(i)) = "IF" Or GetKeyWord(colcode(i)) = "FOR" Then '遇到 if 和 for 則后續的行家一格縮進 當然,還有其他關鍵字,自己添加,懶得寫了
formatVBcode = formatVBcode & strTab & colcode(i) & vbCrLf '本行加上縮進
lngTabCnt = lngTabCnt + 1
ElseIf GetKeyWord(colcode(i)) = "NEXT" Or GetKeyWord(colcode(i)) = "END" Then '本行及后續向前一格
lngTabCnt = lngTabCnt - 1
strTab = Replace(Space(lngTabCnt * 4), " ", vbTab)
formatVBcode = formatVBcode & strTab & colcode(i) & vbCrLf
ElseIf GetKeyWord(colcode(i)) = "ELSEIF" Or GetKeyWord(colcode(i)) = "ELSE" Then '本行及后續縮進不變
strTab = Replace(Space((lngTabCnt - 1) * 4), " ", vbTab)
formatVBcode = formatVBcode & strTab & colcode(i) & vbCrLf
Else
formatVBcode = formatVBcode & strTab & colcode(i) & vbCrLf
End If
Next
formatVBcode = formatVBcode & Trim(colcode(colcode.Count - 1))
End Function
Private Function GetKeyWord(strin As String)
Dim i As Integer
i = InStr(1, strin, " ")
If i > 1 Then
GetKeyWord = UCase(Left(strin, InStr(1, strin, " ") - 1))
Else
GetKeyWord = UCase(strin)
End If
End Function
uj5u.com熱心網友回復:
----
'去他媽的所有換行連接
strTmp = Replace(strin, " _" & vbCrLf, " ")
'去他媽的冒號并行,當然這邊可能把字串里面的冒號也折行了,自己改進一下吧
-------------
最難處理的就是換行連接符,如果他在注釋中咋弄?就會有幾行注釋。
另外我主要的難點不是代碼縮進。
本意是想直接在原來亂亂的格式下進行代碼決議:提取函式名,私有還是公用,有幾個引數,函式的型別是什么。(重點就是處理前面一行)
另外如果可行,能夠替換里面的內置函式或自定函式的呼叫就更強了。
主要是用于如果想升級工程,替換下一些舊函式,引數可能增加了,也可能變換了引數順序(原來引數3變成了“引數1”)
當然這就不是簡單的替換字串就能完成了。所以決議能力要比較強,我腦子短路了,不知咋實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/38740.html
標籤:VB基礎類
下一篇:關于sock連接
