Coding: The collecting parameter pattern
The collecting parameter pattern is one of my favourite ones when used well but I’ve noticed recently that it can lead to quit misleading APIs as well.
One way that we used it quite effectively was when getting objects to render themselves to a ViewData container which was then used to populate the view.
public class Micro {
private string micro;
public Micro(string micro) {
this.micro = micro;
}
public void renderTo(ViewData viewData) {
viewData.add(micro);
}
}
I think it’s quite obvious from the method name what it does and we can easily test this method by checking on the contents of the value passed in after the method’s been executed.
The problem I’ve noticed with this pattern is when the method isn’t so explicit about what it’s doing or where a method is using a collecting parameter as well as returning a value.
For example:
public SomeModel GetModel(ViewData viewData)
{
viewdata["someKey"] = "someValue;
// do some other stuff
return new SomeModel(...);
}
It’s not entirely obvious from reading the method signature that it would be mutating the 'ViewData' that’s been passed in. I would actually expect that 'SomeModel' is being constructed from 'ViewData' if I just read the method signature in isolation. It’s almost like it’s following the collecting parameter pattern by accident.
In a way I find that API as misleading as ones which make use of an 'out' parameter to allow multiple values to be returned - it doesn’t do what you expect, its intent is not clear.
Since I’ve started playing around with functional programming languages I’ve become more keen on the idea that functions take in inputs and return outputs and this pattern goes against that idea by encouraging mutation of state.
It seems to me that for the most part writing functions which return a value and don’t do anything else reveal their intent more and for the less frequent occasions where we want to keep encapsulation but still find out some data about an object the collecting parameter pattern works pretty well. It should be used sparingly though.
About the author
I'm currently working on short form content at ClickHouse. I publish short 5 minute videos showing how to solve data problems on YouTube @LearnDataWithMark. I previously worked on graph analytics at Neo4j, where I also co-authored the O'Reilly Graph Algorithms Book with Amy Hodler.