Re: Re: Long Live GOTO

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Feb 6, 2012 at 11:58 AM, Tim Streater <tim@xxxxxxxxxxxxxxxx> wrote:

> On 06 Feb 2012 at 09:48, Adam Richardson <simpleshot@xxxxxxxxx> wrote:
>
> > On Mon, Feb 6, 2012 at 4:25 AM, Adam Richardson <simpleshot@xxxxxxxxx
> >wrote:
> >
> >> On Mon, Feb 6, 2012 at 4:07 AM, Tim Streater <tim@xxxxxxxxxxxxxxxx>
> wrote:
>
> >> I disagree that the nested function is a straw-man. I (just as the other
> >> authors I'd linked to describing the "arrow" pattern of code) have seen
> >> plenty of examples of similar code.
>
> I guess what I meant was, that I'd never have written it that way in the
> first place, so as an example it felt contrived. Amateurs or people with no
> training (in particular physicists at CERN 40 years ago) should be kept
> well clear of the goto. I'd probably write your function like this:
>
> function val_nested ($name = null, $value = null, $is_mutable = false)
>      {
>
>      static $values   = array();
>      static $mutables = array();
>
>      if  ($name===null)  return $values;
>
>     if  ($value===null)  return isset($values[$name]) ? $values[$name] :
> null;
>
>     if  (isset($values[$name]))
>          {
>
>           if (!$val_is_mutable = in_array($name, $mutables))    // Set
> existing value
>               {
>               $msg = 'The value "' . $name . '" is immutable and has
> already been set to ' . $values[$name] . '.';
>                throw new Exception ($msg);
>                }
>
>           return $values[$name] = $value;
>
>           }
>
>      if ($is_mutable)  $mutables[] = $name;                     // Set new
> value
>      $values[$name] = $value;
>
>      return $value;
>
>     }
>
>
> I always add blank lines for clarity. Remove those and the above is 30%
> shorter than yours - as far as I could tell, none of the else clauses was
> required.
>
> My approach is:
>
> 1) deal with the trivial and error cases first
>
> 2) deal with the real work next
>
> --
> Cheers  --  Tim
>

Thanks for providing your example, Tim. Bailing early through guard clauses
towards the top of the function body is a nice approach (I used it in my
second example, but I also used conditional grouping and factoring out
functions so I could display all three techniques listed in the post.)

I might try performing some experiments using the different versions of the
code and test for things like:
- Time it takes to add some additional piece of functionality to the code.
- Number of bugs in the revision.
- Time it takes for one to write a new function using only one of the
possible techniques (deep nesting, guard clauses, pulling out functions,
goto, etc.)
- Providing function input and testing accuracy of predicted output

Thanks for the time you've taken to provide your PHP coding preference in
this situation.

Adam

-- 
Nephtali:  A simple, flexible, fast, and security-focused PHP framework
http://nephtaliproject.com

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux