序言
計算機程式設計是一個實踐性很強的“遊戲”,對於新入門者,好多人都在想,哪一門程式語言最好,我該從哪開始呢?我的回答是:語言不重要,理解程式設計思想才是最關鍵的!所有程式語言都支援的那一部分語言特性(核心子集)才是最核心的部分。所以從實際情況出發,選一門你看著順眼,目前比較貼近你要做的工作或學習計劃的計算機語言,開始你的程式設計之旅吧。
觀點闡述
語言的核心子集包括哪些部分
- 基本資料型別及運算子,這包括常量、變數、陣列(所有的語言都支援一種基本資料結構)的定義與使用;數學運算子與邏輯執行符等知識。
- 分支與迴圈,這是一門語言中的流程控制部分。
- 基本庫函式的使用,程式設計不可能從零開始,每門語言都有一個基本函式庫,幫我們處理基本輸入輸出、檔案讀寫等能用操作。
業界有一個二八規律,其實程式設計也一樣,大家回頭看看,我們寫了那麼多程式碼,是不是大部分都屬於這門語言的核心子集部分?也就是說,我們只要掌握了一門語言的核心子集,就可以開始工作了。
常用程式設計正規化
- 程式導向程式設計(最早的正規化,即命令式)
- 物件導向程式設計(設計模式的概念是從它的實踐活動中總結出來的)
- 函數語言程式設計(以純函式基礎,可以任意組合函式,實現集合到集合的流式資料處理)
- 宣告式程式設計(以資料結構的形式來表達程式執行的邏輯)
- 事件驅動程式設計(其分散式非同步事件模式,常用來設計大規模併發應用程式)
- 面向切面程式設計(避免重複,分離關注點)
我們要儘量多的瞭解不同的程式設計正規化,這樣能擴充我們的思路。學習語言的時候,有時可以同時學時兩門程式語言,對比學習兩門語言的同一概念,讓我們能夠更容易且深入的理解它。我學習javascript的閉包時,開始怎麼也理解不了;我就找了本python書,對比著學,才慢慢的理解了。
程式語言分類
- 編譯型語言 VS 解釋型語言
- 編譯型:C、C++、Pascal、Object-C、swift
- 解釋型:JavaScript、Python、Erlang、PHP、Perl、Ruby
- 混合型:java、C#,C#,javascript(基於V8)
- 動態結構語言 VS 靜態結構語言
- 動態語言:Python、Ruby、Erlang、JavaScript、swift、PHP、SQL、Perl
- 靜態語言:C、C++、C#、Java、Object-C
- 強型別語言 VS 弱型別語言
- 強型別:Java、C#、Python、Object-C、Ruby
- 弱型別:JavaScript、PHP、C、C++(C、C++,有爭議,介於強弱之間)
各種型別的語言,我們都要有所瞭解,這樣才能夠全面的理解程式語言中的各種特性,在面對特定的問題時,才能做出正確的選擇。
通過實際專案來學習語言(以Typescript為例)
專案需求:統一處理不同圖形(圓形、長方形、矩形等)的面積計算。
物件導向三大原則
1.Circle類講解資料封裝概念,將半徑與名稱封裝在類內部,並提供訪問方法
export default class Circle {
private r: number
private name: string
constructor(r: number) {
this.r = r
this.name = 'Circle'
}
getName(): string {
return this.name
}
area(): number {
return Math.pow(this.r, 2) * PI
}
}
複製程式碼
2.長方形與矩形講解繼承概念
//rectangle.ts
export default class Rectangle {
private a: number
private b: number
private name: string
constructor(a: number, b: number, name?: string) {
this.a = a
this.b = b
if (name === undefined)
this.name = 'Rectangle'
else
this.name = name
}
getName(): string {
return this.name
}
area(): number {
return this.a * this.b
}
}
//square.ts
export default class Square extends Rectangle {
constructor(a: number) {
super(a, a, 'Square')
}
}
複製程式碼
3.例項統一處理不同的形狀一起計算面積,講解多型概念
let shapes = Array<any>()
shapes.push(new Circle(2))
shapes.push(new Rectangle(5, 4))
shapes.push(new Square(3))
shapes.forEach((element) => {
console.log(`shape name: ${element.getName()}; shape area: ${element.area()}`)
})
複製程式碼
介面概念闡述
加入介面,規範形狀對外部分操作要求,讓錯誤提早到編譯階段被發現
export default interface IShape {
getName(): string;
area(): number
}
複製程式碼
函數語言程式設計講解
用例項來說明怎樣理解函式是一等公民,去掉我們習以為常的函式外層包裹
let printData = function(err: any, data: string): void {
if (err)
console.log(err)
else
console.log(data)
}
let doAjax = function (data: string, callback: Function): void {
callback(null, data)
}
//我們習以為常的使用方式
doAjax('hello', function(err, result){
printData(null, result)
})
//真正理解了函式是一等公民後,你會這樣用
doAjax('hello', printData)
複製程式碼
非同步處理中的經驗分享
在實踐過程,處理非同步呼叫容易誤解的一個重要概念,非同步函式執行的具體流程是什麼樣的?
let pf = function(data: string, n: number, callback: Function) {
console.log(`begin run ${data}`)
setTimeout(() => {
console.log(`end run ${data}`)
callback(null, data)
}, n)
}
let p = Promise.promisify(pf);
(async () => {
let ps = Array<any>()
ps.push(p('1111', 2000))
ps.push(p('2222', 1000))
ps.push(p('3333', 3000))
await Promise.all(ps)
})()
複製程式碼
視訊課程地址
以上是《運用typescript進行node.js後端開發精要》視訊課程的概要,有興趣的童鞋可以去觀看視訊。 傳送門: 快來學習Typescript,加入會程式設計、能程式設計、樂程式設計的行列吧!