Đây không phải là một danh sách đầy đủ, nhưng hãy xem xét một số yếu tố sau đây khi quyết định liệu một đối tượng có nên được truyền cho một phương thức như là một đối số hay không:
Là đối tượng bất biến? Là chức năng 'tinh khiết'?
Tác dụng phụ là một xem xét quan trọng cho khả năng duy trì mã của bạn. Khi bạn thấy mã có rất nhiều đối tượng trạng thái có thể thay đổi được truyền đi khắp nơi, mã đó thường ít trực quan hơn (giống như cách các biến trạng thái toàn cầu thường có thể ít trực quan hơn) và việc gỡ lỗi thường trở nên khó khăn và mất thời gian hơn- tiêu thụ.
Như một quy tắc tự nhiên, nhằm mục đích đảm bảo, càng nhiều càng tốt, rằng bất kỳ đối tượng nào bạn truyền đến một phương thức rõ ràng là bất biến.
Tránh (một lần nữa, càng xa càng tốt) bất kỳ thiết kế nào theo đó trạng thái của một đối số dự kiến sẽ được thay đổi do kết quả của một cuộc gọi chức năng - một trong những lập luận mạnh mẽ nhất cho phương pháp này là Nguyên tắc tối thiểu ngạc nhiên ; tức là ai đó đang đọc mã của bạn và thấy một đối số được truyền vào một hàm là 'ít có khả năng' để mong đợi trạng thái của nó thay đổi sau khi hàm được trả về.
Có bao nhiêu đối số mà phương thức đã có?
Các phương thức có danh sách đối số quá dài (ngay cả khi hầu hết các đối số đó có giá trị 'mặc định') bắt đầu trông giống như mùi mã. Tuy nhiên, đôi khi các chức năng như vậy là cần thiết và bạn có thể xem xét việc tạo một lớp có mục đích duy nhất là hoạt động như một Đối tượng tham số .
Cách tiếp cận này có thể liên quan đến một lượng nhỏ ánh xạ mã soạn sẵn bổ sung từ đối tượng 'nguồn' của bạn sang đối tượng tham số của bạn, tuy nhiên, đó là một chi phí khá thấp cả về hiệu suất và độ phức tạp, tuy nhiên, có một số lợi ích về việc tách rời và đối tượng bất biến.
Đối tượng được truyền có thuộc về một "lớp" trong ứng dụng của bạn không (ví dụ: ViewModel hoặc Thực thể ORM?)
Hãy suy nghĩ về Tách biệt mối quan tâm (SoC) . Đôi khi, hãy tự hỏi liệu đối tượng "thuộc" của cùng một lớp hoặc mô-đun trong đó phương thức của bạn tồn tại (ví dụ: thư viện trình bao bọc API cuộn tay hoặc Lớp logic nghiệp vụ cốt lõi của bạn, v.v.) có thể thông báo liệu đối tượng đó có thực sự được chuyển đến đó không phương pháp.
SoC là một nền tảng tốt để viết mã mô-đun sạch, kết hợp lỏng lẻo. ví dụ: một đối tượng thực thể ORM (ánh xạ giữa mã của bạn và lược đồ cơ sở dữ liệu của bạn) lý tưởng không nên được chuyển xung quanh trong lớp doanh nghiệp của bạn hoặc tệ hơn trong lớp trình bày / giao diện người dùng của bạn.
Trong trường hợp truyền dữ liệu giữa các 'lớp', việc có các tham số dữ liệu đơn giản được truyền vào một phương thức thường được ưu tiên hơn là truyền vào một đối tượng từ lớp 'sai'. Mặc dù có lẽ nên có các mô hình riêng biệt tồn tại ở lớp 'bên phải' mà bạn có thể ánh xạ thay thế.
Là chức năng chính nó quá lớn và / hoặc phức tạp?
Khi một hàm cần nhiều mục dữ liệu, có thể đáng để xem xét liệu hàm đó có đảm nhận quá nhiều trách nhiệm hay không; tìm kiếm các cơ hội tiềm năng để tái cấu trúc bằng cách sử dụng các đối tượng nhỏ hơn và các hàm ngắn hơn, đơn giản hơn.
Hàm nên là một đối tượng lệnh / truy vấn?
Trong một số trường hợp, mối quan hệ giữa dữ liệu và chức năng có thể gần gũi; trong những trường hợp đó, hãy xem xét liệu Đối tượng lệnh hay Đối tượng truy vấn sẽ phù hợp.
Việc thêm một tham số đối tượng vào một phương thức có buộc lớp chứa phải chấp nhận các phụ thuộc mới không?
Đôi khi, đối số mạnh nhất cho các đối số "Dữ liệu cũ đơn giản" chỉ đơn giản là lớp nhận đã được khép kín gọn gàng và việc thêm một tham số đối tượng vào một trong các phương thức của nó sẽ gây ô nhiễm cho lớp (hoặc nếu lớp đã bị ô nhiễm, thì nó sẽ bị ô nhiễm làm cho entropy hiện tại tồi tệ hơn)
Bạn có thực sự cần phải vượt qua một đối tượng hoàn chỉnh hay bạn chỉ cần một phần nhỏ trong giao diện của đối tượng đó?
Hãy xem xét Nguyên tắc phân chia giao diện liên quan đến các chức năng của bạn - tức là khi truyền vào một đối tượng, nó chỉ nên phụ thuộc vào các phần của giao diện của đối số mà nó (hàm) thực sự cần.