2008-11-25 43 views
7

thể trùng lặp:
How many parameters are too many?Có bao nhiêu tham số chức năng quá nhiều?

Tôi chỉ viết một chức năng mà mất trong một vài giá trị và nó đã cho tôi suy nghĩ. Khi nào số lượng các đối số cho một hàm/phương thức quá nhiều? Khi nào (nếu) nó báo hiệu một thiết kế sai lầm? Bạn có thiết kế/cấu trúc lại hàm để lấy các cấu trúc, mảng, con trỏ, v.v. để giảm số lượng đối số không? Bạn có refactor dữ liệu đến chỉ để giảm số lượng các đối số? Dường như điều này có thể là một chút ít áp dụng trong thiết kế OOP, mặc dù. Chỉ cần tò mò để xem cách người khác xem vấn đề.

EDIT: Để tham chiếu hàm tôi vừa viết đã lấy 5 tham số. Tôi sử dụng định nghĩa của một số giáo viên AP Econ của tôi đã cho tôi. Nhiều hơn 2; ít hơn 7.

+0

Cậu bé hy vọng anh ấy nói "ít hơn 7" –

Trả lời

-1

Tôi sẽ nói tối đa là 4. Bất cứ điều gì ở trên, tôi nghĩ rằng nên được đặt trong một lớp học.

+0

nếu nó là gì cho một hàm tạo lớp có 20 thuộc tính? – Blankman

+0

Thuộc tính không có tham số ... –

15

Theo Steve McConnell trong Code Complete, bạn nên

Giới hạn số lượng thông số của một thói quen để khoảng bảy

+0

Quạt lớn của cuốn sách đó – Uri

+0

Bảy có vẻ là một số không được vượt quá trong bất kỳ loại giao diện, thông số hoặc menuentries nào. – Jonke

+0

Bảy là số lượng thông tin có thể được lưu trữ trong bộ nhớ ngắn hạn.Ít nhất đó là những gì họ nói với tôi, nhưng tôi quên các chi tiết. –

16

Tôi không biết, nhưng tôi biết điều đó khi Tôi thấy nó.

+0

Xin lỗi không có phiếu bầu nào. Nhưng đây chỉ là nó. –

+1

Vì vậy, các thông số chức năng giống như nội dung khiêu dâm? –

+0

Ok, đó là một sự thay đổi thú vị của chủ đề. Nó đưa ra một ý nghĩa hoàn toàn khác cho phần mềm thuật ngữ ... –

1

Trả lời nhanh: Khi bạn phải dừng lại và đặt câu hỏi đó, bạn đã có quá nhiều.

Cá nhân tôi muốn giữ số dưới sáu. Nếu cần thêm, thì giải pháp phụ thuộc vào vấn đề. Một cách tiếp cận là sử dụng các hàm "setter" để cung cấp các giá trị cho một đối tượng mà cuối cùng sẽ thực hiện chức năng mà bạn mong muốn. Một tùy chọn khác là sử dụng cấu trúc, như bạn đã đề cập. Dù bằng cách nào, bạn có thể không thực sự đi sai.

+0

Tôi tin rằng đây là mô hình Lệnh. – moffdub

1

Vâng, điều đó chắc chắn sẽ phụ thuộc vào chức năng của bạn là bao nhiêu sẽ được coi là "quá nhiều". Có thể nói rằng, chắc chắn có thể có một hàm với rất nhiều tham số khác nhau là các tùy chọn về cách xử lý các trường hợp nhất định bên trong hàm và có quá tải cho các hàm đó với các giá trị mặc định sane cho các tùy chọn đó.

Với tính phổ biến của Intellisense (hoặc tương đương trong các IDE khác) và chú giải công cụ hiển thị các nhận xét từ Tài liệu XML trong Visual Studio, tôi không thực sự nghĩ rằng có một câu trả lời chắc chắn cho câu hỏi này.

1

Tham số quá nhiều là "Mã lỗi".

Bạn có thể chia thành nhiều phương pháp hoặc sử dụng lớp để nhóm lại biến có điểm chung.

Để đặt một số cho "Quá nhiều" là thứ rất chủ quan và phụ thuộc vào tổ chức của bạn và ngôn ngữ bạn sử dụng, Quy tắc chung là nếu bạn không thể đọc chữ ký của phương pháp và có ý tưởng những gì nó làm hơn là bạn có thể có quá nhiều thông tin. Personnaly, tôi cố gắng không đi qua 5 thông số.

+1

Bất kỳ lý do nào khiến bạn thích sử dụng các biến nhóm thành nhóm? Tôi nghĩ một cấu trúc sẽ hợp lý hơn ở đây. – RWendi

+0

Không phải tất cả ngôn ngữ đều phân biệt giữa các lớp và cấu trúc. –

4

Tôi thường tin rằng nếu các tham số liên quan đến chức năng (ví dụ: tọa độ hoặc thành phần màu), chúng phải được đóng gói như một lớp để có các biện pháp tốt.

Không phải là tôi luôn làm theo điều này bản thân mình;)

0

Đối với tôi là 5.

Thật khó có thể quản lý (nhớ tên, trật tự, vv) vượt ra ngoài đó. Plus Nếu tôi đi xa đến mức tôi có phiên bản với giá trị mặc định gọi là giá trị này.

0

Cũng phụ thuộc vào chức năng, nếu chức năng của bạn yêu cầu sự can thiệp hoặc biến của người dùng nặng, tôi sẽ không vượt quá phạm vi 7-8. Theo như số lượng trung bình của các thông số để đi với, 5-6 là điểm ngọt trong quan điểm của tôi. Nếu bạn đang sử dụng nhiều hơn bạn có thể muốn xem xét các đối tượng lớp như các tham số hoặc các hàm nhỏ khác.

0

Nó thay đổi từ người này sang người khác. Cá nhân, khi tôi gặp khó khăn ngay lập tức hiểu được những gì một cuộc gọi chức năng đang làm bằng cách đọc lời gọi trong mã, đó là thời gian để tái cấu trúc để có sự căng thẳng của các tế bào màu xám của tôi.

7

Nếu bạn phải hỏi thì đó có thể là quá nhiều.

0

Tôi đã nghe rằng 7 hình là tốt, nhưng tôi bằng cách nào đó cảm thấy rằng nó xuất phát từ một thời điểm khi tất cả các bạn có thể vượt qua nơi giá trị nguyên thủy.

Ngày nay, bạn có thể chuyển tham chiếu tới một đối tượng bao bọc một số trạng thái phức tạp (và hành vi). Sử dụng 7 trong số đó chắc chắn sẽ là quá nhiều.

Mục tiêu cá nhân của tôi là tránh sử dụng nhiều hơn 4.

0

Tùy thuộc vào loại đối số. Nếu chúng là tất cả các số nguyên thì 2 có thể là quá nhiều. (Làm cách nào để nhớ thứ tự nào?) Nếu bất kỳ đối số nào chấp nhận null, thì số lượng giảm mạnh.

Câu trả lời thực sự đến từ tự hỏi:

  • cách dễ dàng là nó để hiểu cuộc gọi khi tôi đang đọc mã?
  • Bạn có thể nhớ chính xác đối số và thứ tự đối số chính xác khi viết mã bằng cách nào?
2

Robert C. Martin (Bác Bob) khuyến cáo 3 như tối đa trong Clean Code: A Handbook of Agile Software Craftsmanship

Tôi không có cuốn sách với tôi vào lúc này nhưng lập luận của ông đã làm với một, hai và, để một mức độ thấp hơn, ba hàm đối số đọc tốt và hiển thị rõ ràng mục đích của hàm.

Điều này tất nhiên đi đôi với đề xuất của mình về các hàm rất ngắn, được đặt tên tốt tuân theo Single Responsibility Principal.

0

Và nó phụ thuộc ngôn ngữ lập trình .. Trong C, thật hiếm khi thấy các hàm có 7 tham số. Tuy nhiên, trong C#, tôi hiếm khi thấy hơn 5 tham số và cá nhân tôi thường sử dụng ít hơn 3 thông số.

// In C 
draw_dot(x, y, size, red, green, blue, alpha) 

// In C# 
Point point(x,y); 
Color color(red,green,blue,alpha); 

Tool.DrawDot(point, color); 
+0

Bạn có thể muốn thay thế C# bằng bất kỳ-OO: p (và Yeah, Phải có một nơi nào đó mới bị thiếu: p) – user35978

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