"Xin chào, Amigo! Hôm nay tôi sẽ mở ra một thế giới mới và thú vị cho bạn. Tôi đang nói về Lập trình hướng đối tượng (OOP) . Bạn đã biết về các lớp và đối tượng. Hôm nay bạn sẽ để tìm hiểu thêm về họ, nhiều hơn nữa."

Chúng ta sẽ bắt đầu với bốn trụ cột của OOP. Chúng là sự trừu tượng hóa, đóng gói, kế thừa và đa hình. (Đã từng có ba, nhưng phần trừu tượng đã được thêm vào sau)

1) Trừu tượng hóa.

Một ví dụ điển hình về sự trừu tượng trong cuộc sống thực là mô tả công việc tại một công ty. Chức danh công việc là một chuyện, nhưng nhiệm vụ của nó lại là một vấn đề hoàn toàn khác.

Hãy tưởng tượng bạn đang tạo sơ đồ tổ chức cho công ty tương lai của mình. Bạn có thể phân chia nhiệm vụ của một thư ký, rải chúng ra nhiều vị trí khác. Bạn có thể chia công việc của CEO thành nhiều vị trí riêng biệt: giám đốc tài chính, giám đốc công nghệ, giám đốc tiếp thị, giám đốc nhân sự. Hoặc bạn có thể kết hợp các vị trí quản lý văn phòng và nhà tuyển dụng thành một.

Giả sử bạn nghĩ ra tên cho các vị trí trong công ty của mình, và sau đó bạn "xác định" trách nhiệm cho các vị trí này. Đó là sự trừu tượng hóa - tách một thứ gì đó lớn và nguyên khối thành nhiều phần nhỏ.

OOP: nguyên tắc cơ bản - 1

Từ quan điểm của lập trình viên, tính trừu tượng là phân chia chương trình thành các đối tượng một cách hợp lý.

Một chương trình lớn thường có thể được biểu diễn dưới dạng các đối tượng tương tác theo bất kỳ cách nào trong số hàng chục cách khác nhau. Tính trừu tượng cho phép bạn chọn ra các đặc điểm chính của đối tượng và bỏ qua bất kỳ thứ gì ít quan trọng hơn.

Trừu tượng giống như một chiến lược quân sự. Nếu bạn chọn sai chiến lược, không có chiến thuật khéo léo nào cứu vãn được tình hình.

2) Đóng gói.

Đóng gói nhằm cải thiện sự tương tác giữa các đối tượng bằng cách đơn giản hóa chúng.

OOP: nguyên tắc cơ bản - 2

Cách tốt nhất để đơn giản hóa một điều gì đó là che giấu những điều phức tạp khỏi những người không cần biết về nó. Ví dụ, nếu bạn ngồi sau bộ phận điều khiển phi công của một chiếc máy bay phản lực Boeing, bạn sẽ mất nhiều thời gian để hiểu cách chúng hoạt động:

OOP: nguyên tắc cơ bản - 3

Mặt khác, mọi thứ có vẻ đơn giản hơn đối với hành khách trên máy bay: họ mua vé và lên máy bay, sau đó máy bay sẽ cất cánh và hạ cánh. Bạn có thể dễ dàng bay từ lục địa này sang lục địa khác, chỉ cần biết cách «mua vé» và «lên máy bay». Chúng tôi không nhận thấy bất kỳ sự phức tạp nào liên quan đến việc chuẩn bị máy bay cho chuyến bay, cất cánh, hạ cánh và các tình huống khẩn cấp tiềm ẩn khác. Và chúng tôi đã không đề cập đến các trung tâm điều hướng vệ tinh, lái tự động và kiểm soát không lưu. Điều này đơn giản hóa cuộc sống của chúng tôi.

Về mặt lập trình, đóng gói là «che giấu việc thực hiện». Tôi thích định nghĩa đó. Lớp của chúng tôi có thể chứa hàng trăm phương thức và thực hiện hành vi rất phức tạp trong các tình huống khác nhau. Nhưng chúng ta có thể ẩn tất cả các phương thức của nó khỏi những con mắt tò mò (bằng cách đánh dấu chúng là « riêng tư »), chỉ để lại hai hoặc ba phương thức để tương tác với các lớp khác (bằng cách đánh dấu chúng là « công khai »). Sau đó, tất cả các lớp khác trong chương trình của chúng ta sẽ chỉ nhìn thấy—và gọi—một vài phương thức này trên lớp này . Tất cả sự phức tạp của lớp học sẽ được ẩn giấu bên trong, giống như buồng lái được giữ kín khỏi tầm nhìn của những hành khách vui vẻ.

3) Quyền thừa kế.

Kế thừa là một khái niệm trong lập trình và cuộc sống thực. Trong lập trình, thừa kế là một mối quan hệ đặc biệt giữa hai lớp. Nhưng thừa kế trong cuộc sống thực thú vị hơn nhiều.

Nếu chúng ta cần tạo ra thứ gì đó trong đời thực, chúng ta có hai lựa chọn:

1) làm những gì chúng ta cần từ đầu và dành nhiều thời gian và công sức để làm việc đó.

2) tạo ra những gì chúng ta cần bằng cách sử dụng những thứ đã tồn tại.

Chiến lược tốt nhất là: Chúng tôi sử dụng một giải pháp tốt hiện có, làm lại và điều chỉnh nó để đáp ứng nhu cầu của chúng tôi, sau đó sử dụng nó.

Hãy xem xét, sự tiến hóa của loài người. Nếu chúng ta truy nguyên nguồn gốc của chúng từ thời điểm bắt đầu sự sống trên hành tinh, chúng ta sẽ thấy rằng hàng tỷ năm đã trôi qua. Nhưng nếu chúng ta nghĩ con người bắt đầu từ loài khỉ, thì chỉ vài triệu năm đã trôi qua. Tạo một cái gì đó từ đầu mất nhiều thời gian hơn. Lâu hơn nữa.

Tương tự như vậy, trong lập trình chúng ta có thể tạo một lớp dựa trên một lớp khác. Lớp mới trở thành hậu duệ (người thừa kế) của một lớp hiện có. Điều này cực kỳ hữu ích khi bạn đã có một lớp chứa 80-90% dữ liệu và phương thức cần thiết. Chúng tôi chỉ cần khai báo một lớp phù hợp làm cha của lớp mới của chúng tôi. Tất cả dữ liệu và phương thức của lớp cha tự động trở thành một phần của lớp mới. Thuận tiện, phải không?

4) Tính đa hình.

Đa hình là khái niệm lập trình mô tả tình huống trong đó các triển khai khác nhau được ẩn sau cùng một giao diện. Để tìm một chất tương tự trong cuộc sống thực, chúng ta có thể xem xét quá trình lái một chiếc ô tô.

Nếu một người có thể lái xe tải, thì người đó cũng có thể ngồi sau tay lái của xe cứu thương hoặc xe thể thao. Một người có thể lái ô tô bất kể đó là loại ô tô nào, bởi vì tất cả chúng đều có giao diện điều khiển giống nhau: vô lăng, bàn đạp và cần số. Ô tô được tổ chức khác nhau bên trong, nhưng tất cả chúng đều có chung giao diện điều khiển.

Quay trở lại lập trình, tính đa hình cho phép chúng ta tương tác với các đối tượng thuộc các lớp khác nhau (thường là cùng một tổ tiên) theo cùng một cách. Tầm quan trọng của điều này không thể được nhấn mạnh quá mức. Nó trở nên quan trọng hơn khi một chương trình phát triển lớn hơn.

OOP là nguyên tắc. luật lập trình. Mỗi người trong số họ hạn chế chúng tôi theo một cách nào đó, nhưng bù lại mang lại những lợi thế to lớn khi các chương trình phát triển lớn. Bốn nguyên tắc của OOP giống như bốn chân của một chiếc ghế. Nếu bạn lấy đi dù chỉ một trong số chúng, toàn bộ hệ thống sẽ trở nên không ổn định.