<div dir="ltr"><div>Thanks so much for taking a look at this! See my replies inline below.</div><div><br></div><div dir="ltr">On Mon, Jun 17, 2024 at 4:28 PM Andres Valloud via Cuis-dev <<a href="mailto:cuis-dev@lists.cuis.st">cuis-dev@lists.cuis.st</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Why don't all branches of GET return nil?<br></blockquote><div><br></div><div>I'm handling two cases for GET requests ... JSON and HTML. The handleDog method doesn't need to return anything. It just needs to cause an HTTP response to be sent. The methods getDogsAsJson and getDogsAsHtml do that. The only reason I have "^nil" in several places in this method is to return early from handleDog and not evaluate the rest of the code.</div><div><br></div><div>So given all that, is there a better way I could write this?</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Do you need to return nil, or is just returning self enough?  How about <br>
returning e.g. ^self getDogsAsJson: aRequest?  That reduces lines of <br>
code quite a bit.<br></blockquote><div><br></div><div>Perhaps if I do what you suggest, the return value will just be ignored ... which is what I would want to happen. I was thinking if I returned a value other than nil, readers of the code would think the return value had some meaning or was useful. But in this case that would not be true.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">How many methods are there?</blockquote><div><br></div><div>There are only four. The only one I'm not supporting here that is sometimes used is PATCH, so a maximum of five.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">If there are many more than 4, a dictionary <br>
might be in order.  Or another take:<br>
<br>
        handleDog: aRequest<br>
<br>
                aRequest doDogCrudWith: self<br>
<br>
and let the request ask the questions about method, header etc to self, <br>
rather than the questions being asked to aRequest here.  Push the <br>
responsibility closer to the actual objects involved.<br></blockquote><div><br></div><div>aRequest is a WebRequest object from a class defined by the WebClient package, so it's not my code. I know I could still add methods to it even though it's not my code, but I thought perhaps it would be frowned upon to add app specific methods to a library class.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">On 6/17/24 2:20 PM, Mark Volkmann via Cuis-dev wrote:<br>
> I finally have a set of HTTP CRUD operations working using the WebClient <br>
> package!<br>
> The following is a method that handles requests for all URLs with the <br>
> path "/dog".<br>
> Regardless of the HTTP method, all requests pass through this.<br>
> This code works perfectly, but I'm questioning whether it is idiomatic <br>
> Smalltalk code.<br>
> What would you do differently in this code?<br>
> <br>
> handleDog: aRequest<br>
>      "handle an HTTP request based on its method"<br>
> | id parts |<br>
> <br>
> aRequest method = 'GET' ifTrue: [<br>
> | accept |<br>
> <br>
> accept := aRequest headerAt: 'Accept'.<br>
> (accept includesSubString: 'application/json') ifTrue: [<br>
> self getDogsAsJson: aRequest.<br>
> ^nil<br>
> ].<br>
> <br>
> (acceptincludesSubString: 'text/html') ifTrue: [<br>
> self getDogsAsHtml: aRequest.<br>
> ^nil<br>
> ]<br>
> ].<br>
> <br>
> aRequest method = 'POST' ifTrue: [<br>
> self createDog: aRequest.<br>
> ^nil<br>
> ].<br>
> <br>
> "Get the path parameter value."<br>
> "TODO: Is this really the best way to do it?"<br>
> parts := aRequest url prefixAndSuffix: $/.<br>
> id := parts last asNumber.<br>
> <br>
> aRequest method = 'DELETE' ifTrue: [<br>
> self deleteDog: aRequest id: id.<br>
> ^nil<br>
> ].<br>
> <br>
> aRequest method = 'PUT' ifTrue: [<br>
> self updateDog: aRequest id: id.<br>
> ^nil<br>
> ]</blockquote></div><div><br></div><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div><font face="arial, helvetica, sans-serif">R. Mark Volkmann</font></div><div><span style="font-size:12.8px"><font face="arial, helvetica, sans-serif">Object Computing, Inc.</font></span></div></div></div></div></div></div></div></div></div>