OOP là khỉ gì?
oop
15
nodeepshit
12
White

quocnguyen viết ngày 23/01/2016

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.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

quocnguyen

19 bài viết.
980 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
177 58
(Ảnh) Việt nam như các anh em cũng biết là đất nước con rồng cháu tiên với nghề làm web truyền thống chỉ xoay quanh web nhạc, web phim, web tin tứ...
quocnguyen viết 1 năm trước
177 58
White
151 65
(Ảnh) Động lực Đối với nghề lập trình viên thần thánh, nếu một sớm mai thức dậy anh em cảm thấy ko có bất kì động lực nào để tỉnh, chỉ muốn ngủ ...
quocnguyen viết 1 năm trước
151 65
White
103 41
Prototype là hệ thống phân chia quyền lực của giang hồ Sở dĩ ta nói như vậy là vì Khi hỏi object 1 property nào đó, nếu bản thân nó ko làm dc, nó...
quocnguyen viết 2 năm trước
103 41
Bài viết liên quan
White
0 0
Clojure là ngôn ngữ functional có hỗ trợ OOP. Về mặt khoa học máy tính, có nhiều cách để thực hiện đa hình. Ở phiên bản trước 1.2, đa hình trong Cl...
Ngoc Dao viết gần 2 năm trước
0 0
White
2 1
Đó là: Chạy trong chế độ interactive Chạy trực tiếp bằng lệnh scala (chế độ thông dịch) Compile thành file .class rồi chạy như cách chạy của Jav...
Ngoc Dao viết gần 2 năm trước
2 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
19 bài viết.
980 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!