Một giải pháp để ngừng sử dụng mệnh đề If - Else

04:07 18-06-2021BKAP Media

Ngay bây giờ, hãy thay thế If - Else bằng state objects.

Lưu ý chỉ sử dụng phương pháp này nếu bạn đang viết một class có các phương thức cần thay đổi giai đoạn triển khai tùy thuộc vào trạng thái. Nếu bạn không đối phó với trạng thái thay đổi của đối tượng (object’s changing state) thì bạn cần một cách tiếp cận khác.

Triển khai bằng If - Else, bạn sẽ tăng độ phức tạp nếu yêu cầu có điều kiện mới. Khi áp dụng state pattern để thay đổi object behavior, bạn chỉ cần sử dụng các state objects chuyên biệt thay vì các câu lệnh If - Else.

Đã qua rồi cái thời code trông như thế này:

Poor if-else statements

Logic phân nhánh ở đây không quá phức tạp, nhưng hãy thử thêm các điều kiện mới: bạn sẽ thấy mọi thứ rối tung.

Nếu bạn cảm thấy khó chịu khi tạo các class mới thay vì sử dụng các câu lệnh rẽ nhánh, hãy đợi đến khi bạn thấy nó hoạt động. Rất ngắn gọn và trang nhã. Hơn nữa nó sẽ làm codebase của bạn vững chắc hơn.

Bây giờ, chúng ta cùng xem qua cách thay thế phân nhánh If - Else trong production-ready code. Đó chỉ là một ví dụ, nhưng cách tiếp cận tương tự với khi làm codebase cho các khách hàng lớn.

Hãy tạo một class booking đơn giản với một số trạng thái. Nó sẽ có 2 phương thức công khai: Accept () và Cancel ().

Bên dưới là sơ đồ các trạng thái khác nhau có thể có của một booking.

Image for post

Tái cấu trúc logic phân nhánh là một quy trình ba bước:

  1. Tạo một class state trừu tượng
  2. Triển khai mỗi state như một class riêng biệt kế thừa từ state cơ sở
  3. Để cho class booking có một phương thức private/internal lấy class state cơ sở làm tham số

Bắt đầu demo

Đầu tiên, chúng ta cần một class state cơ sở để tất cả các state kế thừa.

Image for post

Lưu ý rằng class cơ sở này cũng có hai phương thức, Accept và Cancel - mặc dù ở đây chúng được đánh dấu là nội bộ.

Ngoài ra, base state có một phương thức EnterState(Booking booking) đặc biệt. Phương thức này được gọi bất cứ khi nào một state mới được gán cho booking.

Thứ hai, chúng ta tạo các class riêng biệt cho từng state mà chúng ta muốn đại diện.

Image for post

Chú ý cách mỗi class đại diện cho một state như được mô tả trong sơ đồ trên. Ngoài ra, CancellingState sẽ không cho phép booking của chúng ta chuyển sang trạng thái mới. Class này có tinh thần rất giống với Mẫu đối tượng Null (Null object pattern).

Cuối cùng là booking class.

Image for post

Booking class chỉ đơn giản là ủy quyền việc thực hiện Accept và Cancel cho state object của nó.

Làm thế này cho phép chúng ta loại bỏ phần lớn logic có điều kiện và cho phép mỗi state chỉ tập trung vào những gì quan trọng với chính nó - state hiện tại cũng có cơ hội chuyển booking sang state mới.

Cách lập trình với các tính năng có điều kiện mới này?

Nếu tính năng mới thường được triển khai bằng cách sử dụng một số kiểm thử điều kiện, thì bây giờ bạn có thể tạo một state class mới. Đơn giản vậy đấy. Bạn không còn phải đối phó với các câu lệnh if-else khó sử dụng nữa.

Cách để duy trì state object trong database? Câu trả lời là không cần. State object là yếu tố không quan trọng khi lưu một object vào cơ sở dữ liệu SQL. Biết state của object và cách nó được map vào một cột mới là điều quan trọng.

Bạn có thể map một state thành một cái tên thân thiện, enum hoặc số nguyên. Chọn cách làm bạn thấy thoải mái, miễn là bạn có thể chuyển đổi giá trị đã lưu trở lại thành state object.

Nhưng bạn vẫn đang sử dụng các câu lệnh If?

Đúng là chúng rất cần thiết, đặc biệt khi làm mệnh đề bảo vệ. Chính sự kết hợp If - Else là nguyên nhân gốc rễ gây ra vấn đề về khả năng maintain.

Vấn đề là cần thêm rất nhiều class bổ sung!

Đúng vậy. Sự phức tạp không bắt nguồn từ số lượng class bạn có, mà từ trách nhiệm mà các class đó đảm nhận. Có nhiều class chuyên biệt sẽ làm cho codebase của bạn dễ đọc hơn, dễ maintain hơn và đơn giản là giúp bạn thoải mái hơn nhiều khi làm việc.

BKAPers thấy phương pháp mới này thế nào? Hy vọng bài viết đã cung cấp cho các bạn một lựa chọn mới khi code!

Bachkhoa-Aptech là đơn vị trực thuộc Aptech Ấn Độ - tập đoàn Công nghệ thông tin (CNTT) hàng đầu trên thế giới. Thương hiệu Aptech đã liên tục 19 năm nhận giải thưởng TOP ICT cho đơn vị đào tạo CNTT xuất sắc nhất Việt Nam. 

  • Địa chỉ: 236B & 250 Hoàng Quốc Việt, Bắc Từ Liêm, Hà Nội
  • Hotline: 0968 27 6996
  • Email: tuyensinh@bachkhoa-aptech.edu.vn

Bachkhoa-Aptech - Tự hào 19 năm kiến tạo IT chất lượng cao

10 suất học bổng Kiến tạo IT Leader 2,5 năm tài trợ 100% học phí: THI TUYỂN LỚP CHẤT LƯỢNG CAO - IT LEADER 4.0 (bachkhoa-aptech.edu.vn)

#BachkhoaAptech #Làmtrướchọcsau #ITleader

   0968276996