I think we’ll just agree to disagree. 

> On Feb 5, 2019, at 2:52 PM, Burak Serdar <bser...@ieee.org> wrote:
> 
>> On Tue, Feb 5, 2019 at 1:46 PM Robert Engels <reng...@ix.netcom.com> wrote:
>> 
>> If the error doesn’t know what it is wrapping but the caller needs to know 
>> the wrapped error you have a design problem. It breaks all sorts of ‘isa’ 
>> semantics.
> 
> This happens if you're using multiple layers of libraries that don't
> know about each other. It is not a design problem.
> 
>> 
>> If you need to know the internal buffer length, you have a design problem. 
>> What if the wrapped buffer was unlimited or dynamic - there is no length to 
>> return - you must read until eof.
> 
> Sometimes you need to know the internal buffer length if you're
> dealing with a service behind a peculiar http front-end, like some
> akamai services. You have to send the content length, and if you know
> it already, you should be able to get it.
> 
>> 
>> It is not a matter or OO purity, it is a simple matter of encapsulation, and 
>> not requiring upper layers to know and understand - or even have access to - 
>> internal details.
> 
> Encapsulation is useful if you're hiding internal details. But some
> internal details are not so internal under different circumstances,
> like the length of a buffer.
> 
>> 
>>>> On Feb 5, 2019, at 1:37 PM, Burak Serdar <bser...@ieee.org> wrote:
>>>> 
>>>> On Tue, Feb 5, 2019 at 12:22 PM Robert Engels <reng...@ix.netcom.com> 
>>>> wrote:
>>>> 
>>>> As far as the error handling, this is kind of a limitation of the error 
>>>> interface in Go and should be solved there. But I would start with asking, 
>>>> why do you need the causation error? If it is increased logging, then the 
>>>> higher level error should be able to represent the additional detail when 
>>>> it is logged. If it is for control flow, then the containing error should 
>>>> adequately represent the error.
>>> 
>>> That's not always possible if the containing error doesn't really know
>>> what it is wrapping. The nested error could be of different types that
>>> the wrapper don't know about.
>>> 
>>>> 
>>>> If you are exposing the length of the underlying buffer higher levels, 
>>>> that is a design problem. In the Nopcloser you are exposing the reader the 
>>>> caller already has access to by way of the Reader interface. The Closer is 
>>>> a decorator. You don’t have access the possibly real Closer in the 
>>>> original implementation. There is no GetWrappedCloser.
>>> 
>>> Note that the inability to expose the underlying buffer length is the
>>> problem here. The only safe way to get the length of the buffer, in
>>> this case, is to copy it.
>>> 
>>>> 
>>>> I would also argue that Nopcloser is a poor design. You are passing a 
>>>> object around where the Close that the object is exposing is no longer 
>>>> called. This can lead to very brittle code and obscure bugs - the object 
>>>> is no longer behaving the way the designer expected. The Closer interface 
>>>> expects that the resource will be closed, this is now broken.
>>> 
>>> You are approaching this as an OO-purist. In my opinion, NopCloser is
>>> a simple adapter that wraps readers without a close(). If it wasn't in
>>> the library, it would've been rewritten in many projects.
>>> 
>>>> 
>>>> Much of a Gos dynamic interfaces though work poorly this way... but that 
>>>> is another discussion.
>>>> 
>>>>>> On Feb 5, 2019, at 12:33 PM, Burak Serdar <bser...@ieee.org> wrote:
>>>>>> 
>>>>>> On Tue, Feb 5, 2019 at 11:27 AM Robert Engels <reng...@ix.netcom.com> 
>>>>>> wrote:
>>>>>> 
>>>>>> But even then, exposing internal details outward leads to lots of 
>>>>>> problems, testability for certain. There’s almost always a better way 
>>>>>> then GetNested, GetWrapped, or any of its derivatives.
>>>>> 
>>>>> How so? How would you deal with something like error wrapping, for
>>>>> instance? Or in this specific case, how would you get the length of
>>>>> the underlying buffer if you wrap the reader with a NopCloser?
>>>>> 
>>>>>> 
>>>>>>> On Feb 5, 2019, at 12:20 PM, Robert Engels <reng...@ix.netcom.com> 
>>>>>>> wrote:
>>>>>>> 
>>>>>>> Then you want inheritance not encapsulation.
>>>>>>> 
>>>>>>>>> On Feb 5, 2019, at 10:46 AM, Burak Serdar <bser...@ieee.org> wrote:
>>>>>>>>> 
>>>>>>>>> On Tue, Feb 5, 2019 at 9:41 AM Robert Engels <reng...@ix.netcom.com> 
>>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>> GetNested anything is a sign something is broken in the API. The 
>>>>>>>>> whole point of being nested is almost always encapsulation and then 
>>>>>>>>> you are breaking it.
>>>>>>>> 
>>>>>>>> That's too much of a generalization in my opinion. This is more like
>>>>>>>> decoration, adding new functionality at every layer, but there is no
>>>>>>>> way to expose all the functionality of the nested thing, so you need
>>>>>>>> to expose the thing itself.
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>>> On Feb 5, 2019, at 10:30 AM, Burak Serdar <bser...@ieee.org> wrote:
>>>>>>>>>>> 
>>>>>>>>>>> On Tue, Feb 5, 2019 at 9:12 AM <matteo.biage...@gmail.com> wrote:
>>>>>>>>>>> 
>>>>>>>>>>> I've the following situation:
>>>>>>>>>>> I proxy a request to another server and when I made a POST and 
>>>>>>>>>>> create a new request, the contentLength is zero:
>>>>>>>>>>> 
>>>>>>>>>>>   req2, _ := http.NewRequest(req.Method, newApiUrl , req.Body)
>>>>>>>>>>>   fmt.Println("New request from body:", req2.ContentLength) // 
>>>>>>>>>>> print 0
>>>>>>>>>>> 
>>>>>>>>>>> Checking in the source code of the NewRequest func Body don't 
>>>>>>>>>>> respect some interface and populate the ContentLength field.
>>>>>>>>>> 
>>>>>>>>>> When the first request is created, req.Body is set to a NopCloser, 
>>>>>>>>>> and
>>>>>>>>>> that doesn't match any of the cases in the second NewRequest. For 
>>>>>>>>>> this
>>>>>>>>>> to work, I guess the best way is to get the body length and set it
>>>>>>>>>> explicitly after constructing the second request.
>>>>>>>>>> 
>>>>>>>>>> I don't know if this is intentional or not, but in general, it might
>>>>>>>>>> be a good idea to add a ReaderWrapper interface to the standard
>>>>>>>>>> library that defines a GetNestedReader() io.Reader function to access
>>>>>>>>>> the real reader from these utility classes.
>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> Could be a bug? Which could be a valid approach in order to create 
>>>>>>>>>>> a new request from an existing one and correct set the Body length?
>>>>>>>>>>> 
>>>>>>>>>>> A working example here:
>>>>>>>>>>> 
>>>>>>>>>>> https://play.golang.org/p/SvCDLj0NrXb
>>>>>>>>>>> 
>>>>>>>>>>> Thanks!
>>>>>>>>>>> 
>>>>>>>>>>> --
>>>>>>>>>>> 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.
>>>>>> 
>>>>>> --
>>>>>> 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.

-- 
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.

Reply via email to