###### tags: `課程` # 專案開發課程 ## 閱讀資源: 1. [Clean Code 無瑕的程式碼 | 閱讀筆記](https://medium.com/%E6%89%8B%E5%AF%AB%E7%AD%86%E8%A8%98/clean-code-index-51e209cc47db) 2. [常見變數命名規則(Naming convention)](https://dustinhsiao21.github.io/laravel/naming-convention/) 3. [iT邦幫忙-我為什麼想學設計模式](https://ithelp.ithome.com.tw/articles/10201706) 4. [Git and GitHub for Beginners - Crash Course](https://www.youtube.com/watch?v=RGOj5yH7evk&ab_channel=freeCodeCamp.org) 5. [Git常見指令表](https://ithelp.ithome.com.tw/articles/10241407) 6. [HackMD 快速入門教學](https://hackmd.io/c/tutorials-tw/%2Fs%2Fquick-start-tw) 7. [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html)\ 8. [Google Coding Style 中文版](https://tw-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/naming.html#id2) 9. [什麼?又是/不只是 Design Patterns!? 系列](https://ithelp.ithome.com.tw/users/20120812/ironman/2697) 10. [Git & GitHub 教學手冊](https://w3c.hexschool.com/git/cfdbd310) ## 時程規劃: 10/15 coding style 10/16 Git & GitHub: how to teach them 10/18 Prepare the PPT and the content about Coding Style and Git & GitHub 10/22 Day1 10/23 10/25 10/29 Designed Pattern 10/30 11/1 11/9 社課當日 ## Coding Style > **減少重複、具有高度的表達力、並及早建立簡單抽象概念,就是撰寫 Clean Code 的方法。** ### 名稱 1. 讓名稱代表意圖 > 如果一個名稱還需要註解的輔助,那麼這個名稱就不具備展現意圖的能力。 :::spoiler meme  ::: 2. 產生有意義的區別 > 命名類似的變數或是函式時,要有足夠的意義的命名方式,區別這些類似的東西 ```cpp= int result1; // resultOfAdd int result2; // resultOfSub ```` 3. 類別和物件 用**名詞**或**名詞片語**來命名 ```cpp= Class Car{ private: int year; string brand; public: void changeTail(); void startEngine(); } ``` 4. 函式 用**動詞**或**動詞片語**來命名 ```cpp= int CountEmergeTime(int target, int arr[]){ int count = 0; for (int i=0;i<arr.size();i++){ if (arr[i] == target){ count++; } } return count; } ``` ### 命名種類 - 變數與函數的命名規範: 1. 駝峰Camel case - 小駝峰lower camel case  - 大駝峰upper camel case、Pascal case  2. 底線(Snake_case) ```int number_of_apple = 5;``` - 類別的命名規範: 1. Pascal Case: 開頭為大寫的單字 2. 通常為名詞 - 巨集 1. Snake Case: 全為大寫且用底線分開。 ```cpp= #include<iostream> using namespace std; #define PI 3.1415926; #define MAX(a, b) ((a) > (b) ? (a) : (b)) Class Fruit{ public: Fruit::Fruit(){}; Fruit::Fruit(string name, int quantity){ this->_name = name; this->_quantity = quantity; }; int geQuantity(){ return this->_quantity; } private: int _quantity; string _name = ""; } int main(){ Fruite apple(apple, 5); Fruite banana(banana, 10); cout << MAX(apple.getQuantity(),banana.getQuantity()) << endl; } ``` ### 註解 [look](https://www.cclo.idv.tw/google-cpp-styleguide-zhTW/comments.html) > 如果可以透過命名解釋意圖,則不用註解解釋程式碼的意圖。 > 如果一段註解對於理解程式碼沒有幫助,則沒必要為程式碼添加註解。 - 註解風格: `//`或`/**/`都可,但`//`比較常用。 - TODO註解:幫助開發者列出代辦事項,或是針對還不夠好的程式碼加上TODO,在未來的工作時程上完成此事項  ### 縮排 若你寫得程式是python那你很清楚知道縮排的重要,因為pyhton是靠縮排來規範scope的。但是如果你寫的程式是用刮號{}、()把不同的程式碼作區分的,那請你一定要縮排,在這種程式語言中,不縮排不會影響到你的結果,但是會讓閱讀的人,有極大的障礙,所以如果你在寫程式時不愛縮排,或是會忘記縮排,請務必培養好縮排的習慣。 :::danger 你是左括號換行,還是換行左括號,請好好選擇你的答案(盯 ::: 換行左括號或左括號換行,主要還是看個人習慣,或是公司習慣。 Google Coding Guide 是遵照K&R Indent Style,左括號換行。 但是在Visual Studio的自動排版,會幫你換行左括號。 總而言之,各有各的好,勿戰。  ## Git & GitHub :::info 動畫呈現分支,考慮協作,讓他們可以體驗協作的功用 講解流程:分成兩大部分,前面的部分是自己使用版本控制、後面是講解協作 1. 自己的版本控制 1. 為什麼要用Git & GitHub? 2. 兩者區別是什麼,差異又在哪? 3. 帶入實作,邊實作邊講解 2. 多人的版本控制 1. 協作的基本觀念:每個人都是非同步的,但又要能夠順利協作 2. 分支的概念? 3. 分支實作 4. 衝突如何解決? (實體+線上分組實作) 6. 衝突實作 7. 呼叫之前的版本 ::: ### Overview - 版本控制: 管理程式碼的變更,達到儲存、回朔及變更程式碼的融合。 - 集中式版本控制: 集中在一台主機中控管,不能在聯網的情況下工作。 - 程式碼修修改改時要持續與主機合併。 - 分散式版本控制: 將檔案庫分散至所有人,大家都會有一份完整的檔案內容與時間點紀錄。 - 不須聯網也能工作、不用持續與主機合併。  - Git: **分散式**版本的版本控制系統。 - 免費 - 合併與儲存速度快 ### Create a Git Repository - Repository(儲存庫): 專案的目錄。 #### 實作: 建立一個 .git 資料夾 1. 新增一個資料夾 2. 前往當前資料夾 3. 執行 git init 指令 ```bash= $ git --version $ git init ``` ### Git Workflow 1. 追蹤檔案 - status 查看目錄的狀態 - add 將目錄內的檔案追蹤 ```bash= $ git status ``` ```bash= $ git add ``` [add是甚麼?為甚麼要在commit之前add過檔案?](https://ithelp.ithome.com.tw/articles/10275828?sc=iThelpR) 2. 存檔commit ```bash= $ git commit ``` `-a`: all,會全部commit,除了沒有被add的檔案(不會跳出add提示) `-m`: message,要在輸入指令的後面加入commit的資訊,例如:`git commit -m "fixed bug"` `-v`: verbose,意思是會冗長的紀錄你要commit的資訊,會跳到vim模式,按下esc,輸入`:wq`儲存並退出 4. push 更新上傳到Git雲端 ```bash= $ git push ``` `git remote add <遠端名稱> 網址(https...)` 建立與遠端的連結 `git push -u <遠端名稱> main` 把local端的main分支的內容,push到遠端名稱上的main分支 4. pull 把最新的版本拉下來 ```bash= $ git pull ``` 5. clone 複製一份雲端上的版本到本地 ```bash= $ git clone ``` ### Git Branch introduce and dealing with Conflict - master branch `git branch -M main` `-M`: 是指Master,我要讓Master的分支叫做甚麼名稱 - feature branch - merge - git checkout - 什麼是 HEAD? - HEAD 就是你目前指向的版本狀態,而 HEAD 可以選擇它指向到 - 分支 (branch) - commit 版本 - 甚麼是Branch? - 為甚麼要用到Branch?假設你是自己一個人用做專案,你也會有branch,只是數量是1;但現在可能是好多人一起做專案,理想狀態下,大家同時一起開始做專案,每個人會是做不同的東西,而且完成的時間都不一樣,利用branch,自己都會有自己的分支,等你做完了,就可以合併到主要的分支裡。等大家都做完,就完成專案了。 :::info **協作流程** - 有A、B兩人,裡面有共同的檔案(版本0) - `git clone <url>` - A跟B都先在GitHub上建立自己的Branch(branchA and branchB) - `git checkout -b <branch名稱>` - A跟B都更動檔案,分別為(版本A)跟(版本B),並且push到自己的分支 - 隨意更動檔案後 - `git add .` - `git commit -m "message" - `git push -u origin <branch name>` - 假設A先merge到main,現在版本0可以順利merge為版本A - 按下GitHub中的提示 - 如果沒有衝突,就可以直接merge - 換B做merge到main,B必須解決conflic才能成功merge - 切換成main,輸入`git switch main` - 嘗試做merge,輸入`git merge <branch name>` - 此時程式碼會顯示衝突 - 衝突的原因很簡單,就是同個檔案中,同一行或是多行的程式碼不一樣(而且前一次的commit不是同一位) - 解決conflic - 我們假設版本A跟版本B都要保留,選擇accept both changed - 操作完後,必須要做`git add .`和`git commit -m "message"`的動作,因為在玩合併的時候,是在做新的更動,所以切記要存檔。 - 再把程式碼push上去,`git push` - 就成功把版本A跟版本B融合成版本1,且是在main這個分支上 - 而A分支跟B分支的內容都還是各自的東西 - 所以下次想要繼續做的時候,必須要回到自己的分支,並且pull主分支上面的內容`git pull origin main`,確保你做的東西,都是最新的。 ::: ### Git Undoing - git log - git reset https://w3c.hexschool.com/git/9a164fbe ### 實作方案: 1. 借由示範[教學網站](https://learngitbranching.js.org/?locale=zh_TW)的操作讓它們知道有這個工具,並能回家練習。 2. 邊實作邊講概念: - 概念與實作穿插,講完一個概念後(例如:repo、status、push),就讓大家在Git Bash上實作。 ### SSH (Secure Shell) [閱讀文章](https://ithelp.ithome.com.tw/articles/10277498) 是一個連線加密機制,連線通道是經過加密,它使用public和private key的Architecture來做連線通道的加解密 SSH 讓我們在與遠端電腦(遠端伺服器)連線時,能夠先將訊息加密過後再傳送,並且確保只有「被認可的人」才能夠解密訊息。 - 公鑰和私鑰的觀念 - 它讓我們可以傳送加密訊息而不需要先交換任何秘密資訊  - 私鑰拿來做電子簽名與解密(任何你收到的加密文件),公鑰用來讓別人確認你的簽名的正確性(證明人家收到的,有你的簽名的東西真的是你傳的),還有讓別人將東西加密成只有你自己能(使用私鑰)解密的檔案。 - 假設今天小明想要使用 SSH 傳一個訊息給小美,他們已經互相擁有對方的公鑰了,並且擁有各自的私鑰,此時會有五個步驟: 1. 小明用自己的私鑰將訊息簽名。 2. 小明用小美的公鑰將訊息加密。(此時,被加密的訊息連小明也無法還原—只有小美的私鑰可以!) 3. 小明將訊息傳給小美。 4. 小美將訊息用自己的私鑰解密。 5. 小美用小明的公鑰來確認這個訊息是用小明的私鑰簽名的。 :::info 公鑰必須交給對方,自己在傳訊息時,使用要傳送對象的公鑰加密後,再傳給對方。 自己的私鑰才能夠解開自己的公鑰。 解碼後的文件,需要使用寄件者的公鑰來確認是否是他傳送的訊息。 ::: ## S.O.L.I.D principle 1. 單一職責原則 Single Responsibility Principle - 一個類別負責一個職責 2. 開放封閉原則 Open Closed Principle - 開放於擴展,封閉於修改 - 在新增需求時有能力對其進行擴展而不需更動原本的程式 - 舉例 - 新增Minecraft模組不用去更改Minecraft主體 5. 李氏代換原則 Liskov Substitution Principle - 衍生的類別必須基於父類別的邏輯。 7. 介面隔離原則 Interface Segregation Principle - 模組不應依賴用不到的功能 8. 依賴反向原則 Dependency Inversion Principle - 高層模組不應依賴底層模組,而是依賴介面。 ### 函式 一個函式,做一件事情
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up