Hello, I personally like the variadic version, which is very well described here <https://commandcenter.blogspot.fr/2014/01/self-referential-functions-and-design.html> and here <https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis>.
Le vendredi 7 juillet 2017 17:18:14 UTC+2, Sam Whited a écrit : > > Hi all, > > I have an API that I'm not satisfied with and wanted to see what > others do. I have a function in my API, the details don't really > matter so let's call it Foo and say it returns type Bar (the return > type we can't mess with): > > Foo() Bar > > Most of the time we have all the information we need to compute Foo() > and return Bar. However, on rare occasions, the thing Foo is doing > does not have enough information and the users application needs to > provide logic for computing that info, or fetching it from a database, > etc. So I need to let the user provide some logic for getting that > info (let's assume it's a string): > > Foo(f func() (string, error)) Bar > > Normally this would be a fine, simple API. However, f is almost never > needed. This means that <large-percentage> of the time when they > actually call Foo (let's say it's in the baz package), they'll be > writing: > > bar := baz.Foo(nil) > > This isn't terrible; but it doesn't feel great to introduce a random > nil with no information about what it is into the users code just so > that a fraction of the time they can put a callback there. > > Other atlernatives might be to use a variadic function and take > multiple callback funcs (so that having one at all is optional): > > Foo(f ...func() (string, error)) Bar > > Now the user can write: > > bar := baz.Foo() > bar := baz.Foo(func() (string, error) {…}) > > That feels dirty because we appear to be telling the user that > multiple callbacks are acceptable by encoding that into the function > signature (even though it doesn't make sense and only the first one > would ever be used). > > We might also provide a Foo() function and a FooCallback(f func() > (string, error)) function, but this doesn't really provide us any > benefit over saving us typing three characters most of the time and > means we have a bigger API surface to keep track of (and it just looks > ugly in the docs, there are other Foo like functions and none of them > will have an alternative implementation; it also makes it easier for > the user to mix them up and use the wrong one when info is or is not > needed, etc.) > > Thoughts? Is requiring the (nil) argument 90% of the time not so bad? > Is there an obvious benefit to doing it another way I'm not noticing, > or another pattern I'm ignoring? It's so rare that the callback is > needed (but it will be needed sometimes and there's nothing I can do > about that; so I can't just get rid of it entirely), that all the > options here just feel poor. > > Thanks, > Sam > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.