Discussion: Functions with many parameters #239
Replies: 11 comments 1 reply
-
My first thought would be, would it make sense for the parameters to be part of a struct that you construct and pass in? It would depend on what the actual parameters represent of course. Another option could potentially be the builder pattern. Something like this: foo()
.parameter_0(1)
.parameter_1(2)
.parameter_2(3)
.parameter_3(4)
.parameter_4(5)
.parameter_5(6)
.parameter_6(7)
.build(); EDIT: See #64 for reasons against builder patterns for some use cases. |
Beta Was this translation helpful? Give feedback.
-
And choose the parameter names well, so that you can maximize field puns. If you're okay with nightly then |
Beta Was this translation helpful? Give feedback.
-
And how would you deal with mandatory parameters? |
Beta Was this translation helpful? Give feedback.
-
I don't think I'd use it in that case. |
Beta Was this translation helpful? Give feedback.
-
@longfellowone Do you have a required flow of the parameters? Then there could be multiple structs (like a state machine) to ensure them have each mandatory parameter. Like most of the http crates that we have, it is required to have a url before sending. |
Beta Was this translation helpful? Give feedback.
-
foo("mandatory1", "mandatory2")
.parameter_0(1)
.parameter_1(2)
.parameter_2(3)
.parameter_3(4)
.parameter_4(5)
.parameter_5(6)
.parameter_6(7)
.build(); |
Beta Was this translation helpful? Give feedback.
-
I am thinking about how to solve this issue. |
Beta Was this translation helpful? Give feedback.
-
What I have is a mathematical calculation that requires about 7 mandatory parameters that have no reasonable defaults. And 5 parameters that are optional |
Beta Was this translation helpful? Give feedback.
-
Put those 7 parameters in a struct and give the struct to foo |
Beta Was this translation helpful? Give feedback.
-
Here's another idea: fn foo(
parameter_0: type,
parameter_1: type,
parameter_2: type,
parameter_3: type,
parameter_4: type,
parameter_5: type,
parameter_6: type
) -> type {
// function body
} that's what I've been doing in the years since I opened this |
Beta Was this translation helpful? Give feedback.
-
Some thoughts:
pub struct FooDescriptor {
parameter_0: type,
parameter_1: type,
parameter_2: Option<type>,
parameter_3: type,
parameter_4: type,
parameter_5: type,
parameter_6: Option<type>,
}
impl Default for FooDescriptor {
// default()
}
fn foo(FooDescriptor) -> type {
// function body
}
fn main() {
let _ = foo(FooDescriptor::default());
} That would make it easy to use optional arguments, have the arguments in one place, and would make it possible to define default parameters. Examples: |
Beta Was this translation helpful? Give feedback.
-
Requesting a design pattern for functions that take lots of parameters. For example this way:
is a way that I think should be an anti-pattern because it's too wide. I prefer things to be less than 80 chars wide.
Beta Was this translation helpful? Give feedback.
All reactions