如何學習一門計算機編程語言

序言

計算機編程是一個實踐性很強的“遊戲”,對於新入門者,好多人都在想,哪一門編程語言最好,我該從哪開始呢?我的回答是:語言不重要,理解編程思想纔是最關鍵的!所有編程語言都支持的那一部分語言特性(核心子集)纔是最核心的部分。所以從實際情況出發,選一門你看着順眼,目前比較貼近你要做的工作或學習計劃的計算機語言,開始你的編程之旅吧。

觀點闡述

語言的核心子集包括哪些部分

  • 基本數據類型及運算符,這包括常量、變量、數組(所有的語言都支持一種基本數據結構)的定義與使用;數學運算符與邏輯運行符等知識。
  • 分支與循環,這是一門語言中的流程控制部分。
  • 基本庫函數的使用,編程不可能從零開始,每門語言都有一個基本函數庫,幫我們處理基本輸入輸出、文件讀寫等能用操作。

業界有一個二八規律,其實編程也一樣,大家回頭看看,我們寫了那麼多代碼,是不是大部分都屬於這門語言的核心子集部分?也就是說,我們只要掌握了一門語言的核心子集,就可以開始工作了。

常用編程範式

  • 面向過程編程(最早的範式,即命令式)
  • 面向對象編程(設計模式的概念是從它的實踐活動中總結出來的)
  • 函數式編程(以純函數基礎,可以任意組合函數,實現集合到集合的流式數據處理)
  • 聲明式編程(以數據結構的形式來表達程序執行的邏輯)
  • 事件驅動編程(其分佈式異步事件模式,常用來設計大規模併發應用程序)
  • 面向切面編程(避免重複,分離關注點)

我們要儘量多的瞭解不同的編程範式,這樣能拓展我們的思路。學習語言的時候,有時可以同時學時兩門編程語言,對比學習兩門語言的同一概念,讓我們能夠更容易且深入的理解它。我學習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++(有爭議,介於強弱之間)

各種類型的語言,我們都要有所瞭解,這樣才能夠全面的理解編程語言中的各種特性,在面對特定的問題時,才能做出正確的選擇。

通過實際項目來學習語言(以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', 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,加入會編程、能編程、樂編程的行列吧!

資源地址

https://github.com/zhoutk/sifou

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章