Eu uso funções parcialmente como uma maneira de documentar o código. Chamar uma função com um nome significativo facilita a compreensão do código. Em alguns casos, mesmo uma função com uma única linha faz sentido.
Por exemplo, em "Código Limpo", Robert C. Martin dá o seguinte exemplo: Qual deles você prefere ver? Este:
// Check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) &&
(employee.age > 65))
Ou isto?
if (employee.isEligibleForFullBenefits())
Nem sempre eu concordo com ele, mas neste caso eu concordo. O código deve ser legível, não apenas quando você o escreve e conhece todos os detalhes, mas também às 21:00 quando você precisa corrigir erros no código de outra pessoa. Olhar para uma condição longa e tentar descobrir todos os negativos duplos não é recomendado. Se você pode simplesmente colocar um nome nele (não apenas as condições, mas todos os trechos de código que você escreve), isso se torna muito mais simples.
Nunca me arrependi de colocar algo em uma função e, se você estiver preocupado com o desempenho, faça um perfil primeiro.
Há um mal-entendido generalizado de que chamadas de função devem ser feitas apenas para evitar segmentos de código repetitivos. Minha regra geral é que qualquer unidade lógica de trabalho seja transformada em uma função, mesmo quando usada apenas em um único local. Isso geralmente leva a uma melhor legibilidade e permite que você escreva um código de auto-documentação, onde os nomes das funções substituem os comentários e você não precisa escrever comentários adicionais explicando o que está fazendo.
fonte
Se for usado em mais de um lugar, e
então faça uma função ou método. Pedaços longos de código repetido, na minha experiência, naturalmente se enquadram em uma dessas categorias (geralmente a primeira, mas as categorias se sobrepõem muito;). Obviamente, qualquer coisa que precise estar na interface também é uma função / método por si só.
fonte
float x
,int y
edouble density
, então, configurá-los como uma função C pode ser mais complicado do que apenas repetir o código, já que você precisa criar uma maneira de obter todos os três valores. Se os cálculos repetidos são triviais, às vezes é melhor deixá-los alinhados.Quase sempre, especialmente se cada duplicata representa a mesma operação do ponto de vista conceitual. Se for executado da mesma maneira, mas em tipos diferentes, faça uma implementação genérica.
O único motivo para não fazer isso é o de manutenção: às vezes pode ser mais conveniente evitar criar uma dependência entre coisas separadas, mesmo ao custo de alguma duplicação.
fonte
Uma pesquisa por " refatoração " levará você a muitos recursos para as "melhores práticas" do setor para esse processo muito comum. O artigo um pouco famoso, Once and Only Once, é uma ótima referência histórica, explicando o que alguns consideram "melhores práticas" para as preocupações levantadas por sua pergunta. Além disso, o conceito ainda mais geral é conhecido como Não se repita (DRY) . Para obter um conjunto realmente profundo de respostas à sua pergunta, leia o grande clássico de Martin Fowler , Refatoração: aprimorando o design do código existente , que aborda alguns dos conselhos mais conhecidos sobre refatoração , que é o que você está tentando intuitivamente realizar !
fonte
Se o código for exatamente repetido em mais de uma vez e a seção repetida não for alterada no futuro próximo, eu o divido em uma função.
fonte
Isso depende da natureza da coesão do código repetido. Se a seção repetida do código estiver executando uma função específica, é um excelente candidato para ser transformado em um método, em parte por causa do princípio DRY , em parte porque se a função precisar ser otimizada ou corrigida, haverá apenas uma seção de código para lidar.
Se a associação for coincidente, é melhor repetir o código do que transformá-lo em um método. Se você precisar adicionar algo no meio de uma das seqüências de código para satisfazer um dos usos desse snippet, se estiver em um método, a alteração que você fizer poderá afetar outros usos desse método.
Veja o artigo da Wikipedia sobre o conceito de coesão do código .
fonte
Você precisa distinguir entre funções no sentido de programação estruturada e métodos de uma classe.
No seu exemplo, o que você mostrou é um método e, como tal, não deve ser codificado em linha.
pode ser necessário validar uma sequência para ver se é um número ou não; nesse caso, você usa uma função e a maioria das respostas anteriores se aplica.
Essa distinção é importante principalmente em grandes projetos.
Na medida do possível, lute para separar as regras de negócios (que são métodos) dos algoritmos de computação (que são funções de programação puras).
fonte