2012-03-30 35 views
5

Tôi đã xem xét một số mã của một nhà phát triển đồng nghiệp và gần như đã khóc. Trong định nghĩa phương thức có 12 đối số. Từ kinh nghiệm của tôi ... điều này không tốt. Nếu là tôi, tôi sẽ gửi một vật thể nào đó.Cách nào tốt hơn để tạo một phương thức có nhiều đối số? (10+?)

Có cách nào khác/ưa thích hơn để làm điều này (nói cách khác, cách tốt nhất để khắc phục điều này và giải thích lý do) là gì?

public long Save (
    String today, 
    String name, 
    String desc, 
    int ID, 
    String otherNm, 
    DateTime dt, 
    int status, 
    String periodID, 
    String otherDt, 
    String submittedDt 
) 

bỏ qua tên biến nghèo của tôi - họ là những ví dụ

+1

Các đối số có liên quan theo một cách nào đó không? Nếu có, hãy nhóm chúng vào một đối tượng mô tả ngữ nghĩa. Hy vọng nó giúp. –

+0

Tôi nghĩ đây là một câu hỏi hợp lý, tại sao có hai phiếu để đóng nó? – Cody

Trả lời

5

Điều này phụ thuộc rất nhiều vào ngôn ngữ.

Trong một ngôn ngữ mà không cần thời gian biên dịch typechecking (ví dụ như trăn, javascript, vv), bạn nên sử dụng đối số từ khóa (thường gặp ở trăn: bạn có thể truy cập chúng như một cuốn từ điển thông qua tại như một đối số) hoặc đối tượng/từ điển bạn tự chuyển vào dưới dạng đối số (phổ biến trong javascript). Tuy nhiên, "đối số địa ngục" bạn mô tả đôi khi "đúng cách để làm việc" cho một số ngôn ngữ nhất định với thời gian biên dịch typechecking, bởi vì sử dụng các đối tượng sẽ obfuscate ngữ nghĩa từ typechecker. Giải pháp sau đó sẽ là sử dụng một ngôn ngữ tốt hơn với tính năng đánh máy thời gian biên dịch cho phép khớp mẫu với các đối tượng dưới dạng đối số.

2

Vâng, đối tượng sử dụng. Ngoài ra, chức năng có thể làm quá nhiều nếu nó cần tất cả thông tin này, vì vậy hãy sử dụng các hàm nhỏ hơn.

+1

Đó là những gì tôi nghĩ. Nó thực sự chỉ chèn dữ liệu vào một bảng .. – Cody

1

Tùy thuộc vào mức độ phức tạp của hàm. Nếu nó làm điều gì đó không tầm thường với mỗi đối số, thì có lẽ nó nên được chia nhỏ. Nếu nó chỉ vượt qua họ, họ có lẽ nên được thu thập trong một đối tượng. Nhưng nếu nó chỉ tạo ra một hàng trong một bảng, nó không thực sự lớn. Đó là ít hơn một thỏa thuận nếu ngôn ngữ của bạn hỗ trợ các đối số từ khóa.

1

Sử dụng các đối tượng.

class User { ... } 
User user = ... 
Save(user); 

Quyết định này cung cấp cách dễ dàng để thêm thông số mới.

0

Tôi tưởng tượng vấn đề bạn đang gặp phải là có thể xem cuộc gọi phương thức và biết đối số nào đang nhận được giá trị nào. Đây là một vấn đề nguy hiểm trong một ngôn ngữ như Java, mà thiếu một cái gì đó như đối số từ khóa hoặc băm JSON để vượt qua các đối số được đặt tên.

Trong trường hợp này, Builder pattern là giải pháp hữu ích. Đó là đối tượng nhiều hơn, tổng cộng ba, nhưng dẫn đến mã dễ hiểu hơn cho vấn đề bạn đang mô tả. Vì vậy, ba đối tượng trong trường hợp này sẽ là như vậy:

  1. Thing: thực thể stateful, thường không thay đổi (tức là chỉ thu khí)
  2. ThingBuilder: lớp nhà máy, tạo ra một thực thể Thing và thiết lập giá trị của nó .
  3. ThingDAO: không cần thiết để sử dụng mẫu Trình xây dựng nhưng đề cập đến câu hỏi của bạn.

Interaction

/* 
ThingBuilder is a static inner class of Thing, where each of its 
"set" method calls returns the ThingBuilder instance being worked with 
while the final "build()" call returns the instantiated Thing instance. 
*/ 
Thing thing = Thing.createBuilder(). 
       .setToday("2012/04/01") 
       .setName("Example") 
       // ...etc... 
       .build(); 

// the Thing instance as get methods for each property 
thing.getName(); 

// get your reference to thingDAO however it's done 
thingDAO.save(thing); 

Kết quả là bạn sẽ có được tên đối số và một thể hiện không thay đổi.

Các vấn đề liên quan