JavaRush /Blog Java /Random-VI /Nguyên tắc đóng gói trong Java

Nguyên tắc đóng gói trong Java

Xuất bản trong nhóm
Xin chào! Bài giảng hôm nay sẽ tập trung vào việc đóng gói và chúng ta sẽ bắt đầu ngay bằng các ví dụ :) Trước mặt các bạn là một chiếc máy bán nước ngọt quen thuộc. Tôi có một câu hỏi dành cho bạn: nó hoạt động như thế nào? Cố gắng trả lời chi tiết: ly đến từ đâu, nhiệt độ bên trong được duy trì như thế nào, đá được bảo quản ở đâu, máy hiểu loại xi-rô nào cần thêm, v.v. Rất có thể, bạn không có câu trả lời cho những câu hỏi này. Chà, có lẽ không phải ai cũng sử dụng những chiếc máy như vậy, ngày nay chúng không quá phổ biến. Hãy thử đưa ra một ví dụ khác. Một cái gì đó bạn biết bạn sử dụng nhiều lần mỗi ngày. Ồ, tôi có một ý tưởng! Nguyên tắc đóng gói - 2 Hãy cho chúng tôi biết công cụ tìm kiếm Google hoạt động như thế nào . Nó tìm kiếm thông tin dựa trên những từ bạn đã nhập chính xác như thế nào? Tại sao những kết quả này lại ở trên cùng mà không phải những kết quả khác? Dù bạn sử dụng Google hàng ngày nhưng có thể bạn chưa biết. Nhưng nó không quan trọng. Rốt cuộc, bạn không cần phải biết điều này. Bạn có thể nhập truy vấn vào công cụ tìm kiếm mà không cần suy nghĩ về cách thức hoạt động chính xác của nó. Bạn có thể mua soda từ máy bán hàng tự động mà không biết nó hoạt động như thế nào. Bạn có thể lái ô tô mà không cần nghiên cứu sâu về hoạt động của động cơ đốt trong và không cần biết chút gì về vật lý, ngay cả ở cấp độ đi học. Tất cả điều này có thể thực hiện được nhờ một trong những nguyên tắc chính của lập trình hướng đối tượng - đóng gói . Khi đọc nhiều bài viết khác nhau về chủ đề này, bạn có thể nhận thấy rằng có hai khái niệm phổ biến trong lập trình - đóng góiẩn . Và với từ “đóng gói”, các tác giả muốn nói điều này hay điều khác (khi nó xảy ra). Chúng tôi sẽ chia nhỏ cả hai thuật ngữ để bạn có sự hiểu biết đầy đủ. Ý nghĩa ban đầu của từ “ đóng gói ” trong lập trình là sự kết hợp giữa dữ liệu và phương pháp làm việc với dữ liệu này trong một gói (“viên nang”). Trong Java, lớp này hoạt động như một gói con nhộng . Một lớp chứa cả dữ liệu (trường lớp) và các phương thức để làm việc với dữ liệu này. Nguyên tắc đóng gói - 3 Điều này có vẻ hiển nhiên đối với bạn, nhưng trong các khái niệm lập trình khác, mọi thứ hoạt động khác nhau. Ví dụ, trong lập trình chức năng, dữ liệu được tách biệt hoàn toàn khỏi các thao tác trên đó. Trong OOP (lập trình hướng đối tượng), các chương trình bao gồm các lớp con nhộng, vừa là dữ liệu vừa là hàm để làm việc với nó. Bây giờ hãy nói về việc ẩn náu . Tại sao chúng ta sử dụng tất cả các loại cơ chế phức tạp mà không hiểu cách chúng hoạt động và cơ chế hoạt động của chúng dựa trên cơ sở gì? Thật đơn giản: người tạo ra chúng đã cung cấp giao diện đơn giản và thân thiện với người dùng. Trên máy bán nước ngọt, giao diện là các nút trên bảng điều khiển. Bằng cách nhấn một nút, bạn chọn âm lượng của kính. Bằng cách nhấn cái thứ hai, bạn chọn xi-rô. Người thứ ba có nhiệm vụ thêm đá. Và đó là tất cả những gì bạn phải làm. Việc máy được thiết kế bên trong chính xác như thế nào không quan trọng. Điều chính là nó được thiết kế sao cho để lấy được soda, người dùng cần nhấn ba nút . Với một chiếc ô tô cũng vậy. Không quan trọng điều gì đang diễn ra bên trong anh ấy. Cái chính là khi bạn nhấn bàn đạp phải thì xe đi về phía trước, khi bạn nhấn bàn đạp trái thì xe chạy chậm lại . Đây chính xác là bản chất của sự che giấu. Tất cả “bên trong” của chương trình đều bị ẩn khỏi người dùng. Đối với anh, thông tin này là thừa và không cần thiết. Người dùng cần kết quả cuối cùng chứ không phải quy trình nội bộ. Hãy lấy lớp học làm ví dụ Auto:
public class Auto {

   public void gas() {

       /*some complicated things are happening inside the car
       as a result of which it goes forward*/
   }

   public void brake() {

       /*some complicated things are happening inside the car
       as a result of which it slows down*/
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       // How everything looks to the user

       //pressed one pedal - went
       auto.gas();

       //pressed another pedal - braked
       auto.brake();
   }
}
Đây là giao diện của việc ẩn triển khai trong một chương trình Java. Mọi thứ giống như trong đời thực: người dùng được cung cấp một giao diện (các phương thức). Nếu anh ta cần chiếc xe trong chương trình để thực hiện một hành động, anh ta chỉ cần gọi phương thức mong muốn. Và những gì xảy ra bên trong các phương thức này là những thông tin không cần thiết, điều quan trọng chính là mọi thứ đều hoạt động như bình thường. Ở đây chúng ta đã nói về việc ẩn việc triển khai . Ngoài ra, Java còn có tính năng ẩn dữ liệu . Chúng tôi đã viết về nó trong bài giảng về getters và setters , nhưng sẽ không có hại gì nếu nhắc nhở bạn. Ví dụ: chúng ta có một lớp Cat:
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }


}
Có lẽ bạn còn nhớ bài giảng trước vấn đề của lớp này là gì? Nếu chưa thì chúng ta hãy nhớ nhé. Vấn đề là dữ liệu (các trường) của anh ta được mở cho tất cả mọi người và một lập trình viên khác có thể dễ dàng tạo ra một con mèo không tên trong chương trình với trọng số là 0 và tuổi là -1000 năm:
public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
Trong tình huống như vậy, bạn có thể theo dõi chặt chẽ xem một trong các đồng nghiệp của mình có đang tạo đối tượng với trạng thái sai hay không, nhưng sẽ tốt hơn nhiều nếu loại trừ khả năng tạo ra “đối tượng sai” như vậy. Nguyên tắc đóng gói - 4 Họ giúp chúng tôi ẩn dữ liệu:
  1. công cụ sửa đổi truy cập ( riêng tư , được bảo vệ , gói mặc định );
  2. getters và setters.
Ví dụ, ở đó chúng ta có thể kiểm tra xem liệu có ai đó đang cố gán số âm cho tuổi của con mèo hay không. Như chúng tôi đã nói trước đó, tác giả của nhiều bài viết khác nhau về đóng gói có nghĩa là đóng gói (kết hợp dữ liệu và phương pháp) hoặc ẩn hoặc cả hai. Java có cả hai cơ chế (điều này không nhất thiết phải xảy ra trong các ngôn ngữ OOP khác), vì vậy tùy chọn sau là đúng nhất. Việc sử dụng tính đóng gói mang lại cho chúng ta một số lợi ích quan trọng:
  1. Giám sát trạng thái chính xác của đối tượng. Có những ví dụ về điều này ở trên: nhờ setter và công cụ sửa đổi riêng, chúng tôi đã bảo vệ chương trình của mình khỏi những con mèo có trọng số 0.

  2. Thân thiện với người dùng nhờ giao diện. Chúng tôi chỉ để lại các phương thức “bên ngoài” cho người dùng truy cập. Tất cả những gì anh ấy cần làm là gọi cho họ để nhận kết quả và anh ấy không cần phải đi sâu vào chi tiết công việc của họ.

  3. Thay đổi mã không ảnh hưởng đến người dùng. Chúng tôi thực hiện tất cả các thay đổi bên trong các phương thức. Cái này sẽ không ảnh hưởng tới người dùng: anh ta viết auto.gas() cho xăng của xe nên anh ta sẽ viết. Và thực tế là chúng tôi đã thay đổi điều gì đó trong hoạt động của phương thức gas() sẽ vẫn vô hình đối với anh ấy: anh ấy, như trước đây, sẽ chỉ nhận được kết quả mong muốn.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION