Get in touch
or send us a question?
CONTACT

OOP là khỉ gì?

Người ta hay nói lập trình hướng đối tượng (OOP), vậy nó là cái gì, và trước khi nó ra đời thì mọi người lập trình “hướng” đi đâu?

Nói chung làm gì cũng cần có hướng, đi cà phê mắc quá thì gọi bạn phục vụ lại hỏi: “anh ơi cho em hỏi đi wc hướng nào”

Trước khi OOP ra đời thì người ta không hướng đối tượng mà hướng về function, hay còn gọi là lập trình hướng thủ tục.

Khi được giao 1 vấn đề thì đầu tiên ta sẽ dùng “tuyệt chiêu” chia để trị, tức là chia vấn đề lớn ra thành nhiều vấn đề nhỏ, chừng nào hết chia dc thì thôi, mỗi vấn đề nhỏ đó người ra sẽ viết 1 function để giải quyết nó. Tập hợp toàn bộ các function đó sẽ thành giải pháp cho vấn đề lớn. Qui tắc ở đây là: 1 function chỉ giải quyết 1 vấn đề.

Thôi lấy cái ví dụ cho nó dễ, chúng ta sẽ giả lập máy tính casio bỏ túi thời xưa lơ xưa lắc.

Áp dụng chia để trị thì máy tính casio có thể làm dc cộng trừ nhân chia. Như vậy ta viết 4 function cho từng phép tính.

function cong(a, b) {
    // cong 2 so
}

function tru(a, b) {
    // tru 2 so
}

function nhan(a, b) {
    // nhan 2 so
}

function chia(a, b) {
    // chia 2 so
}

Để chạy thì ta chỉ việc gọi cong(1,2) thì kết quả sẽ là 3. Rất đơn giản.

Nhưng nếu thực hiệp phép tính:

(1+1+2)*5/3

thì bắt đầu hơi rối rối:

chia(nhan(cong(cong(1,1),2), 5), 3)

Ngu người chưa o_O

alt text

Sau này có OOP thì người ta thay đổi cách tư duy, coi cái máy casio là 1 đối tượng. Và lập trình hướng về đối tượng này.

Đối tượng casio làm dc gì? -> function
Đối tượng casio nhét gì trong túi? -> attribute

Những gì casio làm dc, người ta sẽ viết function cho nó.
Những gì casio có được, người ta sẽ gọi nó là property, attribute hay các bạn thích gọi gì thì gọi =))

Chương trình lúc đó sẽ thành thế này:

class Casio {
    private $result = 0; // day la attribute

    public function cong($a) {
        $this->result+=$a;
    }

    public function tru($a) {
        $this->result-=$a;
    }

    public function nhan($a) {
        $this->result*=$a;
    }

    public function chia($a) {
        if (is_numeric($a) && $a > 0) {
            $this->result = $this->result / $a;
        }
    }

    public function in() {
        echo $this->result;
    }
}

Đại loại vậy, lâu ko code php rồi.

Áp dụng đối tượng casio này cho bài toán(1+1+2)*5/3

// tao doi tuong
$casio = new Casio();
// goi function
// (1+1+2)*5/3
$casio->cong(1);
$casio->cong(1);
$casio->cong(2);
$casio->nhan(5);
$casio->chia(3);
// in ra ket qua
$casio->in();

Đỡ nhức đầu hơn vì chúng ta có thể gọi cong tru nhan chia theo thứ tự.

Túm cái váy lại, OOP là khỉ gì:

OOP là 1 kỹ thuật lập trình trong đó người lập trình sẽ tiến vào 1 trạng thái rất tâm thần, anh này nhìn đâu cũng thấy toàn là đối tượng, và tìm cách giải quyết vấn đề bằng cách cho các đối tượng này tác động lẫn nhau.

Có bạn hỏi: MVC là khỉ gì.

Thay vì viết 1 bài blog vớ vẩn để giải thích, thì các bạn có thể tham khảo trả lời lược giản của tôi dưới đây:

Khi anh lập trình viên tâm thần bên trên kia (cái anh mà nhìn đâu cũng thấy đối tượng đó) đi lập trình web, thì anh ta sẽ nhìn thấy 3 đối tượng: Model, View, Controller. Anh ta sẽ code web bằng cách cho 3 đối tượng này tác động lẫn nhau. Cách này khá hay nên anh ta đặt tên cho nó là MVC và chia sẻ với mọi người.

Thế thì 3 thằng đó tác động lẫn nhau như thế nào ?

Tạm gọi:
controller là tiểu nhị.
model là đầu bếp.
view là cái bàn để dọn đồ ăn lên.

Khi khách gọi món, tiểu nhị biết khách cần gì, nhưng nó ko có món ăn trên tay mà phải hỏi đầu biếp, khi dọn món ăn ra thì tiểu nhị sẽ để lên bàn, có nhiều loại bàn và nhiều cách bày biện thức ăn trên bàn tuỳ hứng.

Hay là:

Khi trang web dc mở, controller sẽ biết user muốn làm gì, nhưng nó ko có thông tin user cần mà phải hỏi model, khi hiển thị, controller sẽ dùng view, có nhiều view tuỳ hứng.

Chốt lại:

controller sẽ nói chuyện với model và view.
view và model không bao giờ nói chuyện trực tiếp với nhau. (có ai thấy cái bàn nói chuyện với đầu bếp chưa ?)

Coi model là logic và view là presentation thì mô hình MVC sẽ giúp chúng ta tách 2 chym này ra, dẫn đến code dễ đọc, dễ hiểu và dễ test hơn.

Xin cám ơn anh lập trình viên tâm thần.

Source: https://kipalog.com/posts/OOP-la-khi-gi-