CodeGym /Blog Java /Ngẫu nhiên /Đóng gói trong Java

Đóng gói trong Java

Xuất bản trong nhóm
CHÀO! Chúng ta sẽ dành bài học hôm nay cho Đóng gói trong Java và bắt đầu với các ví dụ ngay lập tức :) Ở đây bạn có một máy pha chế soda thông thường . 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 đưa ra một câu trả lời chi tiết: Soda đến từ đâu? Nhiệt độ bên trong được duy trì như thế nào? Nước đá được lưu trữ ở đâu? Làm thế nào để máy biết nên thêm xi-rô nào? Bạn có thể không có câu trả lời cho những câu hỏi này. Được rồi, có lẽ không phải ai cũng sử dụng những máy này. Hiện tại chúng không phổ biến lắm. Hãy thử một ví dụ khác. Một cái gì đó bạn chắc chắ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 - 2Hãy cho tôi biết cách thức hoạt động của công cụ tìm kiếm Googlelàm. Làm thế nào chính xác nó tìm kiếm thông tin về các từ bạn nhập? Tại sao những kết quả này ở trên cùng mà không phải những kết quả khác? Mặc dù bạn sử dụng Google hàng ngày nhưng có thể bạn không biết. Nhưng điều đó không quan trọng. Rốt cuộc, đó không phải là điều bạn cần biết. Bạn có thể sử dụng một 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ột chiếc máy mà không cần biết nó được chế tạo như thế nào. Bạn có thể lái một chiếc ô tô mà không cần tìm hiểu kỹ cách thức hoạt động của động cơ đốt trong và thậm chí không cần biết vật lý phổ thông. Điều này hoàn toàn 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 các bài báo khác nhau về chủ đề này, bạn hẳn đã gặp phải hai khái niệm lập trình phổ biến: đóng gói và ẩn thông tin. Khi nó xảy ra, những người khác nhau hiểu từ ' đóng gói' có nghĩa là những thứ khác nhau. Chúng tôi sẽ giải mã cả hai điều khoản để bạn có một sự hiểu biết đầy đủ. Trong lập trình, ý nghĩa ban đầu củađóng gói là kết hợp dữ liệu và phương pháp để làm việc với dữ liệu đó trong một gói ("viên nang"). Trong Java, đóng gói gói là lớp . Lớp chứa cả dữ liệu (trường) và phương thức để làm việc với dữ liệu đó. 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 mọi thứ được sắp xếp khác đi trong các mô hình lập trình khác. 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 hoạt động dữ liệu. Trong lập trình hướng đối tượng (OOP), các chương trình bao gồm các viên nang (lớp) bao gồm cả dữ liệu và chức năng để làm việc với dữ liệu.

Bây giờ hãy nói về ẩn thông tin

Làm thế nào để 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 được xây dựng hoặc cách chúng hoạt động? Thật đơn giản: những người tạo ra chúng đã cung cấp các giao diện đơn giản và thuận tiện. Trên máy soda, giao diện là các nút trên bảng điều khiển phía trước. Một nút cho phép bạn chọn kích thước cốc. Bạn chọn xi-rô bằng nút thứ hai. Một phần ba chịu trách nhiệm thêm đá. Và đó là tất cả những gì bạn cần làm. Không quan trọng máy trông như thế nào bên trong. Điều quan trọng là nó được thiết kế sao cho người dùng có thể lấy soda bằng cách nhấn ba nút. Điều tương tự áp dụng cho một chiếc xe hơi. Nó không quan trọng những gì đang xảy ra bên trong. Điều quan trọng là khi bạn nhấn bàn đạp bên phải, chiếc xe sẽ di chuyển về phía trước và khi bạn nhấn bàn đạp bên trái, chiếc xe sẽ chạy chậm lại. Đây chính là bản chất của việc che giấu thông tin. Tất cả của một chương trình' s 'bộ phận bên trong' được ẩn khỏi người dùng. Những thông tin như vậy là thừa hoặc không cần thiết đối với người dùng. Người dùng cần kết quả cuối cùng, không phải quy trình nội bộ. Ví dụ, chúng ta hãy nhìn vàoHạng xe :

public class Vehicle {

   public void gas() {

       /* Some complicated things happen inside a car.
       As a result, it moves forward */
   }

   public void brake() {

       /* Some complicated things happen inside a car.
       As a result, it slows down */
   }

   public static void main(String[] args) {

       Vehicle vehicle = new Vehicle();

       // How everything looks to the user

       // Press one pedal, the car moves
       vehicle.gas();

       // Press the other pedal, the car brakes
       vehicle.brake();
   }
}
Đây là cách triển khai được ẩn trong chương trình Java. Cũng giống như ngoài đời thực: người dùng được cung cấp một giao diện (các phương thức). Trong một chương trình, nếu bạn cần một chiếc ô tô để thực hiện một hành động, bạn chỉ cần gọi phương thức mong muốn. Điều gì xảy ra bên trong các phương pháp này là không cần thiết. Điều quan trọng là mọi thứ hoạt động như bình thường. Ở đây chúng ta đã nói về ẩn triển khai. Java cũng có ẩn dữ liệu. Chúng tôi đã viết về nó trong bài học về getters và setters, nhưng một lời nhắc nhở sẽ không hại gì. 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ó thể bạn nhớ từ một bài học trước vấn đề với lớp học này là gì? Nếu không, chúng ta hãy nhớ lại. Vấn đề là dữ liệu (các trường) của nó được mở cho tất cả mọi người. 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 với trọng lượng bằng 0 và tuổi -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 này, bạn có thể theo dõi cẩn thận xem một trong những đồng nghiệp của mình có đang tạo các đối tượng có trạng thái không hợp lệ hay không, nhưng sẽ tốt hơn nhiều nếu loại bỏ ngay cả khả năng tạo các đối tượng không hợp lệ này. Nguyên tắc đóng gói - 4Chúng tôi đạt được ẩn dữ liệu với sự trợ giúp của:
  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.
Chúng tôi sử dụng chúng để kiểm tra xem ai đó đang cố gắng cho con mèo một tuổi âm. Như chúng tôi đã nói trước đó, các tác giả của nhiều bài viết về đóng gói đang thực sự đề cập đến đóng gói (kết hợp dữ liệu và phương pháp) hoặc ẩn thông tin 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 cuối cùng là chính xác nhất.

Đóng gói mang lại cho chúng ta một số lợi thế quan trọng:

  1. Giám sát trạng thái đối tượng chính xác. Chúng tôi đã đưa ra các ví dụ về điều này ở trên: nhờ có trình thiết lập và công cụ sửa đổi riêng , chúng tôi đã đảm bảo chương trình của mình chống lại những con mèo có trọng số bằng 0.

  2. Giao diện người dùng thân thiện. Chúng tôi chỉ để lại các phương thức hiển thị cho người dùng. Người dùng chỉ cần gọi cho họ để nhận kết quả. Và không cần đi sâu vào chi tiết về cách chúng hoạt động.

  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. Điều này không ảnh hưởng đến người dùng: họ đã viết vehicle.gas() để đổ xăng và đó là điều họ sẽ tiếp tục làm. Thực tế là chúng tôi đã thay đổi một cái gì đó bên trong phương thức gas() vẫn vô hình: như trước đây, họ chỉ nhận được kết quả cần thiết.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION