顯示具有 程式 標籤的文章。 顯示所有文章
顯示具有 程式 標籤的文章。 顯示所有文章

2015年11月10日 星期二

Git學習資源介紹

跟大家分享幾個我在學習Git時,覺得不錯的Git學習資源

30 天精通 Git 版本控管: https://github.com/doggy8088/Learn-Git-in-30-days

Will保哥之的大作,從Git的結構跟原理開始介紹怎麼使用Git,可以幫你理清很多觀念很值得一讀,保哥也開過相關的課程,可以帶領新手很快入門,有機會可以去上一下,會很有收獲哦~

Git 版本控制系統:https://ihower.tw/git/index.html

作者是在台灣上教Git的數一數二的大師ihower寫的,我看了他很多簡報,滿能幫助理清觀念的,可以依教材的順序往下看,再搭配中間的簡報及blog的文章,這也是大推學習Git的好地方!

Pro Git : http://iissnan.com/progit/index.zh-tw.html

這本應該可以算是Git的聖經本,裡面很詳細的介紹各種Git的使用技巧,有些部分寫的比較文言一點,算是比較深入的書,可以選擇你要的章節看,等你學習到一定的程度想再更加精進,再回來看其他的章節

LearnGitBranching:http://pcottle.github.io/learnGitBranching/

這是一個做中學(Learn by doing)的網站,一步步依指示教導git的使用,建議是先把保哥及ihower裡先研讀一篇再來這裡實作會更有效果哦

Code School :https://www.codeschool.com/paths/git

Code School也是一個標榜做中學的網站,不只是用影片先教導你觀念,再來會用練習的方式讓你更加了解剛才影片裡教導的觀念及技巧,不過除了Try Git課程外,其他課程是付費才可以觀看,不過目前因為他被另一家程式教學網站(pluralsight)併購了,現在推出三天免費的優惠,可以趁這三天好好的把其他課程一次學完......XD

連猴子都能懂的Git入門指南:http://backlogtool.com/git-guide/tw/

連猴子都懂了,你應該也會吧?網站用了很多圖文來教你使用Git,不過我覺得在觀念沒有講的很深入,但還是滿值得看的

GIT教學: http://kingofamani.gitbooks.io/git-teach/

這個應該是新北市教研中心-程式設計班的課程教材,內容也不錯也可看一看,不過好像還沒寫完,有些章節還不完全

TortoiseGit + GitHub : https://www.youtube.com/watch?v=73lJ6hcWMho&list=WL&index=4

講英文的不太懂,國語的又講不好,那用台語來介紹Git李共賀唔賀,這是在youtube上找到的一個用台語教你如何使用TortoiseGit及GitHub的教學影片,作者講話的方式有濃濃的台味,看了會讓你會心一笑:)

再分享幾個git的簡報資料....

















 

以上是我學習Git覺得不錯的幾個網站,如果有新的再補上來,也歡迎大家有看到不錯的網站也可以分享上來~~3Q

2013年11月12日 星期二

物件導向基礎

以前看大話程式設計整理的物件導向基礎,現在剛好在重看就順便把它再整理一下囉~


物件(Object)

  • 一個獨立自主的實體,用一組可識別的特性和行為來標示

類別(Class)

  • 具有相同之屬性和功能的物件的抽象集合

實體(instance)

  • 一個真實的物件
  • 實體化就是建立建件的過程,使用new關鍵字來建立

建構式(constructor)

  • 又叫建構函式,其實就是對類別進行初始化。
  • 建構式與類別同名,無返回值
  • 所有類別都有建構式,若無定義,系統會自動產生空的建構式;若有定義,則預定的建構式就會失效

方法重載(Overload)

  • 提供建立同名的多個方法的能力,這些方法需使用不同的參數類型
  • Overload方法名相同,參數類型或個數要有所不同
  • Overload可在不改變原方法的基礎上,新增功能

屬性(Property)

  • 一個方法或一對方法,但在調用它的程式碼看來,它是一個欄位,即屬性適合於以欄位的方式使用方法調用的場合
  • 欄位是儲存類別要滿足其設計所需要的資料,欄位是與類別相關的變數
  • 屬性有二個方法get和set
    • get存取器返回與宣告的屬性相同的資料類型,調用時可以得到內部欄位的值或參考
    • set存取器沒有顯示設定參數,但它有一個隱式參數,用關鍵字value表示,它的作用是調用屬性時,可以給內部的欄位或參考賦值

封裝(Encapsulation)

  • 每個物件都包含它進行操作所需要的所有資訊,物件不必依賴其他物件來完成自已的操作
  • 好處
    • 良好的封裝能夠減少耦合
    • 類別內部的實現可以自由的修改
    • 類別具有清晰的對外介面

繼承(Inheritance)

  • 物件的繼承代表了一種“is-a"的關係
  • 繼承者可以理解為是對被繼承者的特殊化,它除了具備被繼承者的特性外,還具備自已獨有的個性
  • 繼承定義了類別如何相互關聯,共用特性
  • 父類別和子類別,或叫基礎類別和衍生類別,其中子類別繼承父類別的所有特性,還可以定義新的特性
    • 子類別擁有父類別非private的屬性和功能
    • 子類別具有自已的屬性和功能
    • 子類別還可以用自已的方式實現父類別的功能(方法重寫)
  • 優點
    • 繼承使得子類別公共的部分都放在父類別,使得程式碼得到共用,避免了重覆
    • 繼承可使得修改或擴展繼承而來的實現都較為容易
  • 缺點
    • 父類別變動,子類別也不得不變
    • 繼承會破壞包裝,父類別實現細節暴露給子類別
  • 繼承是一種類別與類別之間強耦合的關係
  • 當二類別之間具備“is-a"的關係時,就可以考慮用繼承

修飾子

  • Public
    • 所修飾的類別成員可以允許其他任何類別來存取
  • Protected
    • 子類別可對基礎類別有完全的存取權
  • Private
    • 只允許同一個類別中的成員存取

多型(Polymorphism)

  • 不同的物件可以執行相同的動作,但要透過它們自已的實現程式碼來執行
  • 特性
    • 子類別以父類別的身份出現
    • 子類別在工作時以 自已的方式來實現
    • 子類別以父類別的身份出現時,子類別特有的屬性和方法不可以使用
  • 子類別將父類別的實現替換為自已的實現,這就是方法重寫(Override),或者叫方法覆寫
  • 多型的原理是當方法被調用時,無論物件是否轉換為其父類別,都只有位於物件繼承的最末端的方法實現會被調用,也就是說,虛擬方法是按照其執行時類型,而非編譯時類型進行動態繫結調用

2013年10月31日 星期四

無瑕的程式碼心得記錄(一)

這篇是無瑕的程式碼的心得筆記.....

有意義的命名

  • 讓名稱帶表意圖
    • 讓名稱名符其實
  • 避免誤導
  • 產生有意義的區別
  • 使用能唸出來的名稱
  • 使用可被搜尋的名字
  • 避免編碼
  • 避免思維的轉換
    • 清楚明白才是王道
  • 類別的命名
    • 使用名詞或名詞片語命名
  • 方法的命名
    • 使用動詞或動詞片語
  • 不要裝可愛
    清楚闡述比起娛樂價值來的重要
  • 每種概念使用一種字詞
    Ex:取得方法不要fetch、retrieve又get
  • 別說雙關語
  • 使用解決方案領域的命名
  • 使用問題領域的命名
  • 添加有意義的上下文資訊(context)
  • 別添加無理由的上下文資訊

函式

  • 簡短
  • 只做一件事
  • 每個函式只有一層抽象概念
    • 降層準則
      • 由上而下閱讀程式碼
  • 使用具描述能力的名稱
  • 函式的參數
    • 參數數量
      • 最理想是零個
      • 其次是一個
      • 盡量避免超過三個參數
    • 物件型態的參數
      • 可減少參數的數量
    • 輸出型的參數
      • 避免使用
  • 動詞和關鍵字
    • 替函式取個好名稱可產生許多良好的附加價值
  • 要無副作用
    • 一次只做一件事,不要在函式底下偷做其他事
  • 指令和查詢要分離
    函式要能做某事或能回答某個問題,但二者不該同時發生
  • 使用例外處理取代回傳錯誤
    • 錯誤處理就是一件事
  • 不要重覆自己(DRY)
  • 結構化程式設計
    • 每個函式及函式裡的區塊都應該只有一個進入點及一個離開點
    • 不能有break或continue敍述
    • 永遠不能有goto敍述
  • 如何寫出這樣的函式
    • 像寫文章一樣
      • 初稿通常粗糙而雜亂無章
      • 重新組織整個文章段落,將文章改善至你要的樣子

註解

  • 不要替糟糕的程式碼寫註解—重寫它
  • 註解無法彌補糟糕的程式碼
  • 用程式碼表達你的本意
  • 有益的註解
    • 法律型註解
    • 資訊型註解
      • 透過註解提供一些基本資訊是非常有用的
    • 對意圖的解釋
    • 闡明
      • 把難解的參數或回傳值翻譯成具有可讀性的文字
    • 對後果的告誡
      • 做為一種警告
    • 待辦事項註解
    • 放大重要性
  • 糟糕的註解
    • 喃喃自語
    • 多餘的註解
      • 有時候程式碼本身就可以提供明白的意圖,加了註解反而比程式碼更難理解
    • 誤導型註解
      • 不精確讓人看不懂
    • 規定型註解
      • 因為規定加上去的註解,有時候反而會產生更多困惑或造成散亂的程式結構
    • 日誌型註解
      • 現在有好的原始碼管控系統,可以不需要
    • 干擾型註解
      • 某些註解毫無用處,只會干擾
  • 可以使用函式或變數時就別使用註解
  • 位置的標誌物
  • 右大括號後面的註解
  • 出處及署名
  • 被註解起來的程式碼
  • 非區域性的資訊
  • 過多的資訊
  • 不顯著的關聯
  • 函式的標頭
    • 為小型函式選一個好的名稱,通常比「將註解寫在函式標頭」來的更優

編排

  • 編排的目的
    • 讓程式碼更具可讀性
  • 報紙的啟發
    • 頭條的敍述
    • 概要
    • 全文細節
  • 垂直的編排
    • 概念間的垂直空白區隔
      • 用空白來分隔不同的思緒
        • 宣告
        • 引用類別庫
        • 不同函式
    • 垂直密度
      • 程式密切相關的程度
        • 密切相關的程式應該垂直緊密,不要被無用的註解或其他的程式碼切開其關聯性
    • 垂直距離
      • 具類似的概念應盡可能的靠近
      • 變數宣告
        • 應盡可能靠近變數使用的地方
      • 實體變數
        • 應被宣告在類別的上方
      • 相依的函式
        • 如果A函式呼叫了B函式,那麼這二個函式在垂直編排上要盡可能靠近
      • 概念相似性
        • 概念上有相似性質的程式碼盡可能的相近
      • 垂直的順序
        • 呼叫敍述應在被呼叫函式的上方
  • 水平的編排
    • 水平的空白間隔和密度
      • 高度相關及完全不相關的事情,都可以利用水平的空白將之分開
      • 設定運算子(assignment operators)
      • 強調運算子的優先權
    • 水平的對齊
      • 沒有必要
      • 長度會太長
    • 縮排
      • 階層結構
      • 讓視野層次結構更顯而易見
      • 違反縮排的規則
        • 有時候因if、while或簡短的函式想違反縮排的規則
        • 盡量不要
      • 空視野範圍
        • While或for迴圈的程式是空白
        • 確保空白區塊也被縮排,否則很容易被誤導
  • 團隊的共同準則
    • 統一的編排規則

物件及資料結構

  • 資料抽象化
  • 資料/物件的反對稱性
    • 結構化的程式碼容易添加新的函式,而不需要變動已有的資料結構。而物件導向的程式碼,容易添加新的類別,而不用變動已有的函式。
    • 結構化的程式碼難以添加新的資料結構,因為必須改變所有的函式。物件導向的程式碼難以添加新的函式,因為必須改變所有的類別。
  • 德摩特爾法則(The Law of Demeter)
    • 類別C內的方法f,應該只能呼叫以下事項的方法
      • C
      • 任何由f所產生的物件
      • 任何當作參數傳遞給f的物件
      • C類別裡的實體變數所持有的物件
    • 方法不該呼叫「由任何函式所回傳之物件」的方法
  • 資料傳輸物件(Data transfer Objects,DTO)
    • 最佳的資料結構形式
    • 類別裡只有公用變數,沒有任何函式

2013年10月20日 星期日

[Javascript] Array操作方法

javascript中Array的幾個常用到的方法:

  • concate()

在原本的array中,產生新的Array副本並將參數值加入到新的Array中,其結果不會影響到原來的Array內容。

    
  var users = ["jonn","keny","jeffrey"];
  var users2 = users.concat("frank","joe");

  //原始的array內容不受影響 ["jonn", "keny", "jeffrey"]
  console.log(users);
  //新的array為原始的array + 參數內容 ["jonn", "keny", "jeffrey", "frank", "joe"]
  console.log(users2);
    
  • slice()

  • splice()
    splice跟slice不同,只差一個字母很容易讓人家搞混了,splice()的主要用途是
    向數組的中部插入項,但使用這種方法的方式則有如下3種。
    刪除:可以刪除任意數量的項,只需指定2個參數:要刪除的第一項的位置和要刪除的項數。例如,splice(0,2)會刪除數組中的前兩項。
    插入:可以向指定位置插入任意數量的項,只需提供3個參數:起始位置、0(要刪除的項數)和要插入的項。如果要插入多個項,可以再傳入第四、第五,以至任意多個項。例如,splice(2,0,"red","green")會從當前數組的位置2開始插入字符串"red"和"green"。
    替換:可以向指定位置插入任意數量的項,且同時刪除任意數量的項,只需指定3個參數:起始位置、要刪除的項數和要插入的任意數量的項。插入的項數不必與刪除的項數相等。例如,splice (2,1,"red","green")會刪除當前數組位置2的項,然後再從位置2開始插入字符串"red"和"green"。