Re: Function size

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

 



On 23 May 2012, at 15:14, Tedd Sperling wrote:

> Hi gang:
> 
> On May 21, 2012, at 8:32 PM, tamouse mailing lists wrote:
>> A rule of thumb is no more than 50 lines per
>> function, most much less. Back in the day when we didn't have nifty
>> gui screens and an 24 line terminals (yay green on black!), if a
>> function exceeded one printed page, it was deemed too long and marked
>> for refactoring.
> 
> You hit upon a theory of mine -- and that is our functions grow in size up to our ability to view them in their totality. When our functions get beyond that limit, we tend to refactor and reduce.
> 
> I know from the last several decades of programming, my functions have increased in number of lines. But, they have reached a limit that limit is generally about the number of lines I can read in half of my monitor's height. This of course, is dependent on monitor resolution, font-size, and how far I am sitting from the monitor. But I think this is a natural and physical limit that we don't normally recognize. I can cite studies that support my theory.
> 
> It would be an interesting survey to ask programmers to review their code and provide the average number of lines in their functions AND how many lines of code their monitor's can display. In other words, look at your editor; count the number of lines your monitor can display; estimate the number of lines in your average function; and report the findings.  For example, mine is about half -- my monitor can display 55 lines of code and my average function is around 25 lines. YMMV.
> 
> Interesting, yes?

It's a theory, yes, and for many people it may be valid, but it's not for me. The resolution of your screen; the size of your font; the colour scheme you use. These should not be a factor in the way you write your code. If they are then you'll be making decisions for all the wrong reasons.

The art of software development is in taking a problem, breaking it up in to bite-size chunks, and putting those chunks together to form a practical solution. Anyone who considers themselves a "better" programmer because their functions are large due to their ability to handle large functions needs to keep their ego in check. Mental capacity has nothing to do with it.

My philosophy for functions is simple... a function does one well-defined, discrete task, and it does it well. The inputs are clearly specified, and the potential outputs/exceptions are fully understood. Sound familiar? These requirements make it incredibly easy to write unit tests for the code.

The number of times a function is used does not enter my field of interest. It's irrelevant, as is the number of lines in each function. Following this philosophy does naturally lead to fairly small functions, but as you move up the levels of abstraction they tend to grow larger. For PHP, I consider code in a file that's not within a function to be a function in itself, and the same philosophy applies.

I wasn't going to respond to this thread because I think it's a largely ridiculous topic, but some of the responses have scared me. Sir Cummings (hopefully) sarcastic response about using a 5px font size demonstrated how daft it is to base function size on how much code you can see on the screen at once.

Looking at the stats for your code is meaningless, and it's particularly meaningless if you're looking at lines rather than statements, but even then it lacks sufficient meaning to be worthwhile.

Shiplu posted a great video on using polymorphism to properly model different behaviours of a base type, and that's great, but for PHP you need to factory in the sizeable speed difference between using a switch statement and using objects. You should never let the elegance of a solution take priority over efficiency.

Tony had some curious comments...

On 29 May 2012, at 08:52, Tony Marston wrote:
> The only reason to take a block of code and put it into its own function
> is when that code is likely to be called more than once so that it conforms
> to the DRY principle. If it is only ever used in one place then there is no
> point.


The DRY principle -- a great principle to observe. However, having functions that are only used once does not violate the DRY principle, in fact in some ways it makes it easier to adhere to it. Also, there is a point to pulling out code that's only used once into a separate function, it's called unit testing, and if you're not doing that then YOU are in the wrong job :)

KISS is more important than DRY in my opinion, and KISS should naturally lead to DRY (in most cases).

> The problems I have with creating lots of small used-only-once functions is
> as follows:
> - you have to create a meaningful name for each function.

Oh, dear $DEITY, the hardship. Hmm, then again, naming my functions properly will help you with your DRY goals. Hmm.

Seriously tho, you've refactored that code into its own function BECAUSE it's doing a discrete task. Naming it should not be difficult if you're refactoring it for the right reasons.

> - all those functions should be arranged in alphabetical order within their
> containing file - having them in a random sequence makes it difficult to
> find the one you want.

Should they? Why should they? I have never organised my functions in alphabetical order! If you're having trouble locating a function then you need a better editor. One with a decent search function should suffice; searching for "function myfunction" usually works for me. If you're stuck I'd recommend you check out Sublime Text 2 -- it's awesome, and has a very fast multi-file search facility!

> - when browsing through the code you have to keep jumping to another
> function, and then returning to where you came from.

My my, you do have a hard life. But, seriously...?

> Another problem I have encountered in the past with such an idea is that it
> encourages a stupid programmer to decrease the number of lines of code by
> compressing as many statements as possible into a single line, which then
> makes the code less easy to read and understand. This is much worse than
> having more than 20 lines in a function.

Thanks for this, it naturally segues me into a brief summary of my thoughts...

1) First and foremost, if the programmers you're working with really think like that, change them. I don't care if that means changing jobs -- trust me, you'll be better off in the long run.

2) Education is what turns a "stupid" programmer into a "better" programmer. Be an educator and make the world that little bit better.

3) Specifying a maximum number of lines for functions is dumb.

4) Specifying a maximum number of statements for functions is slightly less dumb but it's still up there.

5) Use your common sense. If a function is doing more than one job, break it up. Obviously by that logic you can break it up so that each function contains a single line, but that's daft. With some experience it should become obvious where you should draw the line in any given situation.

6) When you add or modify code, evaluate whether you should refactor it. Code is fluid and you should approach it as such (a cup of water is easier to control than a stream, which is easier to control than a river, which is easier to control than a sea).

7) Don't measure meaningless stuff. Measure stuff that matters. The average number of lines or statements in your functions doesn't matter. Ever.

> Whether a file contains 10 functions of 100 lines each, or 100 functions of
> 10 lines each, you still end up with 1000 lines of code. If you do not have
> the mental capacity to deal with a 100-line function then you are in the
> wrong job.


If you think being able to deal with a large block of code makes you a better programmer, YOU are in the wrong job. A good programmer, in my opinion, knows that the simpler and more discrete each block of code is the less room there is for errors. An excellent programmer knows that 100-line functions are generally impossible to adequately unit test.

The bottom line is to use your common sense rather than sticking to some arbitrarily prescribed, measurable target.

-Stuart

-- 
Stuart Dallas
3ft9 Ltd
http://3ft9.com/
-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php




[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