Một cuộc thảo luận gần đây trong cộng đồng TypeScript đã gây ra tranh cãi về các phương pháp tốt nhất để quản lý các hàm có nhiều tham số tùy chọn. Cuộc trò chuyện tập trung vào việc triển khai các đối số từ khóa theo kiểu Python trong TypeScript , nhưng các nhà phát triển chia rẽ về việc liệu các giải pháp được đề xuất có đáng với sự phức tạp gia tăng hay không.
Vấn đề cốt lõi: Quá tải tham số
Vấn đề bắt đầu khi các hàm TypeScript phát triển vượt ra ngoài các chữ ký đơn giản. Trong khi một hàm có một hoặc hai tham số vẫn có thể quản lý được, việc thêm nhiều đối số tùy chọn tạo ra các vấn đề về khả năng đọc. Các nhà phát triển thường thấy mình phải truyền các giá trị undefined để bỏ qua các tham số trước đó, khiến các lời gọi hàm trở nên khó hiểu và gỡ lỗi.
Bài viết gốc đề xuất sử dụng object destructuring với các giá trị mặc định để mô phỏng các đối số từ khóa của Python . Phương pháp này bao gồm việc tạo một object options làm tham số thứ hai, cho phép các nhà phát triển chỉ định chỉ những đối số họ cần theo tên.
Các Mẫu Tham Số TypeScript Phổ Biến:
• Hàm đơn giản: fn(arg1, arg2)
- cho 1-2 tham số
• Đối tượng tùy chọn: fn({ arg1, arg2, arg3, ... })
- cho nhiều tham số
• Phương pháp kết hợp: fn(mainArg, { ...optionObject })
- tham số chính cộng với các tùy chọn
• Kiểu kwargs: fn(name, { prefix = "Hello", ending = "." }: { prefix?: string; ending?: string } = {})
- destructuring với chú thích kiểu dữ liệu
Cộng đồng phản đối sự phức tạp cú pháp
Tuy nhiên, nhiều nhà phát triển trong cộng đồng thấy giải pháp này quá phức tạp. Lời chỉ trích chính tập trung vào cú pháp dài dòng được yêu cầu ở phía định nghĩa hàm. Để đạt được tính an toàn kiểu phù hợp, các nhà phát triển phải định nghĩa cấu trúc tham số hai lần - một lần cho destructuring với các giá trị mặc định và một lần cho chú thích kiểu TypeScript .
Tôi không thích việc nó trở nên quá rối rắm. Điều tôi làm là nếu tôi cần nhiều hơn một vài đối số, tôi chỉ chấp nhận một object.
Quan điểm này phản ánh sự ưa thích rộng rãi hơn đối với các lựa chọn thay thế đơn giản hơn. Nhiều nhà phát triển đề xuất rằng một khi một hàm cần nhiều hơn hai hoặc ba tham số, phương pháp tốt hơn là chấp nhận một options object duy nhất và xử lý các giá trị mặc định trong thân hàm.
Các phương pháp thay thế được ưa chuộng
Cuộc thảo luận cộng đồng tiết lộ một số mẫu được ưa thích. Lựa chọn thay thế phổ biến nhất bao gồm việc chỉ chấp nhận một options object cho các hàm có nhiều tham số, sau đó giải quyết các giá trị mặc định ở đầu hàm. Phương pháp này tách biệt các định nghĩa kiểu khỏi logic giá trị mặc định, làm cho mã dễ bảo trì hơn.
Một số nhà phát triển ủng hộ các phương pháp thậm chí còn nghiêm ngặt hơn, đặt câu hỏi về việc liệu các giá trị mặc định có nên được sử dụng trong nhiều trường hợp hay không. Họ lập luận rằng việc buộc các nhà phát triển phải chỉ định rõ ràng tất cả các tham số dẫn đến mã đáng tin cậy hơn và ít lỗi hơn trong sản xuất.
Cuộc tranh luận triết lý thiết kế rộng hơn
Cuộc thảo luận mở rộng ra ngoài sở thích cú pháp đến các câu hỏi cơ bản về thiết kế API . Một số thành viên cộng đồng tin rằng việc làm cho các tham số rõ ràng, ngay cả khi dài dòng, dẫn đến chất lượng mã tốt hơn và ít lỗi runtime hơn. Những người khác ưu tiên trải nghiệm nhà phát triển và tính ngắn gọn của mã.
Cuộc tranh luận làm nổi bật một thách thức phổ biến trong phát triển TypeScript : cân bằng tính an toàn kiểu, khả năng đọc và khả năng bảo trì. Trong khi phương pháp kiểu kwargs được đề xuất mang lại một số lợi ích, phản ứng của cộng đồng cho thấy rằng các giải pháp đơn giản hơn thường chứng minh là thực tế hơn trong các ứng dụng thực tế.
Cuộc thảo luận chứng minh cách các cộng đồng ngôn ngữ lập trình liên tục phát triển các thực hành tốt nhất của họ, cân nhắc các sự đánh đổi giữa các phương pháp khác nhau dựa trên kinh nghiệm thực tế thay vì sự thanh lịch lý thuyết.
Tham khảo: Python-style kwargs in TypeScript