Skip to content

Dashboard

Nói không với If/Else trong Ruby?

Created by Admin

Như các bạn đã biết, khi bắt đầu với lập trình, thì chúng ta sẽ phải tập cách viết một câu điều kiện. Lệnh If/Else dường như là một trong những câu lệnh không thể thiếu, thật khó tưởng tượng nếu thế giới lập trình không có if/else. Trong một số dự án mình đã từng làm, mình đã cố gắng giảm thiểu câu lệnh if/else vì nó khiến người review code khá là rối nếu có quá nhiều lệnh if/else, và thực sự đã có một số cách rất tốt để thay thế, nó vẫn sẽ giúp hệ thống chạy ổn định, dễ đọc và hơn hết là bảo trì tốt hơn.

Một ví dụ về If/Else

def love
    a_boy_handsome_1 = Boy.get_a_boy_handsome_1
    a_boy_handsome_2 = Boy.get_a_boy_handsome_2
    a_girl = Girl.get_a_girl
    
    if a_boy_handsome_1 >= 100 || a_boy_handsome_2 >=100
        very_happy = a_boy_handsome_1 +a_boy_handsome_2
    else
        a_baby_boy = a_boy_handsome_1  + a_girl
        a_baby_girl = a_boy_handsome_2  + a_girl
    end
end

Khi đọc đoạn ví dụ trên có thể bạn hơi bối rối về code lẫn nội dung của nó. Ở đây bạn sẽ có một số câu hỏi với đoạn code trên:

  • tại sao chúng ta lại kiểm tra boy > 100 để làm gì, nó có ý nghĩa gì, có gì đặc biệt ở con số 100 này?
  • tại sao lại very_happy khi a_boy_handsome_1 +a_boy_handsome_2?
  • Điều gì sẽ xảy ra đối với trường hợp else xảy ra và tại sao nó được thực hiện?

Quick Refactoring

Bây giờ mình sẽ viết lại câu lệnh if/else này nhưng có một số thay đổi như sau:

  1. Cứ mỗi đoạn điều kiện ta sẽ tạo một phương thức cho nó, mình chỉ cần gọi đến khi cần
def love
    if is_gay?
        set_very_happy
    else
        a_baby_born
    end
    
    private
    
    def a_boy_1
        Boy.get_a_boy1
    end
    
     def a_boy_2
        Boy.get_a_boy2
    end
    
     def a_girl
        Girl.get_a_girl
    end
    
    def is_gay?
        a_boy_1 >= 100 || a_boy_2 >=100
    end
    
    def set_very_happy
        very_happy = a_boy_1 +a_boy_2
    end
    
    def born_baby
        a_baby_boy = a_boy_1  + a_girl
        a_baby_girl = a_boy_2  + a_girl
    end
end

Sẽ đơn giản hơn nữa nếu ta làm như sau:

def love
    is_gay? ? set_very_happy : born_baby
    
    private
    
    #.....

Results

Sau khi refactor, chúng ta đã hoàn toàn thay thế if/else phức tạp thành 1 câu lệnh khá đơn giản mà bất cứ lập trình viên nào cũng hiểu.

    is_gay? ? set_very_happy : born_baby

Ngoài ra nó sẽ giải quyết một số thắc mắc phía trên

  • tại sao chúng ta lại kiểm tra boy > 100 để làm gì, nó có ý nghĩa gì, có gì đặc biệt ở con số 100 này? trả lời: Nó kiểm tra chàng trai đó có gay hay ko (lớn hơn 100 thì gay rồi)
  • tại sao lại very_happy khi a_boy_handsome_1 +a_boy_handsome_2? trả lời: Đương nhiên sẽ vui vẻ nếu 2 chàng trai ấy ấy rồi nhỉ?
  • Điều gì sẽ xảy ra đối với trường hợp else xảy ra và tại sao nó được thực hiện?
  • trả lời: đơn giản, nếu không gay thì sẽ được làm father

Trên chỉ là một vài ví dụ nhỏ cho việc sử dụng If/else. Hi vọng sẽ giúp được các bạn trong việc code dễ hiểu cũng như DRY hơn

Source: https://viblo.asia/p/noi-khong-voi-ifelse-trong-ruby-bWrZnL6p5xw