I never return a broken value with an error because there are occasions where returning both a value and an error make sense, such as a partial read. More than anything else, I'd rather make it clear that this is not one of those cases so I don't confuse myself later when I'm trying to track down a bug.
On Fri, Mar 31, 2017 at 5:02 PM, 'Axel Wagner' via golang-nuts <golang-nuts@googlegroups.com> wrote: > > > On Sat, Apr 1, 2017 at 1:50 AM, Dave Cheney <d...@cheney.net> wrote: >> >> >> >> On 1 Apr 2017, at 10:41, Axel Wagner <axel.wagner...@googlemail.com> >> wrote: >> >> So… Given that I'm not talking about modifying any contract - see a) in my >> previous message - but just making an effort that I'm not contractual bound >> by, I am not sure how I am supposed to read this. Is this an argument for >> not being helpful? Because I don't quite see how your point invalidates >> that. Or is it an argument for being hurtful? Which I also don't really see, >> as I'm not talking about any change in contract. >> >> Like, I legit starting to doubt my sanity here; I don't see how I can >> actually be any clearer about how I do not intend to change anything about >> the "if a non-nil error is returned, assume the returns are invalid" rule. >> The question is "how is it hurtful, if I then also add an extra layer of >> defense against people violating that contract"? >> >> >> But why? Why encourage people to be reckless. IMO this is difference >> between map ordering during iteration being undefined, which it is, rather >> than guaranteed to be random, which is not. > > > Great point. Why does gc implement it that way, then? And does it hurt, that > gc implement it that way? The contract does not contain anything about the > iteration order, so why did we add that code and CPU time to explicitly > randomize it, instead of just letting buggy code be buggy and blow up at > some point with hard to debug errors? This seems to be essentially the > argument you are making, so why does it, seemingly, not apply to randomized > map iteration in gc? > >> >> >> Both are contracts with the same result to the casual user -- map >> iteration is unpredictable, but by not guaranteeing that the order will be >> random, it prevents people relying on the side effect. >> >> This is the argument I'm making now, yes, you could go to effort to make >> sure that some of the values you return are nil so that they explode as soon >> as someone forgets to check an error, but you probably shouldn't because >> >> A, this is providing a stronger contract than necessary. > > > No, it is not. The contract is the same. I'm sorry to be a stickler here, > but I really don't see why this point is so elusive. I am not suggesting > adding a "if an error is returned, the other return values will have their > zero value" to my godoc. > >> >> B, it encourages people to be clever and try to avoid the error checking >> idiom. > > > I legit don't see how, given that this is not a rule. I also don't do it > with any kind of strictness that would allow people to rely on it. > >> >> C, doesn't work for all return values, only the pointer shaped ones. > > > I disagree. An empty string or a 0 or whatever is *still* a much more > telling symptom to debug than *some* string/integer/whatever, especially if > it's an invalid value (and if it isn't; why is would we even talk about it). > > But anyway, yes, I mostly do this with pointers, but *so what*? Why throw > the baby out with the bathwater? Again, this is not part of any API. This is > not an all or nothing thing. This is a safety net for people coding bugs and > it's totally fine if it is there sometimes and not there at other times (and > you even argue yourself that it shouldn't, to "keep people on their toes"). > >> >> >> >> >> Are you trying to say that I'm training them to not adhere to the >> contract? Because I don't see how; it's blowing up either way, just, in one >> case the blowup might be easier to detect and debug. >> >> I respect your opinion and I do agree, but we just seem to be talking >> about different things… anyway. Sleep, for now. >> >> On Sat, Apr 1, 2017 at 1:09 AM, Dave Cheney <d...@cheney.net> wrote: >>> >>> I think the simpler contract is to give no guarantee whatsoever of the >>> state of the other return values in the presence of an error. >>> >>> It's a simple, clear, and most importantly consistent contact. >>> >>> To guarenteed that in the presence of an error the values that can be >>> respresented by nil _will_ be nil is less consistent, and more importantly >>> encourages people to not check error by substituting their own ad-hoc tests >>> like testing if a return value is nil, implying an error. >>> >>> -- >>> 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. >> >> > > -- > 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. -- 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.