So sánh nhỏ Object Oriented Programming giữa Golang và PHP

25th Jan 2021
Table of contents

Tôi làm việc với PHP (một ngôn ngữ được nâng cấp lên hướng đối tượng và dùng nhiều để làm web) cũng khoảng 7 năm, sau đó tôi tìm hiểu Go và nhận ra rằng Go lượt bỏ vài đặc tính của OOP, cái mà vốn dĩ được xem là những thành phần không thể thiếu trong OOP. Hmm, Sao vậy ta...?

Lục lại ký ức, search lại Google chứ lâu rồi có thể viết sẽ bị sai. Trước tiên OOP (Object Oriented Programming) cơ bản là gì?

  • nó là kiểu lập trình được tổ chức và dựa trên những Objects, trong mỗi Object sẽ có những attributes và những methods
  • Encapsulation: là những attributes và methods của Object sẽ có tính bao đóng (Encapsulation) với các keyword: public/protected/private dùng để xác định xem có được cho phép truy cập từ những Object khác hay không.
  • Abstraction: tính trừu tượng, theo dẫn giã là bạn trừu tượng hoá một hoặc một nhóm những vật thể hiện hữu thành một thứ không hiện hữu (ví dụ: Sư tử, Báo, Mèo thì trừu tượng hoá là thuộc họ Mèo, Homo Sapien, Homo Neanderthal, Homo Solo thì tất cả đều là chi Người nhưng khác họ, và tất cả đều được gọi là Động vật.
  • Inheritance: tính kế thừa, đặc điểm này được suy ra từ tính trừu tượng, nghĩa là các Object "Sư tử", "Báo", "Mèo" sẽ kế thừa từ Object "Họ Mèo" và Object "Họ Mèo" sẽ kế thừa từ Object "Động vật"
  • Polymorphism: tính đa hình, đặc điểm này cũng được suy ra từ Abstraction và Inheritance, đa số các loài động vật đều có thể nói chuyện được nhưng mỗi loài lại có những ngôn ngữ khác nhau.

Giờ ta đem so sánh những thứ có và không có về OOP trong Go xem như thế nào:

Object, Class, Attribute

Go không có Class Nhưng Go có struct, receiver trong function

Ví dụ:

type MyFakeClass struct {
    attr1 string
}

//        v----- Here is receiver.
func (a *MyFakeClass) talk() {
    //Person <- "Hello"
    //Dog <- "Gâu gâu"
}

Theo ý kiến cá nhân, thì việc mô hình lập trình có Class, hay Object nó sẽ hướng chúng ta thiết kế ra những Object, Class và thể hiện chúng trên những file riêng biệt (vd: Animal.java, Dog.java)

Go sẽ thiết kế theo hướng chức năng (functional), nó sẽ hướng chúng ta bỏ nhiều struct và những function của struct vào một file để thể hiện một chức năng.

Encapsulation

Go không có public/protected/private keyword

Nhưng Go có thể định nghĩa public/private attributes và methods bằng cách viết hoa hay thường chữ cái đầu tiên của attributes và methods

Abstraction

Go chỉ có interface để thực hiện tính trừu tượng mà không có abstract và không thể hiện bằng cách implement một hoặc nhiều interface mà thể hiện dưới dạng Receiver có những function cùng tên, giống parameters, giống return.

Ví dụ bên dưới thể hiện MyFakeClassA, MyFakeClassB là một cách thể hiện của interface FakeClass

type FakeClass interface {
    FuncName(param1 string, param2 int) (string, error)
}

type MyFakeClassA struct {
    attr1 string
}

func (fc *MyFakeClassA) FuncName(param1 string, param2 int) (string, error) {
    //TODO
}

type MyFakeClassB struct {
    attr1 string
}

func (fc *MyFakeClassB) FuncName(param1 string, param2 int) (string, error) {
    //TODO
}

Inheritance

Go không có kế thừa cũng như không có keyword extend

Nhưng Go có một cách khác để thể hiện việc kế thừa là embedded struct trong một struct

Ví dụ:

type MyFakeClassA struct {
    attr1 string
}

type MyFakeClassB struct {
    attr1 string
    attr2 *MyFakeClassA
}

Polymorphism

Go có overloading và vì không có Inheritance nên Go không có overriding

Overloading trong Go thể hiện dưới dạng khác Receiver trên cùng một method name

Kết luận:

Suy cho cùng Go cũng chứa rất nhiều thuộc tính OOP của những đàn anh đi trước như C++, Java, Nhưng Go được xây trên ý tưởng là làm cho ngôn ngữ lập trình hay sản phẩm trở đơn giản hơn, dễ bảo trì hơn nên đã loại bỏ những thuộc tính được xem là có cũng được mà không có cũng chả sao.

Bạn thấy bài viết này như thế nào?
1 reaction

Add new comment

Image CAPTCHA
Enter the characters shown in the image.
Câu nói tâm đắc: “Điều tuyệt với nhất trong cuộc sống là làm được những việc mà người khác tin là không thể!”

Related Articles