Lập trình không dùng if-else, có được không?

If-else thật xấu xí

Đối diện với một bài toán, lập trình viên (LTV) thường phải trả lời câu hỏi: Đây là bài toán đặc thù hay phổ quát? Bài toán “số ít” hay “số nhiều”?  Và thông thường, câu trả lời sẽ quyết định thành quả tiếp theo. Ví dụ, con chó kêu gâu gâu?” là bài toán số ít. Ta có thể viết thế này:

Thật đơn giản. “Con chó kêu gâu gâu, con mèo kêu meo meo” thì sao? Vẫn là bài toán số ít thôi.

Thật đơn giản. “Con chó kêu gâu gâu, con mèo kêu meo meo, con vịt kêu quạc quạc” thì sao? Vẫn là bài toán số ít thôi.

Thật đơn giản. À từ từ, chuyển sang switch cho đẹp mắt.

Đẹp đẽ quá rồi. Tuyệt vời.

Bạn có thấy câu chuyện trên quen thuộc trong cuộc sống hàng ngày của LTV? Khi if-else bắt đầu phát huy sức mạnh, làm ơn đừng chuyển sang switch – chẳng hay ho gì đâu. Khi if-else bắt đầu phát huy sức mạnh, chính là khi nó bắt đầu trở nên xấu xí, chính là khi chúng ta cần phải xem lại cách đánh giá bài toán của mình. Đây không phải là bài toán số ít ngay từ đoạn code #2. Các LTV cần hiểu đúng đắn rằng đây là bài toán số nhiều ngay từ khi nó có dấu hiệu là bài toán số nhiều, thay vì cứ else-if và hy vọng giữ nó là bài toán số ít.

LTV có thể sống mà không cần if-else?

Có, dùng switch thôi. Không không, tiêu đề trên để cho vui thôi. Câu hỏi thực sự là “chúng ta có thể lập trình mà không sử dụng câu lệnh rẽ nhánh (conditional statement)?”.  Vâng, không dùng if-else, switch,…?

Từ thưở đầu học lập trình, ai trong chúng ta cũng biết những thứ căn bản nhất của một ngôn ngữ lập trình (NNLT): variable, array, conditional, loop statement. Lâu dần chúng ta coi đó là điều nghiễm nhiên của một NNLT. Nhưng bạn cần biết rằng, âu lệnh if-else còn nhiều điểm xấu xí khác, từ logic cho tới runtime speed, memory… nên một số NNLT hoàn toàn không có if-else.

Vậy thì sống làm sao? Làm sao để giải bài toán trên mà không dùng if-else? OOP – polymorphism là một giải pháp. Thử xem:

Không có gì huyền bí cả, bạn có thể tham khảo tại blog của Martin Fowler về pattern này.

Nếu bạn muốn thực hành nhiều hơn, có thể tìm đến Anti-IF pattern tại đây.

No if-else

Về lý thuyết, chúng ta hoàn toàn có thể lập trình mà không sử dụng if-else. Tại các buổi Code Retreat thường có 1 session mà LTV nhất định không sử dụng if-else khi lập trình ngay cả khi NNLT đó hỗ trợ. Mục tiêu là luyện tập khả năng ít phụ thuộc vào conditional statement để hình thành tư duy abstract. Như ví dụ trên, câu lệnh if-else thực sự quá mạnh mẽ, đến nỗi các LTV không thể tránh được cám dỗ, giải bài toán theo “số ít” và tạo ra những thiết kế sai lầm, vi phạm nguyên tắc open-closed cơ bản.

Nếu bạn chưa biết thực hành thế nào, hãy tới một buổi Code Retreat cho biết.

218 total views, 7 views today

Summer Code Retreat 2015 was organised by Agile Vietnam in August 1st at FPT university, Hanoi. And as normally we did with the Conway’s Game of life.

Some notes from the retrospective sessions by about 30 participants:

1st session

  • There is a communication issue in team
  • We are not familiar with this kind of problem, so spend too much time to find solution
  • The convention was not easy to apply to team

2nd session

  • Solution didn’t work and need to change to another in the end
  • Not good design and spend much time for refactor
  • Would try to use TDD but it didn’t work well

3rd session

  • Got issue with language difference in pair
  • Using rule (no if, no mouse..) seems hard to implement
  • Tried to use recursion instead of loop, it was hard but got a good experience
  • Tried to use TDD, and had the implementation that’s passed 2 test cases at end

4th session

  • Should have good name for a test case (which flow it runs, which is expected result)
  • Using text editor instead of IDE is very difficult
  • Would tried no conditional statements but didn’t work

Final session

  • It’s really fun but challenge when we choose 1 rule and follow
  • Good place, good food, good support
  • Should have more females 🙂
  • I will try to practise more next week

And..

We all know the purpose of Code Retreat that we forget the result-oriented doing by focusing on the on-going experience. Some people was surprised by the first look at some rules, “how we can do programming with conditional statements?”, “how we can make every methods under 8 lines?”… But nothing is impossible :).

No conditional statements? Yes, we can do with polymorphism. You could find it here or here.

No loop statements? Yes, we can do with recursion approach. You could find it here.

Of course, our possibility of implementing the solution without conditional statements doesn’t mean we are good at programming or not, it just shows we have tried with this skill and found a good experience during our implementation.

It’s a reference to Code Retreat, the Conway’s Game of life, and photos of Summer Code Retreat 2015 by Agile Vietnam.

77 total views, no views today