Thật ra OOP không khó, cũng không dễ. Không khó là vì, bản chất nó sinh ra là vì con người ta vốn có sẵn cái lý tính, lý tính giúp chúng ta phân biệt các “hình thức” rồi tự gán ý niệm vào “hình thức” đó, gọi nhanh có thể gần giống với công việc phân loại. Đúng là con người rất thích phân loại, thế nên mới sinh ra đủ các thể loại con, giống, bộ, lớp, nhánh, thể loại,… Nhưng không dễ, là vì không phải ai cũng biết cách phân loại đúng. Để đạt được đến tầm kiến thức có thể đưa ra được ý niệm chính xác về 1 sự vật sự việc, thì có thể mất rất nhiều công sức suy nghĩ và tìm tòi. Nếu không là một người yêu thích triết học, thì bạn đôi khi khó làm được.
Nhưng ban đầu thì người ta lại lập trình theo hướng thủ tục. Hãy coi như não con người có 1 phần chuyên dùng để hiểu vấn đề đi, nếu thế thì hướng thủ tục là gần với cái não này nhất, ý là não sẽ dễ hiểu lập trình hướng thủ tục nhất. Vì nó sát nghĩa với bài toán đặt ra, cần tính chu vi, có ngay 1 đoạn code tính chu vi, cần tính diện tích, có ngay 1 đoạn code tính diện tích. Vì thế nên ban đầu khi đi học, mình được học lập trình hướng thủ tục, và nó vẫn ăn sâu vào máu đến tận bây giờ.
Đến khi làm việc với tư tưởng OOP, mình thấy nó hay ở điểm thế này: Mục tiêu chính của OOP chính là “tóm gọn” các thủ tục lại, người ta hay gọi là “đóng gói” đấy. Có nghĩa là, 1 công việc thì có rất nhiều việc cần làm, để làm ra 1 game thì bạn phải chia studio của bạn ra làm nhiều vị trí, ví dụ như 1 bên thì vẽ chi tiết, 1 bên thì tính toán vật lý và các véc tơ, 1 bên thì sáng tạo kịch bản, rồi còn có hẳn 1 bên chuyên làm giám sát tất cả các bên rồi đưa ra đánh giá,… Đó, chung quy lại, vẫn là thực hiện các thủ tục, nhưng chỉ là bạn chia nó ra cho từng người và chuyên môn hóa nó thôi. OOP cũng vậy, bạn tạo ra một đối tượng, thì mục đích duy nhất của bạn là để đối tượng đấy của bạn giải quyết 1 công việc nào đó nào cho bạn. Nói như vừa rồi thì ngược, đáng lẽ phải là: tôi cần giải quyết công việc này, vậy nên tôi tạo ra 1 đối tượng và để nó giải quyết giúp tôi. Vấn đề khó khăn ở đây là làm sao để bạn biết được công việc cần phải giao cho đối tượng là gì, nó đã đúng để có thể chuyên môn hóa chưa.
Đối tượng, là một nhân vật có thể giải quyết một tập hữu hạn các công việc đã biết trước tính chất, và mỗi công việc đó, lại là 1 thủ tục.
Trong cái này thì có cái kia, vậy đó. Như là âm dương vậy.
p/s: Bài viết rất ngẫu hứng, các bạn cứ cmt cơ mà đừng quan trọng tính đúng sai. Mục đích duy nhất mình post lên là để tranh luận.