高階軟體工程總結 SA20225470 韋懿
在本學期的高軟課程中,我一共完成了五個實驗:
1.VSCode 主要是快捷鍵的使用
2.Git及其常用場景
3.正則表示式的使用
4.使用VSCode中的draw.io畫UML用例圖
5.實驗驗證軟體中的一些特殊機制
1VSCode快捷鍵
- Ctrl/⌘+Shift+E 檔案資源管理器
- Ctrl+Shift+G 原始碼管理
- Ctrl/⌘+Shift+F 跨檔案搜尋
- Ctrl/⌘+Shift+D 啟動和除錯
- Ctrl/⌘+Shift+P 查詢並執行所有命令
- Ctrl/⌘+Shift+M 檢視錯誤和警告
- Ctrl/⌘+Shift+X 管理擴充套件外掛
- Ctrl+` 切換整合終端
- Ctrl/⌘+O 開啟資料夾
- Ctrl/⌘+N 新建檔案
- Ctrl/⌘+S 儲存檔案
- Ctrl/⌘+F搜尋
- Ctrl+1、2、3… 選中某個檔案編輯器
2git
2.1Git 本地版本庫用法參考
git init # 初始化一個本地版本庫 git status # 檢視當前工作區(workspace)的狀態 git add [FILES] # 把檔案新增到暫存區(Index) git commit -m "wrote a commit log infro” # 把暫存區裡的檔案提交到倉庫 git log # 檢視當前HEAD之前的提交記錄,便於回到過去 git reset —hard HEAD^^/HEAD~100/commit-id/commit-id的頭幾個字元 # 回退 git reflog # 可以檢視當前HEAD之後的提交記錄,便於回到未來 git reset —hard commit-id/commit-id的頭幾個字元 # 回退
2.2Git 遠端版本庫用法參考
git remote管理本地版本庫跟蹤的遠端儲存庫的命令 git fetch git push git clone git pull(拉取)是實際上是 git fetch + git merge
同步操作
git pull git push
合併分支原理
Git版本管理的基礎,是按行對比(line diff)將差異的部分作為一個增量補丁,通過git add新增到暫存區裡的每一個檔案都會由line diff得到該檔案的增量補丁,而git commit將暫存區裡的所有檔案的增量補丁合併起來存入倉庫就是一個commit。
2.3團隊專案中的分叉合併
git checkout -b mybranch 建立分支 git branch 檢視分支列表 git merge mybranch 合併mybranch分支到當前的master分支 git merge --no-ff mybranch 合併後保留分支
團隊專案工作流程參考
1、克隆或同步最新的程式碼到本地儲存庫;
git clone https://DOMAIN_NAME/YOUR_NAME/REPO_NAME.git git pull
2、為自己的工作建立一個分支,該分支應該只負責單一功能模組或程式碼模組的版本控制;
git checkout -b mybranch git branch
3、在該分支上完成某單一功能模組或程式碼模組的開發工作;多次進行如下操作:
git add FILES git commit -m "commit log"
4、最後,先切換回master分支,將遠端origin/master同步最新到本地儲存庫,再合併mybranch到master分支,推送到遠端origin/master之後即完成了一項開發工作。
git checkout master git pull git merge --no-ff mybranch git push
2.4Git Rebase
如果你想讓"mywork"分支歷史看起來像沒有經過任何合併一樣
$ git checkout mywork $ git rebase origin
http://gitbook.liuhui998.com/4_2.html
2.5Fork + Pull request
3正則表示式
匹配多個字元 |
區分大小寫
VSCode 預設忽略大小寫 Alt+C設定
vim 預設大小寫敏感 set ignorecase 設定為忽略大小寫;通過:set noignorecase 恢復到大小寫敏感的狀態。\c 表示大小寫不敏感,\C 表示大小寫敏感,比如/ignorecase\c
萬用字元的基本用法
萬用字元“.”將匹配任意一個字元。萬用字元也可稱為 dot 和 period。你可以像正則表示式中的任何其他字元一樣使用萬用字元。例如,如果你想匹配“hug”,“huh”,“hut”和“hum”,可以使用正則表示式hu.來匹配這所有四個字串。 萬用字元“+”用來查找出現一次或多次的字元,例如hahhhhh,可以使用正則表示式hah+來匹配。 萬用字元“*”匹配零次或多次出現的字元,使用正則表示式hah*來匹配,還可以匹配ha字串。 萬用字元“?”指定可能存在的元素,也就是檢查前一個元素存在與否,如正則表示式colou?r、favou?rite中萬用字元“?”前面的u字元存在和不存在兩種情況的字串都會匹配。
{}的使用
要匹配字串"aaah"中出現 3 到 5 次的 a,你的正則表示式將是a{3,5}h; 僅匹配字串"haaah"與至少出現 3 次的字母 a,正則表示式將是/ha{3,}h; 為了僅匹配"hah"中出現 3 次的字母 a,你的正則表示式將是/ha{3}h。
匹配具有多種可能性的字符集
[] 你要匹配"bag","big"和"bug",而不是"bog"。你可以建立正則表示式/b[aiu]g 來執行此操作 - 字符集[0-5]匹配 0 和 5 之間的所有數字,包括 0 和 5。 ^ [^aeiou]排除母音的所有字元。
貪婪匹配 vs. 懶惰匹配
正則表示式預設貪婪匹配,即匹配最長字串
?可以改為懶惰匹配 例如:t[a-z]*?i正則表示式會返回["ti"]
一些特殊位置和特殊字元
插入字元“^”用於表示字串的開頭。 美元字元“$”表示字串的末尾。
如在"Ricky is first and can be found”查詢開頭的 Ricky 則為^Ricky,查詢結尾的 found 則為/found$
可以使用\s 搜尋空格,這是一個小寫的 s 即 space 之意。此模式不僅匹配空格,還包括回車、製表符、換頁和新行字元。你可以將其看作與字符集[\r\t\f\n\v]類似。 使用\S 搜尋非空格,這是一個大寫的 S。此模式將不匹配空格、回車符、製表符、換頁和新行字元。你可以想象它類似於字元類[^\r\t\f\n\v]。
捕獲組
匹配字串中連續出現三次的數字,每個數字由空格分隔,如(\d+)\s\1\s\1。
Vim 中基本的字串搜尋替換方法
:n1,n2s/word1/word2/g,以:開頭,n1 與 n2 為數字,即在第 n1 與 n2 行之間尋找 word1 這個字串,並將該字串取代為 word2 字串 其中 s 是 substitute 的簡寫,表示執行替換字串操作;最後的/g 是 global 的簡寫,表示全域性替換。另外與/g 的用法相似,/c 是 comfirm 的簡寫,表示操作時需要確認;/i 是 ignorecase 的簡寫,表示不區分大小寫。
在 100 到 200 行之間搜尋 regex 並取代為 RegEx 則為:100,200s/regex/RegEx/g。
:1,$s/word1/word2/g 或 :%s/word1/word2/g 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 字串
:1,$s/word1/word2/gc 或 :%s/word1/word2/gc 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2 字串,且在取代前顯示提示資訊給使用者確認 (confirm) 是否需要取代。
複用捕獲組的方式進行替換
如果想將專案中所有的HTML標題標籤中h改為大寫H,搜尋正則表示式<h(\d)>可以查找出所有標題標籤,如<h1>、<h2>、<h3>、<h4>等,其中還定義了捕獲組(\d)。替換的正則表示式<H$1>使用$1複用了搜尋正則表示式中定義的捕獲組(\d)
在Vim中,複用捕獲組的方式進行替換的用法為:1,$s/(capture groups)/$1/g
如果想在當前檔案中將所有的HTML標題標籤中h改為大寫H則正則表示式為:1,$s/<h(\d)>/<H$1>/g
4.UML用例圖
本實驗時配置vscode,安裝draw.io外掛,並使用該外掛繪製uml用例圖,畫起來十分方便而直觀,以下是我與同學的工程實踐的一個UML用例圖,用draw.io畫出來:
5.軟體中的一些特殊機制
回撥函式
/*
* Search a LinkTableNode from LinkTable
* int Conditon(tLinkTableNode * pNode,void * args);
*/
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode, void * args), void * args);
多型
閉包
function makeFunc() { var name = "Mozilla"; function displayName() { alert(name); } return displayName; } var myFunc = makeFunc(); myFunc();
非同步呼叫
var promise = new Promise(function(resolve, reject) { if (/* 非同步操作成功 */){ resolve(value); } else { reject(error); } }); promise.then(function(value) { // resolve(value) // success }, function(value) { // reject(error) // failure });