False selection...
-
aspdotnetdev wrote:
I was always told to only have one return statement in a procedure, so I can see this being a horror.
I spent time last century programming in Pascal (amongst many, many other languages) and one of the "rules" which I stubbornly held onto for many years afterwards was to only have a single return from a method... BUT I finally woke up to myself and (Thank You Martin Fowler!) realised that exiting early (using what I believe are called "guard clauses" by people who know) can really improve readability and performance. Although I do wish that (currently) Visual Studio would highlight every "return" because I still sometimes only notice the last one in a method on first read. In my OPINION (and without knowing much about the actual subject domain) I prefer the first posted "horror" example to anything I've seen posted since. That is just subjective opinion, but it is based on coding for a long time and working with many other developers with different levels of experience. In fact it's probably mostly based on being embarrassed when returning to my own code years later and not having a clue what I was trying to do... Thanks to LordOfAwesome for starting this thread and prompting me to post here for the first time (I think... My memory really is getting worse with age). I just also wanted to reply to one of your later comments:
lordofawesome wrote:
Nevertheless I think it is strange to return a boolean from the result of any if structure. It just seems strange to me.
I agree with you that if there was a single "if" statement which returned a boolean, that would be silly, but in this case each of the "if" blocks might either return false AND exit the method, or fall through to the next statement. And it is that "falling through" that is very difficult to show clearly using in-line boolean operations, even with (or perhaps especially because of) the use of short-circuit boolean operators (like &&, etc.) So in the case we're discussing, my preference would be to write more code to be absolutely clear about what I was trying to do (and let's remember that the example was from a text book, so clarity is especially important), exit early to only execute the minimum required and if the method did end up being a performance bottleneck, go back and optimise it later, which would be much easier to do based on clear existing logic.
FSANB wrote:
I agree with you that if there was a single "if" statement which returned a boolean, that would be silly, but in this case each of the "if" blocks might either return false AND exit the method, or fall through to the next statement. And it is that "falling through" that is very difficult to show clearly using in-line boolean operations, even with (or perhaps especially because of) the use of short-circuit boolean operators (like &&, etc.)
Um, use ELSE to replace the fall-through. Would that make it more acceptable? I think nesting if's with the else's would be more unreadable, but that is me. Funny, we could all use the same coding "standards" but write this little routine so differently. That's what makes us arteests. :cool:
Gary
-
Erik. A 2 vote? REALLY? Thanks buddy. I see you don't handle criticism very well. The original code was very straight forward. Some developers don't like multiple returns. That does not make it a "horror". Likely you did not read the comments in the code or analyze the code properly. I made this mistake upon first inspection, assuming I knew what it was doing, but did not. Now, your latest example: Perform a routine, which performs 3 routines - that has to be the slowest rewrite that was presented in this thread. Loading and clearing the register stack 4 times. Wow! Too much overhead. Yes, clear, but doesn't belong in time-sensitive logic (if this is time-sensitive). But I have to wonder how the bitdepth and refreshrate code would be written. You haven't gotten rid of the nuance, just move it and added some overhead. You'd have better comments? In short, your final logic does the same as the original but is slower.
Gary
The 2 vote was another mistake of mine, sorry for that. I wanted to go to page 2 to see the original post, clicked the vote 2 instead, and forgot to make the correct vote to your post. I've just corrected it with the vote it really deserves, a 5. I know my final logic does the same as the original but is slower. It is obvious. And it is much clearer, and this is also obvious. The sample I give just before does the same also, and is faster. Both of them improve the original in readability, and the first one also improves it in speed. If you had to manage a team of developers, some of them newcomers with very little experience, tell me, having the original code and the two samples I am giving, which one would you choose? I would choose the last one, though I know it is slower, but I also know that the overhead is just negligible in this case, becouse this operation will not be used over and over again within de context of a long and complex batch process. I don't mind to have several "return" in the same method... if it improves readability and/or performance. In the case presented here, it does not improve readablity neither performance, so that is the reason why I consider it a horror. Nobody is obligated to agree, I am just sharing my point of view. Edit Sorry again, I was forgetting the las part. The implementation for bitdepth and refreshrate is given just before, but like you wonder how they should be, I will give some extra clues:
return mode1.getWidth() == mode2.getWidth() && mode1.getHeight() == mode2.getHeight() && // This checks sizes
(mode1.getBitDepth() == mode2.getBitDepth() || // These three lines
mode1.getBitDepth() == DisplayMode.BIT_DEPTH_MULTI || // are checking if
mode2.getBitDepth() == DisplayMode.BIT_DEPTH_MULTI) // bit depths match
&&
(mode1.getRefreshRate() == mode2.getRefreshRate() || // These three lines
mode1.getRefreshRate() == DisplayMode.REFRESH_RATE_UNKNOWN || // are checking if
mode2.getRefreshRate() == DisplayMode.REFRESH_RATE_UNKNOWN); // refresh rates matchThank you
modified on Tuesday, October 19, 2010 9:28 AM