Pergunta

Estou um pouco atordoado por muitas reações sobre questões que apontam que os desenvolvedores se preocupam mais com os bytes compilados resultantes do que sobre o significado do seu código. I tendem a nit-pick sobre postfix / prefixo incremento, como eu tendem a nit-pick sobre o uso de um booleano para um tipo enumerado com dois valores, e cerca de nomeação função adequada, e ...

Portanto, a questão é mais uma pesquisa retórica: quando é uma permissão para ignorar a semântica do que se escreve? Onde está a linha de fronteira?

  • operador ++ (sufixo / prefixo)
  • String.Empty () Cadeia vs. == ""
  • vector.empty () vs. vector.size () == 0
  • enumerate {on, off} vs. boolean on = true; off = false
  • ...

Nomeá-lo.

EDIT -

Eu não tive a intenção de dúvida sobre a necessidade de (micro) -optimizations. Em vez disso, eu quero opiniões sobre quão bem você deve ser consciente do que você está escrevendo, e em declarações como "mas ele compila para um DWORD, de qualquer maneira, então por que eu deveria torná-lo um enum?" (Que é um caso extremo ...).

Foi útil?

Solução

Eu escrevi um monte do código na minha carreira. Certamente não tanto quanto muitas pessoas aqui, mas um monte de código, no entanto. Durante esse tempo, eu aprendi uma coisa que é provou ser verdadeira e outra vez:. Quando você ficar desleixado, quando você ignorar os detalhes, defeitos rastejar dentro

tempo Defeitos custo e dinheiro para o reparo. Você pode gastar o tempo para escrever o código de forma limpa e claramente na frente, quando é barato para fazer isso, ou você pode gastar muito tempo e dinheiro mais tarde perseguir um defeito no código que você provavelmente não se lembra de tudo o que bem porque você deu um tapa-lo em conjunto com pressa ou porque não está em conformidade com o padrão de codificação. O resultado final é, você está desperdiçando tempo e dinheiro. Além disso, você está desperdiçando tempo e dinheiro que você não tem que perder para começar, porque poderia ter sido evitado por um pouco adiantado investimento.

Eu nunca lamentei ser meticuloso sobre a maneira como código que eu escrevo. Ela nunca voltou para me assombrar. Sendo desleixado sempre voltar para me assombrar.

Outras dicas

Defina "ok". Está tudo bem se ele funciona na data da entrega inicial, mas cada vez que você precisa para fazer uma mudança que leva um extra de três semanas para descobrir o código antigo?

Aí está sua resposta:. Contanto que você possa entender o código e não faz mal a sua capacidade de mantê-lo

Quando você começar a se preocupar com o material esotérico que não têm nenhum efeito sobre a linha de fundo, eu acho que isso é ir longe demais. Discussões como se deve usar o operador ternário ou escrever explícita se as declarações são bons para aqueles dias em que você não tem nada a fazer senão sentar, colocar os pés para cima, saborear cerveja / vinho / soda e discutir questões de "grande importância":)

Mas a criação de uma enumeração para boolean é errado simplesmente.

Depende da sua função de custo

dimensões

aqui um par pessoas gostam de discutir, e muitas vezes conflação. Realmente, a resposta é que depende. O que é que você realmente valor?

  • Character count
  • Número de ops criado
  • em tempo de execução
  • Portabilidade
  • Maintainability
  • Clarity
  • Cleverness
  • Estabilidade (livre de bugs?)
  • extendability

Eu sempre apontar para o material de ordem superior primeira, como clareza. Perda de nitidez é pago em ciclos humanos, dos quais há sempre uma falta de. As pessoas raramente se preocupam com o tempo do relógio cru, e as pessoas que dizem que são quase sempre otimizar prematuramente.

Se o ajuda qualquer, eu gosto de pensar que estamos a fazer progressos, indo até a pilha, se preocupar mais com a semântica eo trabalho sendo feito em vez de ser escravos de bits e números. No entanto, isso não é uma desculpa para esquecer os fundamentos e lembre-se como certos pedaços semânticos são implementados. Você não quer ser pego com as calças para baixo durante daquelas raras oportunidades em que a velocidade começa a matéria e convenções sai pela janela.

"quando é uma permissão para ignorar a semântica do que se escreve? Onde está a linha de fronteira?"

Eu acho que uma pergunta razoável é: "Quando deve um desrespeito a semântica do que se escreve"

Desde que eu ver a programação como uma atividade humana, eu diria que o único tempo de deve desconsiderar a semântica de uma declaração é quando o próprio sistema obriga - quando alguma declaração incompreensível é o única maneira de fazer alguma coisa. Tais declarações são boas para documento.

A fronteira é quando você está lidando com write-once, ler nunca código. Só então é que em última análise, não importa o que você está fazendo (nesse caso), porque você nunca vai usá-lo novamente. Infelizmente, isso não resolve o feedback indireto de praticar coisas que você preferiria não repetir.

A linha de fronteira é efeitos colaterais.

Se uma função encapsulado faz tudo o que quiser com 0 efeitos colaterais inesperados, eo código é legível, isso é tudo que importa. Se você é previsível para um usuário fora e qualquer funcionalidade "bizarra" é realizado internamente, isso é tudo que importa.

Ele muda um pouco se você adicionar na otimização, mas desde que você nunca deve prematuramente otimizar, que é onde ela termina.

Micro otimizações são inúteis 99% do tempo. Por exemplo, se o seu compilador estagiários todos os "" para uma única instância de qualquer maneira, você não está aumentando o desempenho de qualquer forma usando String.Empty. Não tendo qualquer efeito mensurável é normalmente o melhor que se pode esperar muito, tenho visto "otimizações" performance diminuição, devido ao compilador fazer um trabalho melhor, ea otimização interferir com ele.

A maioria dos códigos não precisa ser otimizado. Identificar onde que precisa acontecer só pode ser feito com o diagnóstico após o código está sendo executado, e até mesmo, em seguida, na maioria das vezes é feito por meio da otimização algorítmica, não micro otimização.

Eu acho que hoje em dia a maioria das pessoas concorda que, supondo que ele funciona corretamente, a legibilidade é o aspecto mais importante. Há exceções, é claro - alguns aplicativos tem que correr o mais rápido possível, e alguns aplicativos pode não ser autorizados a falhar, mas em geral a sua legibilidade

.

Observando os exemplos que você forneceu - O seguinte:

operator++ (sufixo / prefixo)

string.empty() vs. string == ""

não parecem ser bons exemplos, como eles se comparam as operações que são diferentes em functionality. Assim, um melhor não ignorar suas distinções semânticas.

Em contraste, os seguintes exemplos:

vector.empty() vs. vector.size() == 0

enumerate {on, off} vs. boolean on=true; off=false

É perfeitamente razoável.

vector.empty() é preferível se o contexto da sua utilização só é para determinar se o vector está vazia. Correndo o risco soar condescendente (que eu faço não pretende ser): isso se resume ao senso comum. Por que pedir para o tamanho do vector, se você só quer saber se ele está vazio? Isso é como perguntar a alguém quanto dinheiro eles têm em sua carteira quando você simplesmente deseja saber se eles têm dinheiro suficiente para por um coque.

Quanto enumerate {on, off} vs. boolean on=true; off=false, pergunte-se: qual a probabilidade é que você pode adicionar outro valor à enumeração, no futuro? Parece razoável que um pode querer enumerate {on, off, indeterminate} `(ou alguma variação), então a resposta pode ser sim. Caso contrário, um simples boolean seria suficiente.

Isto leva-me ao cerne da sua pergunta: o que parece ser, se há alguma abordagem determinística / algorítmica de decidir de uma maneira ou outra sobre questões como estas, ou a sua relevância? A minha resposta é que, até o dia em que máquinas de Turing são capazes de passar o Teste de Turing , eu diria Não. Esta é a razão pela qual os seres humanos são necessários para engenheiro de software.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top