Objects or Functions need too many arguments to work.
TL;DR: Don't pass more than three arguments to your functions.
Problems
Low maintainability
Low Reuse
Coupling
Solutions
Find cohesive relations among arguments
Create a "context".
Consider using a Method Object Pattern.
Avoid "basic" Types: strings, arrays, integers, etc. Think on objects.
Exceptions
- Operations in real world needing not cohesive collaborators.
Sample Code
Wrong
public class Printer {
void print(String documentToPrint,
String papersize,
String orientation,
boolean grayscales,
int pagefrom,
int pageTo,
int copies,
float marginLeft,
float marginRight,
float marginTop,
float marginBotton
){
}
}
Right
final public class PaperSize {
//...
}
final public class Document {
//...
}
final public class PrintMargins {
//...
}
final public class PrintRange {
//...
}
final public class ColorConfiguration {
//...
}
final public class PrintOrientation {
//...
}
final public class PrintSetup {
public PrintSetup(PaperSize papersize,
PrintOrientation orientation,
ColorConfiguration color,
PrintRange range,
int copiesCount,
PrintMargins margins
){}
}
final public class Printer {
void print(Document documentToPrint,
PrintSetup setup
){
}
}
Detection
Most linters warn when the arguments list is too large.
Tags
- primitive
Conclusion
Relate arguments and group them.
Always favor real world mappings. Find in real world how to group the arguments in cohesive objects.
If a function gets too many arguments, some of them might be related to the class construction. This is a design smell too.
Relations
Credits
Photo by Tobias Tullius on Unsplash
This article is part of the CodeSmell Series.
How to Find the Stinky parts of your Code
Maxi Contieri ・ May 21 '21
Last update: 2021/06/13