12/08/2018, 17:58

Giới thiệu Protocol-Oriented Programming trong Swift (Phần 1)

Bạn đã bao giờ nghe nói về Object-Oriented Programming? Mình đoán là rồi vì nó cực kì phổ biến ngày nay Nhưng còn Protocol-Oriented Programming thì sao? Protocol-Oriented Programming (POP) được giới thiệu lần đầu bởi Apple tại sự kiện WWDC 2015 với Swift 2.0, và họ gọi Swift là POP, ...

Bạn đã bao giờ nghe nói về Object-Oriented Programming? Mình đoán là rồi vì nó cực kì phổ biến ngày nay

Nhưng còn Protocol-Oriented Programming thì sao?

Protocol-Oriented Programming (POP) được giới thiệu lần đầu bởi Apple tại sự kiện WWDC 2015 với Swift 2.0, và họ gọi Swift là POP, chứ không phải là OOP như những ngôn ngữ phổ biến khác như: Java, Python, C#,…

Bạn có thể sẽ tự hỏi: POP là cái quái gì vậy ?

Nếu bạn đã làm quen với OOP rồi thì khi so sánh với POP, bạn sẽ thấy nhiều điểm tương đồng. Hãy nghĩ một chút về OOP, khi bạn giải quyết vấn đề bằng OOP, bạn sẽ suy nghĩ hướng giải quyết bài toán thông qua các Class và Object (instance của Class). Với POP, bạn thay vì suy nghĩ dưới góc độ của Class, bạn sẽ chuyển sang tập trung vào các Protocol ( lý do sẽ được giải thích sau). Xu hướng lập trình Swift hiện đại là cố gắng sử dụng POP kết hợp với Struct, thay vì sử dụng Class. Protocol linh hoạt hơn Class; instance của Struct được cấp phát trên Stack, còn instance của Class được cấp phát trên Heap nên phương pháp này thực thi tốt hơn. Apple tại WWDC đã nói một câu rất hay như sau:

“THINK ABOUT PROTOCOL FIRST”

–> POP là phương pháp lập trình thiết kế và làm việc ưu tiên với các Protocol, thay vì Class như OOP.

2. Ví dụ về POP

Bời vì POP được kế thừa từ OOP nên POP có rất nhiều ưu diểm vượt trội hơn OOP. Ngày nay, trong Swift, Mình thấy rất nhiều người ưa thích sử dụng Struct kết hợp Protocol (Thường được sử dụng trong POP) thay vì sử dụng class (OOP). Mọi thứ Class có thể làm, Struct cũng có thể. Struct dựa trên Value Type thay vì Reference Type như Class -> Chúng ta không cần phải lo nghĩ nhiều tới việc Memory Leak, deadlock (multithread), implicit sharing data...

Bây giờ chúng ta sẽ đi tới ví dụ cụ thể

Giả sử chúng ta có class là Bird, Bird có 2 thuộc tính: name và feather.

class Bird {
    
    var name:String
    var feathers:String
    
    func fly(){
        //TODO: nothing
    }
    
    init(name:String, feathers:String){
        self.name = name
        self.feathers = feathers
    }
    
}

Tiếp theo, Chúng ta có 2 subclass của Bird, là Parrot và Eagle.

class Parrot:Bird {
    
    override init(name: String, feathers: String) {
        super.init(name: name, feathers: feathers)
    }
    
    override func fly() {
        //TODO: nothing
    }
}

class Eagle:Bird{
    
    override init(name: String, feathers: String) {
        super.init(name: name, feathers: feathers)
    }

    override func fly() {
        //TODO: nothing
    }
}

Và giờ mình muốn theo Penguin. Oops...

class Penguin:Bird { 
    
    //Oops, i do not have feather
    override init(name: String, feathers: String) {
        super.init(name: name, feathers: feathers)
    }

    // i'm too fatty, how can i fly :(
    override func fly() {
    }
}

Penguin là chim, nhưng nó không hề có lông và không thể bay             </div>
            
            <div class=

0