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.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
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