1. Giới thiệu các nguyên tắc của OOP

Hôm nay bạn sẽ khám phá một thế giới mới và thú vị. Thế giới của Lập trình hướng đối tượng ( OOP ). Trước đây bạn đã học về 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.

OOP nổi lên như một phản ứng đối với sự phức tạp ngày càng tăng của các chương trình. Khi các biến và phương thức trong các chương trình bắt đầu lên đến con số hàng chục nghìn, thì rõ ràng là cần phải làm gì đó. Một giải pháp là kết hợp dữ liệu và các phương thức liên quan thành các đối tượng riêng biệt.

Giờ đây, các lập trình viên phải mô tả riêng cách các đối tượng tương tác bên ngoài và cách chúng hoạt động bên trong. Điều này làm cho việc hiểu và viết chương trình trở nên dễ dàng hơn nhiều. Tuy nhiên, vẫn còn một câu hỏi: phương thức nào nên được sử dụng bên trong một đối tượng và phương thức nào nên có sẵn cho các đối tượng khác?

Nhiều cách tiếp cận đã được thử. Và dựa trên các phương pháp hay nhất được phát hiện, 4 nguyên tắc của OOP đã xuất hiện. Chúng là trừu tượng, đóng gói, kế thừa và đa hình . Trước đây, chỉ có ba, nhưng các chuyên gia sau đó đã quyết định thêm cả tính trừu tượng.


2. Trừu tượng hóa

Mọi người trên Internet vẫn tranh luận về định nghĩa trừu tượng trong OOP . Vấn đề không phải là mọi người đều sai. Đó là mọi người đều đúng . Chương trình càng nhỏ thì ngôn ngữ Java càng trừu tượng. Chương trình càng lớn thì tính trừu tượng càng gắn liền với việc mô hình hóa/đơn giản hóa các đối tượng trong thế giới thực.

Nhưng những bộ óc tốt nhất dường như đồng ý rằng:

Trừu tượng hóa là việc sử dụng chỉ những đặc điểm của một đối tượng đại diện cho nó đủ chính xác trong một chương trình. Ý tưởng chính là biểu diễn đối tượng bằng tập hợp các trường và phương thức nhỏ nhất đồng thời cho phép các tác vụ của bạn được giải quyết với độ chính xác vừa đủ .

Trong Java, sự trừu tượng hóa được thực hiện thông qua các lớp và giao diện trừu tượng.

Trừu tượng trong cuộc sống thực

Một ví dụ điển hình về tính 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 hoặc tổ chức. Chức danh của một chức vụ là một chuyện, nhưng những trách nhiệm cụ thể được giao cho một chức vụ lại là một vấn đề hoàn toàn khác.

Hãy tưởng tượng rằng bạn đang thiết kế cơ cấu tổ chức cho công ty tương lai của mình. Bạn có thể phân chia trách nhiệm thư ký, rải chúng trên một số vị trí khác nhau. Bạn có thể tách vị trí CEO thành nhiều vị trí riêng biệt: CFO, CTO, CMO, HR Director. Hoặc, ví dụ, 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.

Bạn nghĩ ra các chức danh công việc và sau đó phân chia trách nhiệm cho các vị trí này. Tính trừu tượng đang tách khỏi toàn bộ đối tượng và chọn các thuộc tính và thành phần thiết yếu mà chúng ta cần.

Giới thiệu các nguyên tắc của OOP.  trừu tượng

Từ quan điểm lập trình, trừu tượng hóa là sự phân chia chính xác chương trình thành các đối tượng . Thông thường, có hàng chục cách để biểu diễn bất kỳ chương trình lớn nào dưới dạng các đối tượng tương tác. Trừu tượng hóa cho phép bạn chọn các đặc điểm thiết yếu và bỏ qua những đặc điểm không cần thiết.


3. Đóng gói

Mục tiêu của đóng gói là cải thiện các tương tác bằng cách làm cho các đối tượng đơn giản hơn.

Và cách tốt nhất để đơn giản hóa một thứ gì đó là che giấu những thứ phức tạp khỏi những con mắt tò mò. Ví dụ: nếu bạn được đưa vào buồng lái của một chiếc máy bay phản lực khổng lồ Boeing, bạn sẽ không hiểu ngay cách vận hành nó:

Nhưng đối với hành khách trên máy bay, mọi thứ đơn giản hơn: bạn mua vé và lên máy bay, cất cánh rồi hạ cánh. Bạn có thể dễ dàng bay từ lục địa này sang lục địa khác chỉ với khả năng "mua vé" và "lên máy bay". Tất cả sự phức tạp của 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 khác nhau đều bị che giấu khỏi bạn. Chưa kể đến các trung tâm định vị vệ tinh, lái tự động và kiểm soát không lưu. Và điều này đơn giản hóa cuộc sống cho chúng tôi.

Từ quan điểm lập trình, đóng gói là "che giấu việc triển khai". Tôi thích định nghĩa này. Lớp của chúng ta có thể chứa hàng trăm phương thức và thực hiện các 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 bằng công cụ sửa đổi riêng tư) và 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 bằng công cụ sửa đổi công khai). Sau đó, tất cả các lớp khác trong chương trình của chúng tôi sẽ chỉ nhìn thấy ba phương thức công khai và gọi chúng chứ không phải các phương thức khác. Và tất cả sự phức tạp sẽ được ẩn bên trong lớp, giống như buồng lái được ẩn khỏi những hành khách vui vẻ.


4. Thừa kế

Có hai mặt để kế thừa . Kế thừa trong lập trình và kế thừa ngoài đời. 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. Tạo thứ chúng ta cần từ đầu, dành nhiều thời gian và công sức.
  2. Tạo ra thứ chúng ta cần dựa trên thứ đã tồn tại.

Chiến lược tối ưu là: lấy một giải pháp tốt hiện có, sửa đổi nó một chút, điều chỉnh nó cho phù hợp với nhu cầu của chúng ta, rồi sử dụng nó.

Nếu chúng ta lần theo dấu vết lịch sử loài người từ thuở ban đầu, chúng ta sẽ khám phá ra rằng hàng tỷ năm đã trôi qua kể từ khi sự sống bắt đầu trên hành tinh này. Nhưng nếu coi xuất phát điểm của con người là tổ tiên linh trưởng (tức con người được “dựa trên” tổ tiên linh trưởng) thì cũng chỉ đôi ba triệu năm đã trôi qua. Xây dựng từ đầu mất nhiều thời gian hơn. Lâu hơn nữa.

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


5. Đa hình

Đa hình là một khái niệm lập trình. Nó mô tả một tình huống trong đó các triển khai khác nhau bị ẩn sau một giao diện duy nhất. Nhìn vào thực tế cuộc sống để đối chiếu, chúng tôi thấy rằng việc vận hành một phương tiện là phù hợp.

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

Quay trở lại thế giới lập trình, tính đa hình cho phép các đối tượng thuộc các lớp khác nhau (thường có chung một tổ tiên) được truy cập theo cùng một cách, một thuộc tính mà giá trị của nó khó có thể bị phóng đại. Giá trị của nó tăng lên khi chương trình phát triển lớn hơn.

OOP có nghĩa là Nguyên tắc. Nội luật. Mỗi người trong số họ giới hạn chúng tôi theo một cách nào đó, nhưng đổi lại mang lại lợi ích to lớn khi chương trình trở nên lớn. Bốn nguyên tắc của OOP giống như bốn chân của một cái bàn. Lấy đi một cái và toàn bộ hệ thống trở nên không ổn định.