Existem casos em que códigos mais detalhados (como em declarações mais lógicas) são mais limpos que códigos mais concisos?
Existem casos em que códigos mais detalhados (como em declarações mais lógicas) são mais limpos que códigos mais concisos?
Respostas:
Para responder a isso, vamos dar um exemplo do mundo real que aconteceu comigo. Em C # uma biblioteca que eu mantenho, eu tinha o seguinte código:
TResult IConsFuncMatcher<T, TResult>.Result() =>
TryCons(_enumerator) is var simpleMatchData && !simpleMatchData.head.HasValue
? _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
: _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
Discutindo isso com colegas, o veredicto unânime foi que as expressões ternárias aninhadas, juntamente com o uso "inteligente" de is varresultaram em código conciso, mas difícil de ler.
Então eu refatorei para:
TResult IConsFuncMatcher<T, TResult>.Result()
{
var simpleMatchData = TryCons(_enumerator);
if (!simpleMatchData.head.HasValue)
{
return _emptyValue.supplied
? _emptyValue.value
: throw new NoMatchException("No empty clause supplied");
}
return _recursiveConsTests.Any()
? CalculateRecursiveResult()
: CalculateSimpleResult(simpleMatchData);
}
A versão original continha apenas uma expressão composta com um implícito return. A nova versão agora contém uma declaração explícita de variável, uma ifdeclaração e duas explícitas returns. Ele contém mais instruções e mais linhas de código. No entanto, todos que eu consultei consideraram mais fácil ler e raciocinar, que são aspectos-chave do "código limpo".
Portanto, a resposta para sua pergunta é um enfático "sim", mais detalhado pode ser mais limpo que o código conciso e, portanto, é uma refatoração válida.
!a condição. Eu também sugeriria colocar o segundo retorno em um else. Mas mesmo assim, é uma grande melhoria.
if (!foo.HasValue)é um idioma no seu código, ainda mais fortemente. No entanto, ifnão é realmente uma saída cedo - é um "faça isso ou aquilo dependendo".
1. Falta de correlação entre LOC e a qualidade do código.
O objetivo da refatoração é melhorar a qualidade de um pedaço de código.
LOC é uma métrica muito básica que, às vezes, se correlaciona com a qualidade de um pedaço de código: por exemplo, é provável que um método com alguns milhares de LOC tenha problemas de qualidade. Deve-se notar, no entanto, que LOC não é a única métrica e, em muitos casos, carece de correlação com a qualidade. Por exemplo, um método 4 LOC não é necessariamente mais legível ou mais sustentável que um método 6 LOC.
2. Algumas técnicas de refatoração consistem na adição de LOCs.
Se você fizer uma lista de técnicas de refatoração , poderá identificar facilmente as que consistem na adição intencional de LOCs. Exemplos:
Ambas são técnicas de refatoração muito úteis, e seu efeito no LOC é completamente irrelevante quando se pensa em usá-las ou não.
Evite usar LOC.
LOC é uma métrica perigosa. É muito fácil de medir e muito difícil de interpretar corretamente.
Até você se familiarizar com as técnicas de medição da qualidade do código, considere evitar medir o LOC em primeiro lugar. Na maioria das vezes, você não obtém nada de relevante e, em alguns casos, isso o leva a diminuir a qualidade do seu código.
Se você deseja ver o resultado final de apenas minimizar a contagem de bytes ou LoC do seu código-fonte, consulte os envios para o site Stack Exchange Code Golf .
Se seu código-fonte for reduzido dessa maneira, em breve você terá uma bagunça insustentável. Mesmo que você seja a pessoa que escreveu esse código e o entenda completamente na época, qual será sua eficiência quando voltar a usá-lo daqui a seis meses? Também não há evidências de que esse código mínimo seja executado mais rapidamente.
O código deve ser escrito de tal maneira que qualquer membro da sua equipe possa analisá-lo e entender o que está fazendo imediatamente.
Sim, a refatoração pode definitivamente resultar em mais linhas de código.
O caso mais comum da IMO é quando você pega um código que não é genérico e o torna mais genérico / flexível . Gerar código facilmente faz com que as linhas de código aumentem significativamente (às vezes por um fator de dois ou mais).
Se você espera que o código recém-genérico seja usado por outras pessoas (em vez de apenas como um componente interno de software) como uma biblioteca, normalmente você acaba adicionando códigos mais unidos e marcação de documentação no código que aumentará as linhas de código novamente.
Por exemplo, aqui está um cenário muito comum que acontece para todo desenvolvedor de software:
Alguns exemplos concretos que me vêm à cabeça: