JavaRush /Blog Java /Random-VI /Toán tử bậc ba trong Java

Toán tử bậc ba trong Java

Xuất bản trong nhóm
Xin chào! Bài giảng hôm nay sẽ không dài lắm, nhưng chắc chắn sẽ hữu ích :) Chúng ta sẽ nói về cái gọi là toán tử bậc ba . Toán tử bậc ba - 1“Ternary” có nghĩa là “ba”. Đây là một giải pháp thay thế cho toán tử có điều kiện if-elsemà bạn đã quen thuộc. Hãy đưa ra một ví dụ. Giả sử một người quyết định đến rạp chiếu phim để xem một bộ phim được xếp hạng 18+. Người bảo vệ kiểm tra tuổi của anh ta ở lối vào: nếu anh ta đủ tuổi, anh ta cho phép anh ta vào hội trường, nếu không, anh ta sẽ đuổi anh ta về nhà. Hãy tạo một lớp Manvà kiểm tra nó với if-else:
public class Man {

   private int age;

   public Man(int age) {
       this.age = age;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   public static void main(String[] args) {

       Man man = new Man(22);

       String securityAnswer;

       if (man.getAge() >= 18) {
           securityAnswer = "It's all right, come in!";
       } else {
           securityAnswer = "This movie is not suitable for your age!";
       }

       System.out.println(securityAnswer);

   }
}
Đầu ra của bảng điều khiển:

"Все в порядке, проходите!"
Nếu chúng tôi loại bỏ đầu ra khỏi bảng điều khiển, thử nghiệm của chúng tôi sẽ như thế này:
if (man.getAge() >= 18) {
           securityAnswer = "It's all right, come in!";
       } else {
           securityAnswer = "This movie is not suitable for your age!";
       }
Trên thực tế, ở đây, logic đơn giản hoạt động: một điều kiện được kiểm tra (tuổi >= 18). Tùy thuộc vào điều này, securityAnswermột trong hai dòng có phản hồi của người bảo vệ sẽ được gán cho biến. Những tình huống như “một điều kiện - hai kết quả có thể xảy ra” xảy ra rất thường xuyên trong lập trình. Do đó, toán tử bậc ba tương tự đã được tạo cho chúng. Với nó, chúng tôi có thể đơn giản hóa việc xác minh của mình thành một dòng mã:
public static void main(String[] args) {

   Man man = new Man(22);

   String securityAnswer = (man.getAge() >= 18) ? "It's all right, come in!" : "This movie is not suitable for your age!";

   System.out.println(securityAnswer);

}
Công việc của toán tử này trông như thế này. Nó được gọi là ternary (triple) vì có 3 thành phần tham gia vào công việc của nó:
  • Một điều kiện ( man.getAge() >= 18)
  • Hai kết quả có thể xảy ra ( "Không sao, tiếp tục!""Phim này không phù hợp với lứa tuổi của bạn!" )
Đầu tiên, một điều kiện được viết trong mã, theo sau là dấu chấm hỏi.
man.getAge() >= 18 ?
“Tuổi của người đó lớn hơn hay bằng 18?” Sau đây là kết quả đầu tiên. Nó kích hoạt nếu điều kiện trả về true, nghĩa là đúng:
String securityAnswer = man.getAge() >= 18 ? "It's all right, come in!"
Tuổi của người đó lớn hơn hay bằng 18? Nếu có, hãy gán cho biến securityAnswer giá trị “Mọi thứ đều ổn, vào đi!” . Tiếp theo là :toán tử “ ”, sau đó kết quả thứ hai được ghi. Nó kích hoạt nếu điều kiện trả về false, tức là sai:
String securityAnswer = man.getAge() >= 18 ? "It's all right, come in!" : "This movie is not suitable for your age!";
Tuổi của người đó lớn hơn hay bằng 18? Nếu có, hãy gán cho biến securityAnswer giá trị “Mọi thứ đều ổn, vào đi!” . Nếu không, hãy gán cho biến securityAnswer giá trị “Phim này không phù hợp với lứa tuổi của bạn!” Đây là logic chung của toán tử bậc ba. tình trạng ? result 1 : result 2 Toán tử bậc ba - 2Nhân tiện, không cần thiết phải đặt dấu ngoặc đơn xung quanh điều kiện: chúng tôi đã làm điều này để dễ đọc hơn. Nó sẽ hoạt động mà không có chúng:
public static void main(String[] args) {

   Man man = new Man(22);

   String securityAnswer = man.getAge() >= 18 ? "It's all right, come in!" : "This movie is not suitable for your age!";

   System.out.println(securityAnswer);

}
Bạn nên sử dụng cái gì: if-else, hoặc toán tử bậc ba? Về mặt hiệu suất không có nhiều sự khác biệt. Chính xác hơn thì nó có thể tồn tại nhưng không đáng kể. Ở đây câu hỏi liên quan nhiều hơn đến khả năng đọc mã của bạn. Điều cực kỳ quan trọng trong lập trình: mã bạn viết không chỉ phải hoạt động chính xác mà còn phải dễ đọc. Suy cho cùng, nó có thể được “kế thừa” cho những lập trình viên khác, đồng nghiệp của bạn! Và nếu điều đó khó hiểu, nó sẽ làm phức tạp công việc của cả họ và của bạn - họ sẽ chạy đến chỗ bạn để giải thích cứ sau 5 phút. Một khuyến nghị chung có thể giống như thế này: nếu điều kiện đơn giản và dễ kiểm tra, bạn có thể sử dụng toán tử ba ngôi mà không gây hại. Bằng cách này, bạn sẽ giảm được số lượng mã và số lần kiểm tra if-else, trong đó có thể đã có rất nhiều. Nhưng nếu điều kiện phức tạp và nhiều giai đoạn thì nên sử dụng if-else. Ví dụ: trong trường hợp này sẽ là một ý tưởng tồi nếu sử dụng toán tử bậc ba:
String securityAnswer = (man.getAge() >= 18 && (man.hasTicket() || man.hasCoupon()) && !man.hasChild())  ? "Come in!" : "You can not pass!";
Vì vậy, bạn sẽ không hiểu ngay được chuyện gì đang xảy ra ở đây! Mã đã trở nên rất khó đọc. Và tất cả chỉ vì một điều kiện khó khăn:
  • Nếu một người trên hoặc bằng 18 tuổi + có vé (hoặc có phiếu vào cửa miễn phí) + không mang theo con nhỏ - thì có thể vượt qua.
  • Nếu ít nhất một phần của điều kiện trả về sai thì không thể.
Đây rõ ràng là nơi tốt hơn để sử dụng if-else. Có, mã của chúng tôi sẽ có kích thước lớn hơn nhưng nó sẽ dễ đọc hơn nhiều lần. Và không ai trong số đồng nghiệp của bạn sẽ ôm đầu nếu họ kế thừa đoạn mã như vậy :) Cuối cùng, tôi có thể giới thiệu cho bạn cuốn sách. Trong bài giảng chúng ta đã đề cập đến chủ đề khả năng đọc mã. Cuốn sách kinh điển “Clean Code” của Robert Martin được dành tặng cho cô. Toán tử bậc ba - 3Nó chứa các phương pháp hay nhất và đề xuất dành cho lập trình viên, cho phép bạn viết mã không chỉ hiệu quả mà còn dễ đọc. Có một bài đánh giá về cuốn sách này trên JavaRush.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION