On 11/08/2011 01:21 PM, Lex Trotman wrote:
On Wed, Nov 9, 2011 at 3:40 AM, Nick Treleaven
<nick.trelea...@btinternet.com>  wrote:
On 04/11/2011 00:21, Lex Trotman wrote:

Geany has many places where a short function then calls
another short function which calls another short function, none of
which are re-used.  Personally I find this way of writing code less
efficient and very hard to follow and understand as a whole, but
others find it easier to think only in terms of each little piece.
YMMV

Here may be somewhere where we disagree fundamentally, because:

Probably :)


I certainly do :)


* long functions cause bugs

Rubbish, wrong functions cause bugs no matter how long, and being
unable to see the whole logic leads to wrong design.


+1

* too many variables in one place cause bugs


Can you elaborate on this assertion?

Thats what declarations in inner blocks are for :)


I'm sure there are statisics to back this up, it's well known in code
analysis/reliability circles.

And there are also statistics that say the opposite, that breaking it
up too far over complicates things and causes unreliability.


+1



Breaking up logical tasks into functions is crucial to writing maintainable
code, functions *are not just about code reuse*.


But there's lots of places in Geany's code where logical tasks are actually further broken into many little sub-tasks (see below for an example), so small and trivial that the code would be a lot easier to follow if it was just in one place and achieved it's primary task.

Yes, the key word here is *logical*, too big is bad and too small is
bad, but what is too big and what is too small depends on the person
and what the code is doing.  It isn't a one size fits all.

I just noted that for me parts of Geany err on the too small side.


I think you've summed that up pretty well.

Just to give an example, in encodings.c, there's a "logical" task towards the end of the code, which is to "guess encoding from a buffer and convert it". It starts out in encodings_convert_to_utf8_auto(), which is meant to do the task, but instead of that function doing what it's meant to do, it instead calls handle_buffer() to do it.

Now handle_buffer() is supposed to "guess encoding from a buffer and convert it" instead of the original function, so it first tries to detect the Unicode BOM, it calls encodings_scan_unicde_bom() which is fine, since it's logically a separate task and has a general usefulness (in fact in this case it's also re-used elsewhere, but pretend it wasn't).

Once the Unicode BOM is scanned, it continues on and if the encoding is to be forced, it calls yet another function, handle_forced_encoding() which could easily be inline in handle_buffer(). If not forcing the encoding, handle_buffer() will then call handle_encoding(), which actually does what handle_buffer() is supposed to do also; convert the encoding. handle_encoding() then calls out to the actual encoding conversion functions, with some logic/conditions around it. handle_encoding() could go into handle_buffer() as well, even though it's slightly on the longer side.

Continuing on, after handle_buffer() has called out to these other functions, it then shifts the buffer's data to overwrite the BOM bytes at the beginning, which is basically part of what handle_buffer() is supposed to be doing, but instead it calls yet another function named handle_bom() which is so short and simple that it should very much be in the handle_buffer().

Speaking only for myself, this is type of "chase the sub-logic" stuff is *so* confusing, and the problem becomes much worse when the "mini functions" are not directly near the "real function" in the file or worse yet in a whole other file. I'd have a *much* easier time reading a 200 line function that just does the one thing all these separate sub-functions combined are meant to do: automatically convert the encoding of the buffer.

I guess we won't ever all agree on this, so we all have to be tolerant.


Sadly, probably not :(

Cheers,
Matthew Brush
_______________________________________________
Geany-devel mailing list
Geany-devel@uvena.de
https://lists.uvena.de/cgi-bin/mailman/listinfo/geany-devel

Reply via email to