Existe um número ideal de linhas de código por função? [fechadas]


18

As funções não são usadas apenas para minimizar a duplicação de código - elas também são usadas para dividir uma função longa em outras menores para aumentar a legibilidade, além de tornar o código com comentários próprios. No entanto, esse ganho não é diretamente inversamente proporcional ao número de LOCs por função ou método; caso contrário, teríamos toneladas de funções, todas contendo apenas uma única linha ou duas de código.

Isso me levou a pensar: existe um número ideal de LOCs por função? Em caso afirmativo, o que é e se desvia entre os idiomas?


6
Veja Code Complete Vol 2, de Mitch McConnell, capítulo 7, seção 4, para se divertir.
Peter Turner

2
@ Peter - Eu acho que você quer dizer "Steve McConnell"
JohnFx

Sim, engraçado, eu escreveria isso enquanto olhava o livro ... O Mitch McConnell Pres não era. Chefe de gabinete de Bush?
Peter Turner

3
O número quase certamente varia de acordo com o idioma: eu ficaria surpreso ao ver uma cláusula Prolog de 6 linhas, enquanto estava perfeitamente bem com o método Delphi de 20 linhas. Minha resposta abaixo é para Smalltalk, que usa o ambiente para incentivar métodos curtos.
Frank Shearar

1
@ Peter Turner: Hm ... S1 a S15 e I1 a I11. Parece que ele está confundindo variáveis ​​temporárias com registradores. ^^
gablin 6/10/10

Respostas:


33

Em vez do número de linhas, o critério que eu usaria é que cada função faça apenas uma coisa e faça bem.


Sim, se tivermos uma unidade de trabalho, não quero ter que mudar entre 50 funções para entender o que está acontecendo. Se você interromper suas funções adequadamente usando essa métrica, elas deverão quase naturalmente ter um tamanho razoável.
perfil completo de ChaosPandion

2
@ChaosPandion: mas sua unidade de trabalho provavelmente pode ser expressa como uma sequência de etapas mais elementares. Se você estiver revisando a função, revisará a sequência de etapas, não o código de cada etapa.
precisa saber é o seguinte

2
@ Lorenzo - Se for esse o caso, cada etapa se torna a unidade de trabalho. A função pai se torna uma visão geral de alto nível das unidades de trabalho.
perfil completo de ChaosPandion

1
Sim, isso é realmente verdade. Hum, deixe-me reformular a pergunta: existe um número ideal de LOCs para funções que fazem apenas uma coisa e faz bem?
gablin

@ gablin, difícil de dizer e também os LOCs dependem do idioma, mas se você aderir a esse princípio, geralmente acabará dentro de um intervalo razoável, digamos 1 ~ 50.
grokus

21

Uma regra antiga é que uma função deve ser totalmente visível na tela, sem a necessidade de rolagem.

A idéia básica é que, se você não pode olhar para a função inteira de uma vez, a função é muito complexa e você deve dividi-la em partes mais básicas.

Embora essa regra seja muito prática e útil, a regra formal é que você deve manter apenas uma única etapa lógica em uma função. Uma função faz apenas um trabalho elementar; se você pode dividir o trabalho em partes mais elementares, a função deve ser dividida.


21
Essa métrica se torna progressivamente mais inútil à medida que o tamanho / resolução média do monitor aumenta.
Adam Lear

2
Nossa prof programação apenas disse este exemplo na outra noite :)
cdnicoll

2
@ Anna: bem, meu monitor é de alta resolução, mas também o número de barras de ferramentas / paletas / painéis aumentou. E então, agora eu posso usar fonte de pitch de 14 pt! :)
Wizard79

4
O tamanho 24 x 80 de um terminal não costuma mudar.
alternativa

1
absurdo, o objetivo da regra é "você pode ver tudo sem rolar". Com um monitor grande, você pode ter mais em sua função sem violar essa regra, isso não significa que os grandes monitores só podem exibir pequenas funções (embora com todas as barras de ferramentas e janelas de propriedades que seu IDE possui, isso provavelmente ainda é verdadeiro: - ))
gbjbaanb

15

Não há nenhum.

As telas estão ficando maiores, os tamanhos das fontes menores. As regras práticas não funcionam tão bem quando as pessoas têm polegares de tamanhos diferentes.

Ser conciso. Se sua função faz várias coisas, provavelmente é uma boa ideia dividi-la em outras menores.


O mínimo que você pode fazer é me dizer por que você acha que minha resposta não é útil.
Josh K

7
Acho que alguém ficou ofendido com o uso da tag h1 .
precisa saber é o seguinte

@ Chaos: Essa é a resposta essencial.
Josh K

6
Talvez eu tenha sido um pouco sutil, mas minha intenção era sugerir que não há motivo válido para recusar sua resposta. Quem fez a ação teve algum motivo pessoal aleatório para fazê-lo. Eles podem simplesmente pensar que Josh é um nome horrível.
amigos estão dizendo sobre chaospandion

6

O Smalltalk possui uma maneira um pouco incomum de reduzir o tamanho dos métodos. Ao escrever o código, você o escreve em um widget chamado Navegador. Um navegador tem duas partes principais, divididas horizontalmente. Seu código está na metade inferior.

Por padrão, um navegador não é muito grande. Você pode ajustar 5 ou 6 linhas antes de começar a rolar. A rolagem, é claro, é um pouco irritante.

Assim, no Smalltalk, o ambiente "incentiva" você a escrever métodos curtos, com no máximo 6 linhas de comprimento. (Geralmente, isso é bastante; Smalltalk é uma linguagem bastante concisa.)


2

O número ideal de linhas de código em um método é variável. Basicamente, você deseja escrever apenas o código suficiente para fazer o que precisa ser feito dentro do contexto da definição da função. Penso nisso como um tipo de Princípio de Responsabilidade Única , aplicado apenas a um método em vez de a uma classe.

Onde um método tem muita lógica e várias etapas a serem concluídas, faz sentido dividir o método em várias etapas distintas. Cada uma dessas etapas seria extraída em novos métodos, conforme necessário.

"caso contrário, teríamos toneladas de funções, todas contendo apenas uma única linha ou duas de código".

Quanto menos método, mais fácil é definido e mais simples de entender e gerenciar. Não há nada errado em ter centenas de métodos, se você precisar deles. Além disso, de acordo com o SRP que mencionei anteriormente, fica mais fácil extrair novas classes quando os métodos são divididos em partes menores e mais gerenciáveis.


1

A resposta é obviamente 42 .

Importante observar: Nenhuma função pode violar o SRP , ou você deve enfrentar a inquisição em espanhol .

Algumas dicas de como reduzir a quantidade de linhas:

  • Existem comentários marcando seções individuais? Essas seções devem ser funções.
  • Existem cadeias if-else ou instruções de switch fora de uma fábrica / construtor? Seu design pode precisar de alguns padrões de design melhores para ajudá-lo a dividir responsabilidades.
  • Suas funções são fáceis de testar? Torne suas funções fáceis de testar, pois elas desmoronarão.
  • É complexo e simplesmente não há terra em sigth (monstros de 1000 linhas)? Faça refatoração de sucata - isto é refatoração e não a salve na esperança de ser informado sobre as responsabilidades dos códigos.

1
Nᴏʙᴏᴅʏ espera o espanhol ... ah, caramba, estou um pouco atrasado aqui.
usar o seguinte comando

0

Aqui estão algumas dicas:

  • Se você estiver com problemas para escrever o comentário explicando a finalidade e o uso da função, é muito longo.

  • Se você é tentado a escrever um comentário explicando a atividade de uma seção de código na função, a função é muito longa.

  • Se você estiver colando código de outra função, ambos serão muito longos (extraia esse código como uma função separada).

  • Se você precisar de uma convenção de codificação para separar os membros dos dados da classe das variáveis ​​locais, a função será muito longa e a classe terá muitos membros.

  • Se você precisar fazer anotações durante a leitura de uma função, é muito longo.

Ter 'toneladas' de funções, cada uma com apenas uma ou duas linhas, não é necessariamente uma coisa ruim. Eu descobri que essas pequenas funções foram reutilizadas muito mais do que eu esperava inicialmente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.