Khi lập trình, bạn có thể gặp phải những tình huống mà chương trình của bạn không xử lý tốt. Đây được gọi là "trường hợp biên" (edge case).
Dưới đây là cách bạn có thể sửa mã của mình khi gặp một trường hợp như vậy:
Hãy tưởng tượng bạn có một ứng dụng blog nơi người dùng có thể tạo bài viết. Bạn muốn hiển thị tiêu đề của bài đăng gần đây nhất trên trang chủ. Mã ban đầu của bạn có thể trông như thế này:
class HomeController < ApplicationController
def index
@latest_post_title = Post.order(created_at: :desc).first.title
end
end
Điều này hoạt động tốt miễn là có ít nhất một bài đăng. Nhưng nếu chưa có bài đăng nào thì sao? Đây là một trường hợp biên sẽ gây ra lỗi.
Để sửa nó, bạn có thể sửa đổi mã như sau:
class HomeController < ApplicationController
def index
@latest_post_title = Post.order(created_at: :desc).first&.title || "Chưa có bài đăng nào"
end
end
Bây giờ, nếu không có bài đăng nào, thay vì bị lỗi, ứng dụng của bạn sẽ hiển thị "Chưa có bài đăng nào" trên trang chủ.
Không xử lý trường hợp biên:
def divide(numerator, denominator)
numerator / denominator
end
Vấn đề: Điều này sẽ gây ra lỗi ZeroDivisionError nếu denominator bằng không.
Có xử lý trường hợp biên:
def safe_divide(numerator, denominator)
return 0 if denominator.zero?
numerator / denominator
end
Giải pháp: Chúng ta kiểm tra xem mẫu số có bằng không hay không trước khi thực hiện phép chia, trả về 0 trong trường hợp đó.
Không xử lý trường hợp biên:
def get_page_number(params)
params[:page].to_i
end
Vấn đề: Điều này có thể trả về 0 hoặc số âm, không phải là số trang hợp lệ.
Có xử lý trường hợp biên:
def get_page_number(params)
page = params[:page].to_i
page.positive? ? page : 1
end
Không xử lý trường hợp biên:
def date_range_filter(start_date, end_date)
start_date..end_date
end
Vấn đề: Điều này không xử lý đầu vào nil hoặc đảm bảo start_date trước end_date.
Có xử lý trường hợp biên:
def date_range_filter(start_date, end_date)
start_date = start_date.presence || 30.days.ago.to_date
end_date = end_date.presence || Date.today
[start_date, end_date].min..[start_date, end_date].max
end
Giải pháp: Chúng ta cung cấp giá trị mặc định cho đầu vào nil và đảm bảo khoảng luôn từ ngày sớm hơn đến ngày muộn hơn.