A simplicidade sempre melhora a legibilidade?

32

Recentemente, eu estava desenvolvendo um conjunto de padrões de codificação para nossa empresa. (Somos uma nova equipe que se ramifica em um novo idioma para a empresa.)

No meu primeiro rascunho, defino o objetivo de nossos padrões de codificação como melhorar a legibilidade, a manutenção, a confiabilidade e o desempenho. (Ignorei gravabilidade, portabilidade, custo, compatibilidade com padrões anteriores etc.)

Um dos meus objetivos ao escrever este documento foi promover a idéia de simplicidade de código. A idéia era que deveria haver apenas uma chamada de função ou operação por linha. Minha esperança era que isso aumentasse a legibilidade. É uma ideia que eu carreguei da nossa língua anterior.

No entanto, questionei a suposição por trás desse impulso:

A simplicidade sempre melhora a legibilidade?

Existe um caso em que escrever código mais simples diminui a legibilidade?

Deve ser óbvio, mas por "mais simples", não quero dizer "mais fácil de escrever", mas menos coisas acontecendo por linha.

Richard
fonte
16
Se a alternativa é o código "inteligente", então sim ...
Oded
2
sim - de Occam's Razor - pt.wikipedia.org/wiki/Occam%27s_razor
aggietech
17
Tente evitar usar termos rígidos como sempre e nunca. Isso evita o foco em casos extremos e, em vez disso, concentra-se nos problemas mais comuns que enfrentamos. É disso que trata as melhores práticas.
usar o seguinte
na verdade, você deseja 2 funções / operações por linha. a = bé uma operação, b + cé uma segunda, o que significa a = b + cé 2 operações. O encadeamento de 2 funções / operadores ainda é legível:, foo(bar())ou a = foo().
precisa
2
Além disso, não se preocupe muito. Se você tentar eliminar toda a subjetividade de suas explicações, assim como tentar especificar todos os detalhes possíveis do estilo de codificação em um milhão ou mais de regras, seus padrões serão excessivamente complexos, ilegíveis, ignorados e, portanto, inúteis.
Steve314 6/12/11

Respostas:

47

"Simples" é uma palavra usada em excesso. "Legível" pode ser lucrativamente definido como "simples de entender"; nesse caso, aumentar (essa medida de) simplicidade por definição aumenta a legibilidade, mas acho que não é isso que você quer dizer. Eu escrevi sobre isso em outro lugar , mas geralmente algo pode ser chamado de "mais simples", sendo mais abstrato (nesse caso, menos conceitos podem expressar mais fenômenos) ou mais concreto (nesse caso, um conceito não requer tanto conhecimento de fundo) conhecimento para entender em primeiro lugar). Estou argumentando que, dependendo da perspectiva, um conceito mais abstrato pode ser razoavelmente chamado de mais simples que um conceito mais concreto, ou vice-versa . Isso, mesmo que "abstrato" e "

Vou usar como exemplo algum código Haskell que escrevi há algum tempo. Fiz uma pergunta no stackoverflow sobre o uso da mônada List para calcular um contador no qual cada dígito poderia ter uma base diferente. Minha solução final (sem conhecer muito Haskell) parecia:

count :: [Integer] -> [[Integer]]
count [] = [[]]
count (x:xs) =
  -- get all possible sequences for the remaining digits
  let
    remDigits :: [[Integer]]
    remDigits = count xs
  in
  -- pull out a possible sequence for the remaining digits
  do nextDigits <- remDigits
     -- pull out all possible values for the current digit
     y <- [0..x]
     -- record that "current digit" : "remaining digits" is
     -- a valid output.
     return (y:nextDigits)

Uma das respostas reduziu isso para:

count = mapM (enumFromTo 0)

Qual destes itens é "mais simples" de entender (isto é, mais legível) depende inteiramente de quão confortável o leitor se tornou com operações monádicas (abstratas) (e, nesse caso, de código sem pontos). Um leitor que se sinta muito confortável com esses conceitos abstratos preferirá ler a versão (mais curta) mais abstrata, enquanto um que não se sentir confortável com essas operações preferirá ler a versão (mais longa) mais concreta. Não há uma resposta sobre qual versão é mais legível e válida para todos.

Aidan Cully
fonte
11
Alguns desenvolvedores progredirão até entender e preferir o one-liner. Difícil imaginar um desenvolvedor que entende o one-liner que prefere a versão longa. Portanto, a OMI, o one-liner, é claramente melhor.
kevin cline
7
@kevincline - supondo que o desenvolvedor esteja trabalhando isoladamente, eu concordo, a versão mais curta é (provavelmente) melhor. Se ela estiver trabalhando como parte de uma equipe, e a equipe não estiver no nível em que eles entendem e preferem o one-liner, e todos devem poder manter o código, então a versão longa é (provavelmente) melhor nessa circunstância .
quer
6
Como contraponto: como você é um Haskeller experiente, pode ler a segunda versão rapidamente. A primeira versão, por outro lado, exigiria ler e entender significativamente mais código; você não poderia fazer isso de relance. Eu acho que isso torna a segunda versão mais simples.
Tikhon Jelvis
6
@ Steve314: mapMé bastante idiomático e enumFromTofaz exatamente o que diz na lata. Em geral, acho que é realmente mais fácil cometer erros isolados se você expandir o código - há simplesmente mais código para cometer um erro. Isso é especialmente evidente em coisas como loops e procedimentos de ordem superior em outros idiomas. , mas acho que é um princípio geral.
Tikhon Jelvis
1
@ Tikhon - mas isso não significa necessariamente ler tanto código, e o código está ali. Significando que pode haver uma troca. Geralmente fortemente unilateral a favor do uso de funções existentes, em vez de reinventar a roda, mas há exceções. Isso fica muito óbvio no C ++, com alguns dos "algoritmos" mais triviais da biblioteca padrão - usá-los ocasionalmente pode ser mais detalhado e menos claro do que escrever o código diretamente.
Steve314
13

Se o seu padrão de codificação é sobre "Legibilidade, Manutenção, Confiabilidade e Desempenho" , basta indicar isso .

Não tente prescrever como alcançar essas coisas, pois sempre haverá situações em que há um contra-exemplo.

O que você precisa prescrever é algo que fará com que o código seja quebrado se não for respeitado também. Os traços estilísticos não quebram o código e devem ser sugestões (desde que a maioria da equipe concorde que é Legibilidade, o restante deve ser a preferência do desenvolvedor (com revisão do código para que a pressão dos colegas lembre as pessoas de que outras pessoas precisam ler o código)) .

Martin York
fonte
Esse era o objetivo que eu pretendia e esse era o objetivo declarado. A simplicidade (ou melhor, a única função / operação por linha) parecia seguir naturalmente esse objetivo. Estou tentando verificar se meu entendimento é inválido. Ao criar um padrão de codificação, o estabelecimento de um conjunto de regras e diretrizes é o objetivo principal do exercício. Definir regras e diretrizes muito vagas é inútil. Como tal, esta resposta realmente não ajuda.
Richard
5
Meu argumento é que definir regras muito rígidas é pior do que inútil e é realmente prejudicial. Definir regras como uma declaração por linha é estilístico. Isso é algo que definitivamente NÃO deve estar nas diretrizes de código. Ele não fornece benefícios reais e pode ser prejudicial à legibilidade e manutenção se aplicado sem pensar.
Martin York
3
+1 (porque não posso +10) Um erro comum que vejo com os novos gerentes de programação é que eles tentam codificar todos os detalhes. Os melhores padrões de codificação são mais como biscoitos da sorte do que receitas.
JohnFx
"Estilos e padrões de codificação" era o nome do documento. Obviamente, isso não é um padrão (como em "Nunca use GoTo" ou "Nunca use short ints"), mas um estilo. O estilo de unificação é importante para facilitar a legibilidade e a manutenção.
Richard
1
Guia de estilo: "Este projeto usa guias / espaços (escolha uma). Este projeto usa o estilo de chave K & R / Allman / BSD / GNU (escolha uma). Por favor, não adicione espaços vazios no final das linhas. Mantenha seu código limpo e legível.Tudo será revisado por dois membros da equipe e por você: para facilitar a leitura / manutenção, você precisa de 2/3 para verificar o código, Para confiabilidade e desempenho, precisa de 3/3 (forneça os testes adequados para provar ). Mais regras serão adicionadas se elas forem abusadas :-) "Concluído.
Martin York
7

Menos "itens por linha", simplicidade e legibilidade não são a mesma coisa. Pode-se pegar um algoritmo não documentado obscuro incrivelmente complicado e codificá-lo com 1 instrução por linha em vez de 2, e ele não se tornará muito mais legível.

Menos "material por linha" também pode exigir o fornecimento de desenvolvedores com grandes monitores altos para ver os blocos de código agora se espalharem mais verticalmente. Ou causar cansaço visual ao ler fontes menores.

A legibilidade é sua própria métrica, que geralmente requer um compromisso entre várias outras métricas mais facilmente mensuráveis. Pré-restrinja todas as outras métricas e o compromisso não se torna mais possível, resultando em código menos legível.

hotpaw2
fonte
5

Sempre? - NÃO

Ironicamente, atingir o nível certo de simplicidade pode ser uma tarefa complexa. Eu acho que a chave está com moderação. A simplicidade também pode estar nos olhos de quem vê, por isso, se você pensar demais - apenas deixe em paz ou volte mais tarde.

Pessoalmente, quando tento voltar e simplificar algo que escrevi, concentro-me nas áreas em que mudei de idéia ou tentei algumas coisas para conseguir o que queria. Essas áreas geralmente podem ser suavizadas. Em seguida, basta fazer algumas passagens pelo código para torná-lo mais legível sem espalhar tanto as coisas que você está pulando por todo o lado para descobrir o que está acontecendo em uma depuração.

DKnight
fonte
5

Se eu optar pela simplicidade, posso escrever um código como este:

10000000000000000000000000000000000000000000

Mas se eu for de legibilidade, vou preferir isso:

1e43

Por outro lado, 1000é muito mais legível e simples do que a 1e3menos que você trabalhe com números em notação científica o tempo todo.

Este é um exemplo degenerado de um padrão muito mais geral que você pode encontrar em quase qualquer lugar - criar algo com blocos muito simples pode rapidamente se tornar ilegível / ineficiente / ruim de várias maneiras diferentes. Generalizar e reutilizar, por outro lado, é mais difícil a princípio ("o que é isso e?! Eles quiseram escrever 1343?", Alguém poderia dizer), mas pode ajudar muito a longo prazo.

Rotsor
fonte
Seu argumento sobre "1e3" ser menos legível que "100" é bem colocado. De fato, este é um ótimo exemplo de como a carga cognitiva influencia a legibilidade. "1e3" requer a leitura de 3 caracteres E a tradução da exponenciação. A leitura de "100" requer a leitura de 3 caracteres e nenhuma avaliação adicional.
Stephen Gross
Stephen, na verdade, ao ler um número de três dígitos, 100é necessário realizar duas multiplicações e duas adições ( 0+10*(0+10*1)). No entanto, tendo se acostumado a essa notação, você nem percebe isso. Isso mostra novamente como a noção de simplicidade pode ser subjetiva.
Rotsor
Interessante. Portanto, estritamente falando, "100" requer 2 multiplicação (1 * 100, 0 * 10) e 2 operações de adição. "1e3" requer uma operação de multiplicação. Portanto, na ausência de qualquer contexto cognitivo , "100" é mais difícil de ler do que "1e3". Mas! Se você incluir a carga cognitiva de alternância de contexto, o cálculo será diferente. Como normalmente lemos números inteiros na forma não científica, "100" é mais fácil. Mas, se estamos escrevendo um aplicativo de engenharia no qual todos os números são expressos em notação científica, a forma "1e3" é mais fácil!
Stephen Gross
2

Não necessariamente. Se você tem uma operação complexa, essa complexidade precisa ir a algum lugar. Reduzir o número de "coisas" que aparecem em uma linha significa apenas que ocupará mais linhas, o que pode ser prejudicial para a legibilidade do código se tornar sua rotina "alta" demais para caber em uma tela.

Mason Wheeler
fonte
Complexidade não é irredutível. Temos "abstração" e "divisão" e "organização" para tentar gerenciar a complexidade. Eu pensaria que uma operação complexa pode ser descrita em várias etapas mais simples. Ele funciona para muitos processos físicos do mundo real: resumos, visões gerais, etc.
S.Lott
1
@ S.Lott: Verdade, mas rolagem e clique com a tecla Ctrl suficientes podem dificultar o processo "simplificado". Eu já vi isso acontecer uma ou duas vezes (não é comum, mas pode ser muito frustrante trabalhar quando vai longe demais).
FrustratedWithFormsDesigner
3
@ S.Lott - ainda existem limites para até que ponto a complexidade pode ser reduzida. Você pode eliminar a complexidade desnecessária, mas só pode gerenciar (não eliminar) a complexidade necessária - a complexidade inerente aos requisitos. Indiscutivelmente, os mecanismos para gerenciar a complexidade também aumentam a complexidade - alguma complexidade adicional está envolvida em afastar a complexidade irrelevante para revelar melhor os detalhes relevantes para um aspecto / problema / construto específico.
Steve314
1
@ S.Lott - Bem, certamente é verdade que você pode representar qualquer requisito que desejar com um arquivo fonte de complexidade zero (completamente vazio). Mas como você precisa de um idioma muito específico para atender aos seus requisitos, tudo o que você está fazendo é movê-los para a especificação do idioma.
Steve314
1
@ S.Lott - se você está afirmando que pode prever a posição de Júpiter no dia de Natal usando nada G=0, mas acho que você é louco. Se você não estiver, está perdendo o meu ponto. Certamente você pode abstrair os detalhes irrelevantes, mas não é irrelevante se os seus requisitos dizem que são relevantes. Se você ler novamente, nunca afirmei que toda a complexidade é necessária - apenas que alguma complexidade é inerente aos requisitos e não pode ser eliminada.
Steve314
2

Clareza + Padrões + Reutilização de código + Bons comentários + Bom design pode melhorar a legibilidade .

A simplicidade nem sempre está na mão do desenvolvedor, devido à natureza dos algoritmos e à complexidade da estrutura do aplicativo atualmente.

Pegue as páginas da web simples que executam tarefas simples. Dada uma rotina de classificação, não é possível simplificar a lógica, mas você pode torná-la mais clara com comentários, usando nomes de variáveis ​​significativos, tendo a escrita de maneira estruturada etc.

NoChance
fonte
2

A simplicidade sempre melhora a legibilidade?

Não. Eu já vi muitos casos em que fazer várias coisas mais simples em uma linha é menos complexo do que ter várias linhas.

Há uma troca entre menos código e código mais simples.

Em geral, eu recomendaria o código mais simples, a menos que você tenha certeza de que fazê-lo em menos linhas seja melhor. Eu preferiria ter código "muito detalhado" sobre código "muito complexo".

Tom Squires
fonte
1

"Torne as coisas o mais simples possível, mas não mais simples" - uma paráfrase frequente de Albert Einstein

A simplicidade melhora tudo . Para diferentes valores de simplicidade, é claro. São menos linhas de código? Talvez. É um executável menor? Possivelmente. É algo que sua equipe precisa concordar? Absolutamente .

Jesse C. Slicer
fonte
+1 para a cotação, mas a simplicidade melhora a legibilidade?
Richard
"Tornar as coisas o mais simples possível e depois simplificá-las" é uma paráfrase melhor, pois os engenheiros da SW são propensos a mais de engenharia.
mattnz
1
Eu gostaria que as pessoas parassem de dizer "faça as coisas o mais simples possível, mas não mais simples". Não podemos pelo menos generalizar para MakeAsGoodAsPossibleButNoMoreSo <Thing, Attribute> como nossa dica de engenharia geral inútil? (Desculpe, Jesse C. Slicer, você está longe de ser a única pessoa a citar isso, para que você realmente não mereça o mini-discurso mais do que ninguém).
Psd
1

A simplicidade sempre melhora a legibilidade? Sim. Uma declaração por linha é sempre mais simples? Não. Muitas línguas possuem um operador ternário, que, uma vez entendido, é mais simples e fácil de entender do que as atribuições equivalentes if / else.

Em idiomas que permitem que várias variáveis ​​sejam definidas em uma linha, isso costuma ser mais simples e fácil de entender do que seja o equivalente.

Outro exemplo: expressões regulares fazem muito, geralmente em apenas uma linha, e o equivalente sem regex é frequentemente muito mais difícil de ler. / \ d {3} [-] \ d {3} - \ d {4} / é o equivalente a uma chamada de função com pelo menos vários comentários e é mais fácil de entender do que o corpo da função correspondente.

jmoreno
fonte
1

Legibilidade e simplicidade são termos subjetivos que, dependendo da pessoa e do contexto, geralmente, mas nem sempre, andam juntos.

Um termo mais objetivo é concisão - algo que, em princípio, você poderia contar contando caracteres, embora existam algumas falhas nisso. Concisão parece implicar simplicidade e legibilidade, mas existem (pelo menos na minha opinião) exceções.

Um pedaço de código mais longo (e sem dúvida mais complexo) pode ser mais legível se expressar melhor a intenção. Se sua definição de simplicidade se importa com a intenção é outra coisa subjetiva - você pode definir a complexidade em termos da estrutura sintática e da entropia da teoria da informação, por exemplo, sem nenhuma referência a intenções.

Portanto, um nome de variável mais longo e bem escolhido pode ...

  • Melhore a legibilidade ao expressar melhor a intenção
  • Reduza a concisão - afinal, é mais longo
  • Não tem nenhum efeito sobre a simplicidade sintática - a estrutura sintática do código permanece inalterada

Da mesma forma, eu poderia escrever if (some_boolean == true). Em comparação com a alternativa equivalente if (some_boolean), isso ...

  • Reduz a concisão
  • Reduz a simplicidade sintática, mas
  • Pode melhorar a legibilidade ao expressar melhor a intenção.

É claro que este provocará um protesto em massa - para muitas pessoas, isso sempre prejudica a legibilidade também. Para mim, depende muito da fonte do booleano - por exemplo, o nome da variável (ou nome do método ou o que for) pode não expressar claramente que o valor é "valor de verdade". Claro, o ifdiz algo, mas ainda cheira. Mas muitas pessoas vão me chamar de idiota por acreditar nisso.

O que é mais uma evidência da subjetividade geral, é claro.

Steve314
fonte
1

Todos estão faltando algumas definições fundamentais . Simples, a partir da raiz simplex , significa uma dobra . Simples significa fazer uma coisa . Fácil, a partir da facilidade raiz , significa estar perto . Fácil significa que está por perto . Os exemplos de código simples fornecidos em outras respostas não são exatamente o que aparecem.

Veja a exibição do rotsor de um valor muito grande. Ele diz que isso é simples . Na minha opinião, não é simples. É fácil. É fácil digitar o número de 0s necessários.

10000000000000000000000000000000000000000000

A versão legível é simples. Faz uma coisa. Ele expressa o número, descrevendo seu tamanho em uma finalidade de notação criada para esta função.

1e43

Você poderia descrever o snippet de código "simples" de Aidan como fazendo uma coisa? Ele contém 10 linhas de código (sem contar os comentários) e pelo menos 7 blocos (como eu os contaria). Se você seguir os comentários, verá que ele faz pelo menos quatro coisas!

count :: [Integer] -> [[Integer]]
count [] = [[]]
count (x:xs) =
  -- get all possible sequences for the remaining digits
  let
    remDigits :: [[Integer]]
    remDigits = count xs
  in
  -- pull out a possible sequence for the remaining digits
  do nextDigits <- remDigits
     -- pull out all possible values for the current digit
     y <- [0..x]
     -- record that "current digit" : "remaining digits" is
     -- a valid output.
     return (y:nextDigits)

Porém, uma das recomendações para reescrever esse código foi uma declaração. Aidan afirma que um leitor teria que estar familiarizado com declarações monádicas, código livre de ponteiros etc. Isso é bom. Esses conceitos são singulares e independentes de aprender.

count = mapM (enumFromTo 0)

Você verá que o código verdadeiramente simples é mais legível do que o código fácil , porque faz apenas uma coisa. Pode ser necessário sair e aprender mais "uma coisa" para entender o código simples. Mas deve sempre ser mais legível.

Anthony Mastrean
fonte
1

A simplicidade sempre melhora a legibilidade?

Eu diria, talvez com um pouco de controvérsia, absolutamente não .

Você poderia me dar uma classe com 200 funções-membro em sua interface pública, e pode ser a interface pública mais humanamente legível por aí. Pode ser uma alegria apenas ler casualmente esse código e sua documentação. No entanto, eu não chamaria isso de "simples", porque, apesar da legibilidade, eu teria que me preocupar com a forma como todas essas funções interagem umas com as outras e, potencialmente, tomar cuidado com casos complicados resultantes de uso indevido.

Eu preferiria uma classe com 20 funções-membro que não eram tão fáceis de ler para 200, porque "legibilidade" não é a principal prioridade para mim em termos de prevenção de erros humanos e melhoria da capacidade de manutenção do código (a facilidade com que nós podemos mudar isso, ie).

No entanto, tudo isso depende de nossa definição pessoal de "simplicidade". "Legibilidade" normalmente não varia que descontroladamente entre nós, a menos que alguém tenha adquirido tanto conhecimento e fluência que consideram regex a ser muito "legível", por exemplo, esquecendo o resto de nós meros mortais.

Simplicidade

Houve um tempo, há muito tempo, em que pensei que "simplicidade" significava "o mais fácil de ler possível". Então, eu escreveria o código C com muitas funções de conveniência, tentando melhorar a sintaxe e facilitar a leitura e gravação das coisas.

Projetei bibliotecas muito grandes, ricas e de alto nível como resultado, tentando modelar uma função para todo pensamento humano natural: ajudantes sobre ajudantes sobre ajudantes, tudo para moldar o código do cliente para uma sintaxe mais legível. O código que escrevi na época pode ter sido o mais "legível", mas também o mais "inatingível" e "complexo".

Lisp

No entanto, tive uma breve paixão pelo LISP em meados dos anos 90 (retardatário). Isso mudou toda a minha idéia de "simplicidade".

LISP não é a linguagem mais legível. Felizmente, ninguém pensa que extrair CDRs e CARs enquanto invoca uma função recursiva com um monte de parênteses aninhados é muito "legível".

No entanto, depois de lutar para envolver meu cérebro na estranha sintaxe da linguagem e em maneiras totalmente recursivas de fazer as coisas, isso mudou permanentemente minha ideia de simplicidade.

O que descobri com o código que escrevi no LISP é que não estava mais cometendo erros sutis, embora a astúcia de pensar dessa maneira tenha me cometido erros mais flagrantes (mas esses são fáceis de identificar e corrigir). Eu não estava entendendo mal o que uma função estava fazendo e perdendo um efeito colateral sutil e imprevisto. Eu estava tendo um tempo mais fácil em geral, fazendo alterações e escrevendo programas corretos.

Após o LISP, a simplicidade para mim passou a ser minimalismo, simetria, flexibilidade, menos efeitos colaterais, menos funções mais flexíveis que se combinam de uma infinita variedade de maneiras.

Apreciei a mentalidade de que o código mais confiável de todos é o código que não existe. Embora seja apenas uma métrica grosseira, costumo ver o potencial de falta de confiabilidade do código com base em sua quantidade. Buscar a máxima conveniência e legibilidade sintática tende a aumentar essa quantidade por um grande fator.

Minimalismo

Com a mentalidade LISP incorporada em mim, passei a preferir APIs minimalistas. Prefiro uma biblioteca com menos, mas mais confiáveis, funções flexíveis que sejam menos convenientes e com potencialidade mais difícil de ler do que uma que ofereça um monte de ajudantes "convenientes" e que possam facilitar a leitura do código, mas potencialmente tropeçar mais problemas com falta de confiabilidade e surpresas resultantes de mal-entendidos sobre o que uma dessas milhares de funções faz.

Segurança

Outra coisa sobre o LISP era a segurança. Ele promoveu efeitos colaterais mínimos e funções puras, e foi aí que eu não me via mais cometendo erros sutis, mesmo que a dificuldade de ler e escrever no idioma aumentasse os erros mais flagrantes que eu conseguia detectar 10 segundos depois.

Funções puras e estados imutáveis ​​se tornaram preferíveis a mim sempre que eu podia pagar, mesmo que a sintaxe de:

sword = sharpen(sword)

... é um pouco menos direto e distante do pensamento humano do que:

sharpen(sword)

Legibilidade VS. Simplicidade

Mais uma vez, o LISP não é a linguagem mais "legível". Ele pode incluir muita lógica em uma pequena seção de código (possivelmente mais de um pensamento humano por linha). Idealmente, prefiro um pensamento humano por linha para "legibilidade", mas não é necessariamente para "simplicidade".

Com esse tipo de definição de "simples", às vezes "simples" pode, na verdade, competir um pouco com "legível". Isso está considerando coisas mais do ponto de vista do design de interface.

Uma interface simples significa que você precisa aprender muito menos coisas para usá-la e, potencialmente, tem maior confiabilidade e menos problemas como resultado de seu minimalismo. Uma documentação abrangente sobre o assunto pode caber em um livreto, e não em um grande volume de livros. No entanto, pode exigir mais trabalho pesado e produzir código menos legível.

"Simples" para mim melhora nossa capacidade de entender a funcionalidade em nosso sistema em um nível amplo. "Legível" para mim melhora nossa capacidade de conectar cada pequena linha de código à linguagem natural e ao pensamento e pode acelerar nossa compreensão do que uma linha de código faz, especialmente se não somos fluentes na linguagem.

Regex é um exemplo do que considero "extremamente simples". É "simples demais e ilegível" para o meu gosto pessoal. Há um ato de equilíbrio para mim entre esses extremos, mas a regex tem essa qualidade de simplicidade semelhante à LISP como eu a defino: minimalismo, simetria, incrível flexibilidade, confiabilidade etc. O problema para mim com a regex é que é tão simples que tornou-se tão ilegível ao ponto que acho que nunca vou me tornar fluente nisso (meu cérebro simplesmente não funciona dessa maneira e invejo as pessoas que podem escrever código regex fluentemente).

De qualquer forma, essa é minha definição de "simplicidade", e é completamente independente da "legibilidade" e às vezes pode até interferir na outra, levando a um ato de equilíbrio entre uma biblioteca mais "sintaticamente conveniente" e legível, mas maior, ou uma "biblioteca sintaticamente" biblioteca inconveniente ", menos legível e ainda menor. Eu sempre achei as verdadeiras prioridades de "conveniência da compreensão" e de "manutenção" alinhadas com as últimas, com a forte preferência pelo minimalismo, mesmo a algum custo de legibilidade e sintaxe humana mais natural (mas não ao ponto de regex) . YMMV.


fonte
0

Sempre? - SIM

Atingir o nível certo de simplicidade é uma tarefa complexa e difícil. Mas sempre vale a pena, pois sempre melhora a legibilidade. Eu acho que a chave é um entendimento profundo. Simplicidade é um absoluto, medido por "novos conceitos" por "pedaço" de código. Alguns novos conceitos significam mais simples.

Concentre-se em áreas onde existe um denso conjunto de conceitos e encontre maneiras de "dividir" ou "resumir" ou "abstrair". Faça algumas passagens pelo código para torná-lo mais simples e legível.

Uma boa abstração vale seu peso em ouro. Uma boa abstração torna isso mais simples - e consequentemente mais legível.

S.Lott
fonte
Não consigo deixar de pensar que suas citações de medo estão lá porque você sabe que "conceito" e "pedaço" são subjetivos. Um conceito único de pessoas é outro amálgama de três idéias distintas. É difícil ter uma medida absoluta e objetiva de coisas subjetivas.
Steve314
@ Steve314: Citações de susto? Não. En.wikipedia.org/wiki/Chunking parecem todos semelhantes, pois descrevem a simplificação por meio de chunking. (Exceto a técnica da guitarra, isso parece diferente.) As aspas existem porque existem muitos termos alternativos para abstração, fragmentação, resumo etc. Se eu escolher apenas uma pessoa, todos objetam que abstração não é a mesma coisa que fragmentação. As aspas existem para enfatizar que isso é de alguma forma discutível. Ainda. É claramente feito o tempo todo e parece ser uma tendência humana natural.
S.Lott
O que eu não nego - chunking é feito o tempo todo e é uma boa idéia. O que eu nego - é que existe uma regra objetiva definitiva para onde os limites devem estar entre os pedaços. Meus argumentos podem ser mais pedantes do que úteis, mas ainda duvido que o "sempre" em "sempre melhore a legibilidade".
Steve314
@ Steve314: Nós sempre abstraimos, dividimos e resumimos para nos ajudar a entender as coisas. Sempre. Chunking, abstraindo, resumindo ("simplificando") é algo que sempre fazemos. Nós apenas fazemos. É assim que nossos cérebros apreendem a realidade. A simplificação sempre melhora a legibilidade e sempre pode ser feita.
S.Lott
sim nós fazemos. Eu nunca disse o contrário.
Steve314
-2

As perguntas me lembram esta resposta no Stack Overflow, particularmente esta citação (substitua qualidade pela simplicidade):

Qualidade - você sabe o que é, mas não sabe o que é. Mas isso é auto-contraditório. Mas algumas coisas são melhores que outras, ou seja, elas têm mais qualidade. Mas quando você tenta dizer qual é a qualidade, além das coisas que a possuem, tudo dá errado! Não há nada para falar. Mas se você não pode dizer o que é Qualidade, como você sabe o que é, ou como você sabe que ela existe? Se ninguém sabe o que é, então, para todos os efeitos práticos, não existe. Mas, para todos os efeitos práticos, ele realmente existe. Em que mais as notas são baseadas? Por que mais as pessoas pagariam fortunas por algumas coisas e jogariam outras na pilha de lixo? Obviamente, algumas coisas são melhores que outras - mas qual é a `` betterness ''? - Então, voltas e voltas você vai, girando rodas mentais e em nenhum lugar encontrando lugar para obter tração. O que diabos é qualidade? O que é isso?

Eu acho que é importante ter em mente que um padrão de codificação codificado para todos os seus benefícios não tornará bons programadores dos ruins. Uma palavra como 'simples' pode ser interpretada de maneira diferente por pessoas diferentes (veja a resposta de Aidan Cully), mas isso pode não ser uma coisa tão ruim. Os programadores juniores ainda precisam ter seu código revisado pelos programadores seniores e aprender por que a interpretação dos programadores seniores de 'simples' é melhor que a sua.

KaptajnKold
fonte
1
Por isso, defini simplicidade na pergunta.
Richard
-2

Uma chamada de função por linha é mais simples? Vamos tentar um exemplo!

=== One call per line ===
x = y.getThis()
a = x.getThat()
b = a.getSomethingElse()

=== Less "simple" version ===
b = y.getThis().getThat().getSomethingElse()

O que você acha? Uma chamada por linha é realmente mais simples?

Stephen Gross
fonte
Sim. Uma chamada por linha é mais simples e fácil para eu ler. No entanto, a legibilidade é subjetiva. (Além disso, isso não chega nem perto de responder à pergunta.)
Richard
Oi Stephen, você pode explicar como você acha que isso responde à pergunta? Não está claro o que você está tentando apontar aqui.
@MarkTrapp Sem problemas. A pergunta original propunha uma abordagem de função única por linha. O exemplo que publiquei mostra os mesmos dois trechos de código, um implementado como função única por linha e outro como chamadas de método encadeado. Acho que a chamada em cadeia é muito mais fácil de ler: curta, desprovida de variáveis ​​temporárias desnecessárias e elegante.
Stephen Gross
Se você tem que getters cadeia, em seguida, o código está pooly projetado
Inverno