You need to return more than one object
TL;DR: Don't return multiple values.
Problems
Missing Abstraction
Readability
Extensibility
Solutions
Create a return object grouping the tuple
Reify it into an object with cohesion and behavior (not a DTO or Dictionary)
Look for the object in the real world using the MAPPER
try to return void and delegate the solution to the modified object avoiding accidental mutations
Context
A function returning multiple values in languages that allow it is a problem.
Developers can use this hack to avoid reifying concepts.
Some languages are: Javascript, Go, Lua, Matlab, PHP, Python, Rust, and Swift
Sample Code
Wrong
func getNameAndAge() -> (String, Int) {
let name = "John"
let age = 30
return (name, age)
}
Right
struct PeopleProfile {
let name: String
let age: Int
}
// We reify the PeopleProfile object
func getNameAndAge() -> PeopleProfile {
let name = "John"
let age = 30
let profile = PeopleProfile(name: name, age: age)
return profile
}
Detection
[X] Automatic
This is a language smell.
We can tell our linters to warn us.
Tags
- Coupling
Conclusion
This is yet another language feature that hinders clean code and blinds us from seeing missing abstractions in the Bijection.
Relations
Code Smell 10 - Too Many Arguments
Maxi Contieri ・ Oct 29 '20
More Info
Disclaimer
Code Smells are my opinion.
Credits
Photo by Edgar Soto on Unsplash
By relieving the brain of all unnecessary work, a good notation sets it free to concentrate on more advanced problems, and in effect increases the mental power of the race. Before the introduction of the Arabic notation, multiplication was difficult, and division even of integers called into play the highest mathematical faculties. Our modern power of easy reckoning with decimal fractions is the almost miraculous result of the gradual discovery of a perfect notation.
Alfred North Whitehead
Software Engineering Great Quotes
Maxi Contieri ・ Dec 28 '20
This article is part of the CodeSmell Series.
Top comments (6)
Using
javascript
andbeginners
tags for articles not intended for beginners and tangentially related to JavaScript is a technical writing smell here on dev, smells like a miserable marketing attemptI think every begginner should know this before starting making this mistakes like many seniors do.
I have removed Javascript tag since it is not solely related to this language, Tough it applies to JS as well
Golang's
return nill, err
goes BRRRR...With all honesty, I don't think this is not a code smell at all. Having to bundle multi-value returns into objects will result in a bunch of "nothing objects" and DTOs. You have to maintain them, depending on the language you have to export them, and obviously you have to name them (I really like meaningless object names such as
SomethingResult
,SomethingPair
or even worse, just simplyRes
). At some point somebody will take thisRes
class and dump it in a globally sharedutils
package. At this point there is difference between using a tuple from a standard library or using the stuff from myutils
. Just please use the tuple then....Coming back to Golang, the idiomatic way of handling errors is to return them. In most cases this will result in multiple returned values. Regardless if we consider this good or bad choice, it does not really matter. But it is certainly not a code smell.
Hi
Dtos are another code smell
Code Smell 40 - DTOs
Maxi Contieri ・ Dec 2 '20
They don't need to be anemic.
Just find the cohesive behavior of the DTO
I wasn't aware of golang convention. I will update the article.
Thank you
What are your thoughts on Python's
namedtuple
that gives names to the components of the tuple?They are as anemic as DTOS
Code Smell 27 - Associative Arrays
Maxi Contieri ・ Nov 18 '20
The key is to find the missing behavior
I will also add them to the article. Thank you