Quantas linhas por classe são demais em Java? [fechadas]

69

Em sua experiência, o que é uma regra útil para quantas linhas de código são demais para uma classe em Java?

Para ser claro, eu sei que o número de linhas não está nem perto do padrão real a ser usado para o que deveria estar em uma determinada classe e o que não deveria. As aulas devem ser projetadas de acordo com as filosofias próprias da OOP (encapsulamento, etc.) em mente. Dito isso, uma regra prática pode fornecer um ponto de partida útil para refatorar considerações (ou seja, "Hmmm, essa classe tem & nt linhas de código; provavelmente é ilegível e faz um péssimo trabalho de encapsulamento, por isso talvez queira ver se deve ser refatorado em algum momento ").

Por outro lado, talvez você tenha encontrado exemplos de classes muito grandes que ainda obedeciam bem ao design da OOP e eram legíveis e fáceis de manter, apesar de seu tamanho?

Aqui está uma função relacionada, não duplicada pergunta sobre linhas por função .

    
por Michael McGowan 08.04.2011 / 19:18
fonte

10 respostas

72

Algumas métricas interessantes:

            junit  fitnesse testNG    tam     jdepend    ant     tomcat
            -----  -------- ------    ---     -------    ---     ------
max           500       498   1450    355         668   2168       5457
mean         64.0      77.6   62.7   95.3       128.8  215.9      261.6
min             4         6      4     10          20      3         12
sigma          75        76     110    78         129    261        369
files          90       632   1152     69          55    954       1468
total lines  5756     49063   72273  6575        7085 206001     384026

Eu uso o FitNesse como uma referência porque eu tinha muito a ver com a escrita. No FitNesse, a classe média tem 77 linhas de comprimento. Nenhum tem mais de 498 linhas. E o desvio padrão é de 76 linhas. Isso significa que a grande maioria das classes tem menos de 150 linhas. Mesmo o Tomcat, que tem uma classe acima de 5000 linhas, tem a maioria das classes com menos de 500 linhas.

Considerando isso, provavelmente podemos usar 200 linhas como uma boa diretriz para ficarmos abaixo.

    
por 09.04.2011 / 00:52
fonte
30

Para mim, linhas de código são irrelevantes neste contexto. É tudo sobre o número de diferentes razões pelas quais eu iria a essa classe para mudar isso.

Se eu fosse a essa classe quando quisesse alterar as regras de validação de uma Pessoa, não quero ir para a mesma classe para alterar as regras de validação de um Pedido, nem quero vir aqui para mude onde eu persisto uma pessoa.

Dito isto, se você pretende isso, raramente encontrará classes com mais de 200 linhas. Eles vão acontecer, por razões válidas, mas eles serão raros. Então, se você está procurando uma métrica de bandeira vermelha, então não é um mau lugar para começar; mas faça disso uma diretriz, não uma regra.

    
por 08.04.2011 / 19:30
fonte
22

Sinto muito, mas estou muito surpreso que muitas respostas afirmam que "realmente não importa". É MUITO importante quantas linhas estão em uma classe. Por quê? Considere esses princípios ao escrever um bom código Java ...

  • Testabilidade
  • Coesão
  • Acoplamento
  • Entendimento

Classes com muitas linhas provavelmente violarão todos esses princípios.

Para aqueles que afirmaram que "realmente não importa" ... Quanta diversão foi para você tentar entender uma classe que tem mais de 5000 linhas? Ou, para modificá-lo? Se você diz que é divertido, você tem uma estranha afinidade com a dor ...

Eu diria que qualquer classe que tenha mais de 1000 linhas nela deve pelo menos ser questionada sobre como eles podem estar violando os princípios acima e possivelmente analisados em várias classes "off-shoot".

Meus comentários são baseados na leitura e no estudo de autores como Martin Fowler, Joshua Bloch e Misko Hevery. Eles são excelentes recursos para consultar para escrever um bom código Java.

Faça o próximo (que poderia ser você daqui a alguns anos) um favor e se esforce para escrever classes que tenham menos em vez de mais linhas nelas.

    
por 07.02.2013 / 16:54
fonte
12

Depende da complexidade, não do número de linhas. Eu escrevi grandes rotinas idiotas que eram fáceis de entender e que faziam exatamente uma coisa e faziam bem, mas continuaram por centenas de linhas. Eu escrevi funções razoavelmente curtas que eram difíceis de entender (e depurar).

Outra coisa que você pode ver é o número de funções públicas em uma classe. Isso também pode ser um sinal de alerta.

Eu não tenho boas contagens disponíveis, mas eu sugiro olhar para algum código decente que faz coisas úteis em sua loja, e baseando-se nisso. Certamente você deve olhar as classes mais longas e as maiores APIs.

    
por 08.04.2011 / 19:39
fonte
5

A resposta correta é 42. Brincadeira.
Na verdade, as linhas máximas recomendadas por turma são 2000 .

"Convenções do Código Java" desde 1999 afirmaram desta forma:
Arquivos com mais de 2000 linhas são incômodos e devem ser evitados.

Tendo seguido as convenções Sun / Oracle Coding desde que o Java foi inventado, Eu encontrei esta regra nas linhas por classe para ser razoável. 99% do seu código Java deve estar de acordo ... E se for mais de 2000, basta colocar um TODO no topo dizendo que a classe precisa de trabalho.

A pior coisa é o caso oposto quando programadores criam muitos minúsculos turmas pequenas com quase nenhuma funcionalidade real em cada classe. Ignorando o conselho para "Favorecer Composição", os programadores criam centenas de classes herdadas que criam modelos de objetos complicados que são muito piores do que o problema de classe grande (que pelo menos geralmente mantém a funcionalidade com um nome de classe relevante).

link

    
por 12.07.2013 / 16:51
fonte
4

Existem muitas linhas de código se a classe estiver fazendo muitas coisas diferentes. Essencialmente, se você seguir o princípio da responsabilidade única para as aulas, há um limite para o tamanho da classe que irá crescer.

Quanto às limitações físicas que você pode ter (fonte: Formato de arquivo de classe Java5 ):

  • 65.536 constantes, interfaces aplicadas, campos, métodos e atributos - cada. NOTA: você ficará sem espaço constante antes de ficar sem qualquer dos outros itens. NOTA 2: os atributos são construções de arquivos de classes - não devem ser confundidos com os marcadores '@Attribute' (isto é, informações de depuração e código de bytes são armazenados como atributos separados para um método).
  • Cada método pode ter 4 GB (32 bits) de código de bytes gerado. NOTA: As versões do Java anteriores a 1.5 só podiam ter 64 KB (16 bits) de código de bytes gerado para cada método.

Em suma, o arquivo de classe pode ser muito maior do que qualquer pessoa consideraria útil. Se você se ativer ao princípio de responsabilidade única, os arquivos de sua turma terão o tamanho certo.

    
por 08.04.2011 / 19:51
fonte
4

código limpo:

Classes Should Be Small!

The first rule of classes is that they should be small. The second rule of classes is that they should be smaller than that. No, we’re not going to repeat the exact same text from the Functions chapter. But as with functions, smaller is the primary rule when it comes to designing classes. As with functions, our immediate question is always “How small?”

** With functions we measured size by counting physical lines. With classes we use a different measure. We count responsibilities.**

The name of a class should describe what responsibilities it fulfills. In fact, naming is probably the first way of helping determine class size. If we cannot derive a concise name for a class, then it’s likely too large. The more ambiguous the class name, the more likely it has too many responsibilities. For example, class names including weasel words like Processor or Manager or Super often hint at unfortunate aggregation of responsibilities.

Então:

  • Apenas certifique-se de que seus métodos façam apenas uma coisa.
  • Verifique se a turma não tem muitas responsabilidades.

Você terá uma classe de tamanho gerenciável.

    
por 12.07.2013 / 17:02
fonte
2

O número de linhas é uma métrica muito ruim para a qualidade da turma. Para mim, eu gosto de olhar (como outros já mencionaram) por métodos públicos, bem como quaisquer propriedades publicamente expostas (eu acho que public getters / setters em Java). Se eu tivesse que puxar um número do ar para quando ele pudesse chamar minha atenção, eu diria quando houver mais de 10 de cada. Realmente, se for mais do que cerca de 5 de propriedades ou métodos, vou dar uma olhada e, muitas vezes, encontrar maneiras de refatorar, mas qualquer coisa acima de 10 é geralmente um sinal de alerta de que é provável que algo esteja mal exposto.

É outra conversa inteiramente, mas os métodos e campos privados são menos cheirosos para mim, então se eles estão contribuindo muito para o número de linhas, então eu posso não estar tão preocupado. No mínimo, isso mostra que provavelmente não há algum controlador de Deus manipulando o objeto de longe, o que é um problema de design bem problemático.

    
por 08.04.2011 / 19:57
fonte
2

Tente usar uma métrica melhor.

Um exemplo é o ABC Metric . É mais uma medida de quanto trabalho está sendo feito pelo código do que quanto código existe.

    
por 20.09.2011 / 20:21
fonte
1

Qualquer linha que esteja dentro do domínio do problema da sua classe escrita fora da classe é uma linha muito pequena e uma demais na classe em que ela está. Pense em uma aula como um tópico. Você tem que cobrir isso. O mais conciso possível é ideal, mas se forem necessárias 500 linhas, são necessárias 500 linhas. Se 100 dessas linhas cobrem outro tópico, elas pertencem a outro lugar. Invadir subdomínios menores dentro da classe como classes internas faz sentido, mas eu só definiria aqueles fora da classe se eles tivessem usado em outro lugar.

    
por 12.07.2013 / 17:03
fonte