views:

486

answers:

13

I know that there is no right answer to this question, I'm just asking for your opinions.

I know that creating HUGE class files with thousand lines of code is not a good practice since it's hard to maintain and also it usually means that you should probably review your program logic.

In your opinion what is an average line count for a class let's say in Java (i don't know if the choice of language has anything to do with it but just in case...)

+11  A: 

Yes, I'd say it does have to do with the language, if only because some languages are more verbose than others.

In general, I use these rules of thumb:

  • <300 lines: fine
  • 300-500 lines: reasonable
  • 500-1000 lines: maybe ok, but plan on refactoring
  • >1000 lines: definitely refactor

Of course, it really depends more on the nature and complexity of the code than on LOC, but I've found these reasonable.

sleske
+12  A: 

In general, number of lines is not the issue - a slightly better metric is number of public methods. But there is no correct figure. For example, a utility string class might correctly have hundreds of methods, whereas a business level class might have only a couple.

If you are interested in LOC, cyclomatic and other complexity measurements, I can strongly recommend Source Monitor from http://www.campwoodsw.com, which is free, works with major languages such as Java & C++, and is all round great.

anon
I also recommend http://sonar.codehaus.org/ for both line count and complexity.
Mercer Traieste
+4  A: 

I focus on methods and (try to) keep them below 20 lines of code. Class length is in general dictated by the single responsibility principle. But I believe that this is no absolute measure because it depends on the level of abstraction, hence somewhere between 300 and 500 lines I start looking over the code for a new responsibility or abstraction to extract.

Daniel Brückner
+6  A: 

From Eric Raymond's "The Art Of Unix Programming"

In nonmathematical terms, Hatton's empirical results imply a sweet spot between 200 and 400 logical lines of code that minimizes probable defect density, all other factors (such as programmer skill) being equal. This size is independent of the language being used — an observation which strongly reinforces the advice given elsewhere in this book to program with the most powerful languages and tools you can. Beware of taking these numbers too literally however. Methods for counting lines of code vary considerably according to what the analyst considers a logical line, and other biases (such as whether comments are stripped). Hatton himself suggests as a rule of thumb a 2x conversion between logical and physical lines, suggesting an optimal range of 400–800 physical lines.

Taken from here

klez
A: 

You're right... there is no answer to this. You cannot put a "best practice" down as a number of lines of code.

However, as a guideline, I often go by what I can see on one page. As soon as a method doesn't fit on one page, I start thinking I'm doing something wrong. As far as the whole class is concerned, if I can't see all the method/property headers on one page then maybe I need to start splitting that out as well.

Again though, there really isn't an answer, some things just have to get big and complex. The fact that you know this is bad and you're thinking about it now, probably means that you'll know when to stop when things get out of hand.

Robin Day
+3  A: 

Small enough to do only the task it is charged with.

Large enough to do only the task it is charged with.

No more, no less.

graham.reeds
A: 

IMO the number of lines shouldn't matter as long as the class has the ability to perform the tasks it was intended to do.

However, for maintainability its always worth going back over the code and seeing if there is any way of refactoring some code out to Utility/Helper classes.

James
+5  A: 

Better to measure something like cyclomatic complexity and use that as a gauge. You could even stick it in your build script/ant file/etc.

It's too easy, even with a standardized code format, for lines of code to be disconnected from the real complexity of the class.

Edit: See this question for a list of cyclomatic complexity tools.

Alex Feinman
I like this answer. Via a quick google search i found a tool that measures this in Java. It's called PMD http://pmd.sourceforge.net/
Savvas Dalkitsis
Interesting tool; I hadn't seen that one. Ideally it would be integrated with my IDE, but...ah, well.
Alex Feinman
it has a command line syntax so I'm sure that creating a wrapper is not that difficult.
Savvas Dalkitsis
Cyclomatic complexity is a formal way to measure complexity and at the same time it's really easy to use. Liked this answer.
Abel Morelos
+1  A: 

Lines of code is much more about verbosity than any other thing. In the project I'm currently working we have some files with over 1000 LOC. But, if you strip the comments, it will probably remain about 300 or even less. If you change declarations like

int someInt;
int someOtherInt;

to one line, the file will be even shorter.

However, if you're not verbose and you still have a big file, you'll probably need to think about refactoring.

Fernando
you have over two lines of comment per line of code!?! perhaps you should consider refactoring your comments.
akf
We use doc. comments. Some classes include usage examples in that comments.
Fernando
A: 

The short answer: less than 250 lines.

The shorter answer: Mu.

The longer answer: Is the code readable and concise? Does the class have a single responsibility? Does the code repeat itself?

Matt Howells
+2  A: 

In my experience any source file over 1000 text lines I will start wanting to break up. Ideally methods should fit on a single screen, if possible.

Lately I've started to realise that removing unhelpful comments can help greatly with this. I comment far more sparingly now than I did 20 years ago when I first started programming.

T.E.D.
+1  A: 

For me, the issue isn't LOC. What I look at is several factors. First, I check my If-Else-If statements. If a lot of them have the same conditions, or result in similar code being run, I try to refactor that. Then I look at my methods and variables. In any single class, that class should have one primary function and only that function. If it has variables and methods for a different area, consider putting those into their own class. Either way, avoid counting LOC for two reasons:

1) It's a bad metric. If you count LOC you're counting not just long lines, but also lines which are whitespace and used for comments as though they are the same. You can avoid this, but at the same time, you're still counting small lines and long lines equally.

2) It's misleading. Readability isn't purely a function of LOC. A class can be perfectly readable but if you have a LOC count which it violates, you're gonna find yourself working hard to squeeze as many lines out of it as you can. You may even end up making the code LESS readable. If you take the LOC to assign variables and then use them in a method call, it's more readable than calling the assignments of those variables directly in the method call itself. It's better to have 5 lines of readable code than to condense it into 1 line of unreadable code.

Instead, I'd look at depth of code and line length. These are better metrics because they tell you two things. First, the nested depth tells you if you're logic needs to be refactored. If you are looking at If statements or loops nested more than 2 deep, seriously consider refactoring. Consider refactoring if you have more than one level of nesting. Second, if a line is long, it is generally very unreadable. Try separating out that line onto several more readable lines. This might break your LOC limit if you have one, but it does actually improve readability.

indyK1ng
A: 

line counting == bean counting.

The moment you start employing tools to find out just how many lines of code a certain file or function has, you're screwed, IMHO, because you stopped worrying about managebility of the code and started bureaucratically making rules and placing blame.

Have a look at the file / function, and consider if it is still comfortable to work with, or starts getting unwieldly. If in doubt, call in a co-developer (or, if you are running a one-man-show, some developer unrelated to the project) to have a look, and have a quick chat about it.

It's really just that: a look. Does someone else immediately get the drift of the code, or is it a closed book to the uninitiated? This quick look tells you more about the readability of a piece of code than any line metrics ever devised. It is depending on so many things. Language, problem domain, code structure, working environment, experience. What's OK for one function in one project might be all out of proportion for another.

If you are in a team / project situation, and can't readily agree by this "one quick look" approach, you have a social problem, not a technical one. (Differing quality standards, and possibly a communication failure.) Having rules on file / function lengths is not going to solve your problem. Sitting down and talking about it over a cool drink (or a coffee, depending...) is a better choice.

DevSolar