Giới thiệu
Hôm nay là một buổi sáng Chủ nhật yên tĩnh, và tôi đang mày mò với dự án bên lề của mình. Khi nhìn vào đối tượng dịch vụ mà tôi đang viết, tôi nhận thấy một mẫu lặp lại… lại một lần nữa.
Vấn đề hiện tại
ruby
# Đây là những gì tôi thường làm.
class UserService
def self.create(name:, email:, permissions:)
new(name: name, email: email, permissions: permissions).save
end
def initialize(name:, email:, permissions:)
@name = name
@email = email
@permissions = permissions
end
def save
puts "Đang lưu người dùng #{@name}..."
end
end
Bạn thấy phương thức self.create chứ? Tất cả những gì tôi thực sự làm là lấy các đối số và chuyển chúng thẳng đến new. Nó hoạt động, nhưng cảm giác thật lộn xộn. Mỗi khi tôi thêm một đối số mới vào initialize, chẳng hạn như tham số age, tôi phải cập nhật nó ở hai nơi. Đó là một phiền phức nhỏ ngày hôm nay, nhưng ngày mai có thể trở thành một công thức cổ điển cho các lỗi.
Giải pháp: Cú pháp chuyển tiếp đối số
Một cách nào đó, tôi đã đọc về cú pháp chuyển tiếp đối số của Ruby (...). Tôi cần ghi nhớ điều này vì nó làm mọi thứ trở nên dễ dàng hơn rất nhiều.
Dưới đây là cách viết lại cho chính tôi trong tương lai:
ruby
# Đây là cách tôi nên làm.
class UserService
def self.create(...)
new(...).save # <-- Thật tốt hơn nhiều
end
def initialize(name:, email:, permissions:)
@name = name
@email = email
@permissions = permissions
end
def save
puts "Đang lưu người dùng #{@name}..."
end
end
Phương thức self.create(...) nói rằng, "Lấy bất cứ điều gì đến," và new(...) trả lời, "Chuyển tất cả đi." Sạch sẽ. Đơn giản. Xong.
Tại sao điều này tốt hơn
- Tuân thủ nguyên tắc DRY. Không còn phải lặp lại
name:, email:, permissions:hai lần. Ít gõ hơn, ít lộn xộn hơn. - Tính linh hoạt. Nếu tôi thêm
age:vàoinitialize,self.createkhông cần thay đổi gì cả. Cú pháp chuyển tiếp đối số tự động xử lý điều đó. - Bao quát mọi thứ. Các đối số theo vị trí, đối số theo từ khóa, thậm chí cả các khối. Toán tử
...sẽ chuyển tiếp tất cả.
Ví dụ thực tế
Giả sử bạn đang xây dựng một ứng dụng quản lý người dùng, và bạn cần thêm một trường mới là age. Vậy thì bạn chỉ cần thêm nó vào phương thức khởi tạo mà không cần phải thực hiện bất kỳ thay đổi nào ở nơi gọi phương thức create.
ruby
def self.create(name:, email:, permissions:, age:)
new(name: name, email: email, permissions: permissions, age: age).save
end
Mẹo hiệu suất
- Giữ cho mã sạch. Sử dụng cú pháp chuyển tiếp đối số giúp mã của bạn ngắn gọn và dễ bảo trì hơn.
- Áp dụng cho các tình huống khác nhau. Bạn có thể áp dụng cú pháp này cho các hàm và lớp khác nhau trong dự án của mình.
Lỗi phổ biến
- Quên thêm đối số mới vào phương thức khởi tạo. Hãy nhớ rằng bạn cần đảm bảo mọi đối số mới đều được thêm vào đúng cách.
- Sử dụng không đúng cú pháp. Đảm bảo rằng bạn sử dụng đúng cú pháp chuyển tiếp đối số như đã mô tả ở trên.
Kết luận
Sử dụng cú pháp ... để chuyển tiếp đối số không chỉ giúp mã của bạn sạch hơn mà còn giảm thiểu rủi ro gây ra lỗi khi thay đổi các tham số trong tương lai. Hãy thử áp dụng vào các dự án của bạn ngay hôm nay để cảm nhận sự khác biệt!
Câu hỏi thường gặp (FAQ)
-
Cú pháp chuyển tiếp đối số là gì?
Cú pháp chuyển tiếp đối số cho phép bạn lấy tất cả các đối số được truyền vào một phương thức và chuyển tiếp chúng đến một phương thức khác mà không cần liệt kê từng đối số một. -
Làm thế nào để sử dụng cú pháp này trong mã của tôi?
Bạn chỉ cần thay thế các đối số trong phương thức của bạn bằng...và đảm bảo rằng phương thức mà bạn đang gọi cũng hỗ trợ cú pháp này. -
Điều gì sẽ xảy ra nếu tôi cần can thiệp vào một đối số?
Bạn có thể dễ dàng lấy một đối số cụ thể và chuyển tiếp các đối số còn lại bằng cách chỉ định chúng rõ ràng trong tham số.
Hãy bắt đầu áp dụng cú pháp này vào mã của bạn ngay hôm nay để trở thành một lập trình viên Ruby hiệu quả hơn!