Sobre qual prática de programação você gostava, mudou de ideia desde então? [fechadas]

99

Conforme programamos, todos nós desenvolvemos práticas e padrões que usamos e nos quais confiamos. No entanto, com o tempo, conforme nosso entendimento, maturidade e até mesmo o uso da tecnologia mudam, percebemos que algumas práticas que antes pensávamos serem excelentes não são (ou não se aplicam mais).

Um exemplo de prática que usei com bastante frequência, mas que mudei nos últimos anos, é o uso do padrão de objeto Singleton .

Por meio de minha própria experiência e longos debates com colegas, percebi que singletons nem sempre são desejáveis - eles podem tornar o teste mais difícil (inibindo técnicas como a simulação) e podem criar acoplamentos indesejáveis ​​entre as partes de um sistema. Em vez disso, agora uso fábricas de objetos (normalmente com um contêiner IoC) que ocultam a natureza e a existência de singletons de partes do sistema que não se importam - ou precisam saber. Em vez disso, eles contam com uma fábrica (ou localizador de serviço) para adquirir acesso a tais objetos.

Minhas perguntas para a comunidade, no espírito de autoaperfeiçoamento, são:

  • Quais padrões ou práticas de programação você reconsiderou recentemente e agora tenta evitar?
  • Com o que você decidiu substituí-los?
LBushkin
fonte

Respostas:

159


//Coming out of university, we were taught to ensure we always had an abundance 
//of commenting around our code. But applying that to the real world, made it 
//clear that over-commenting not only has the potential to confuse/complicate 
//things but can make the code hard to follow. Now I spend more time on 
//improving the simplicity and readability of the code and inserting fewer yet 
//relevant comments, instead of spending that time writing overly-descriptive 
//commentaries all throughout the code.


Luke Baulch
fonte
+1. Eu estava prestes a postar essa mesma resposta. Encontrei algumas das minhas antigas atribuições de programação em um disco de arquivo algumas semanas atrás. Tudo parecia igual. Havia uma proporção de quase 1: 1 de linhas de comentários para linhas de código.
Michael Moussa
32
Parece que você comentou incorretamente , não muito. O código não fala por si. Não. Realmente não importa. Leia o último NT Insider para um bom discurso sobre isso. Se você acha que os comentários serão redundantes, você está errado ou está agindo errado. As universidades não ensinam comentários corretos ao que parece (ou rastreamento de bugs ou controle de versão ... * suspiro *). Existem poucos comentários por aí. (e menos bons)
Thomas
5
O Code Complete tem boas dicas sobre comentários e os dados para fazer o backup.
Thomas
20
Os comentários devem ser usados ​​para descrever por que o código faz o que faz (se não for óbvio), não o que o código faz. Uma possível exceção é um truque maluco / hack de linguagem, como o número mágico 0x5f3759df de Carmack.
Chris Simmons
6
@ Thomas: Eu pessoalmente acho que o problema é que ensinar bons comentários não é algo que uma universidade possa mostrar aos alunos. Quase todos os programas nas escolas são coisas únicas; os alunos não têm a experiência de olhar para trás no código que escreveram há um ano e não entendem nada. Além disso, as classes de nível inferior ensinam conceitos de codificação realmente simples - comentar neste nível é quase necessariamente tedioso, por causa do que está acontecendo. Em outras palavras, é como tentar ensinar alguém a nadar em uma piscina infantil; simplesmente não é o contexto certo para eles entenderem os movimentos.
Dan Lew
117

Pontos de retorno único.

Certa vez, preferi um único ponto de retorno para cada método, pois com isso eu poderia garantir que qualquer limpeza necessária pela rotina não fosse esquecida.

Desde então, mudei para rotinas muito menores - portanto, a probabilidade de ignorar a limpeza é reduzida e, de fato, a necessidade de limpeza é reduzida - e descobri que os retornos iniciais reduzem a complexidade aparente (o nível de aninhamento) do código. Artefatos do único ponto de retorno - mantendo variáveis ​​de "resultado" ao redor, mantendo variáveis ​​de sinalização, cláusulas condicionais para situações ainda não concluídas - fazem o código parecer muito mais complexo do que realmente é, tornando-o mais difícil de ler e manter. Saídas antecipadas e métodos menores são o caminho a percorrer.

Carl Manaster
fonte
3
Eu concordo, quando combinados com tipos de dados que se limpam automaticamente, como autoptr, scoped_ptr, CComPtr, etc.
i_am_jorf
3
A limpeza do código é o que tenta {} finalmente {} é
banjollity
@banjollity: exceto para idiomas que não oferecem suporte a finally {}. E observe que mesmo em linguagens que o suportam, finalmente {} não tem SEMPRE garantia de execução.
Chris K de
1
@banjollity, Chris: Em C ++, o destruidor serve para limpar e, exceto em circunstâncias extremas (exit (), um destruidor que lança uma exceção durante o desenrolamento da pilha, esquilos cortando sua energia), ele funciona com garantia.
David Thornley
4
Acordado. Substitua a condicional aninhada por cláusulas de proteção ftw!
Jonik
111
  • Tentando codificar as coisas perfeitamente na primeira tentativa.
  • Tentando criar um modelo OO perfeito antes de codificar.
  • Projetando tudo para flexibilidade e melhorias futuras.

Em uma palavra superengenharia .

wuub
fonte
6
Espere, eu sempre acerto na primeira tentativa. :)
i_am_jorf
18
O verdadeiro dinheiro está em errar sutilmente na primeira vez e deixá-lo sair para a selva. Então, quando as pessoas estiverem acostumadas com a versão simplificada, ataque com exibicionismo arrogante e conserte o bug / ineficiência para colher glória extra! ;)
Eric
7
@jeffamaphone - Não, apenas Jon Skeet acerta na primeira vez.
Jordan Parmer
Gosto da palavra "overengineering"
Neilvert Noval
@jeffamaphone - Eu sempre acerto na primeira tentativa também. Mas novas tentativas dão o que eu preciso :)
umbr
78

Notação húngara (formas e sistemas). Eu costumava prefixar tudo. strSomeString ou txtFoo. Agora eu uso someString e textBoxFoo. É muito mais legível e fácil para alguém novo vir e pegar. Como um bônus adicional, é trivial mantê-lo consistente - camelCase o controle e acrescente um nome útil / descritivo. O Formulários húngaro tem a desvantagem de nem sempre ser consistente e os Sistemas húngaro não trazem muito lucro. Agrupar todas as suas variáveis ​​juntas não é realmente útil - especialmente com IDEs modernos.

Kenny Mann
fonte
E em linguagens tipadas dinamicamente, como Python ou JavaScript? Ainda acho útil usar a notação húngara nessas linguagens para que, ao olhar para as variáveis, eu saiba que tipo de variável esperar (se houver um tipo a esperar - claro, seria temerário tratar uma linguagem digitada dinamicamente exatamente como uma linguagem digitada estaticamente.)
Dan Lew
4
Eu faço semelhante, exceto: fooTextBox e string's são apenas esperançosamente aparentes: numberOfEntries => int, isGreat => bool, etc.
rball
1 para se livrar da notação húngara. Eu concordo com rball; fooTextBox, fooService, fooString quando for realmente necessário.
blu
3
@ wuub: Eu diria que, com a nomenclatura adequada, você não precisa prefixar nada.
Kenny Mann
4
A propósito, o que você mencionou não é realmente húngaro.
Antony Carthy
67

A arquitetura "perfeita"

Eu vim com THE arquitetura alguns anos atrás. Empurrei-me tecnicamente o máximo que pude para que houvesse camadas 100% fracamente acopladas, uso extensivo de delegados e objetos leves. Era o paraíso técnico.

E foi uma porcaria. A pureza técnica da arquitetura apenas desacelerou minha equipe de desenvolvimento visando a perfeição em vez de resultados e quase alcancei o fracasso total.

Agora temos uma arquitetura muito mais simples, menos tecnicamente perfeita, e nossa taxa de entrega disparou.

Bruce McLeod
fonte
57

O uso de caffine. Certa vez, ele me manteve acordado e em um clima de programação glorioso, onde o código voou de meus dedos com fluidez febril. Agora não faz nada e, se não tiver, fico com dor de cabeça.

Alex
fonte
55
Você precisa beber ainda mais café. Se isso não funcionar, comece a fumar.
MusiGenesis
7
Brad: Você não precisa disso quando tem Python: xkcd.com/353
Peter
Bela referência de história de Natal! :-)
Steve Echols
2
Quebrei o hábito e retomei várias vezes (agora é o meu terceiro ciclo). Nada se compara a codificar nas manhãs frias com uma caneca de café quente!
Matthew Iselin
15
"Parece que escolhi a semana errada para parar com as anfetaminas."
ShreevatsaR
50

Comentando o código. Eu costumava pensar que o código era precioso e que você não pode simplesmente deletar aquelas lindas joias que você criou. Eu agora excluo qualquer código comentado que encontrar, a menos que haja um TODO ou NOTA anexado, porque é muito perigoso deixá-lo. A saber, eu me deparei com classes antigas com grandes porções comentadas e realmente me confundiu por que eles estavam lá: foram comentados recentemente? esta é uma mudança de ambiente dev? por que ele faz esse bloqueio não relacionado?

Considere seriamente não comentar o código e apenas excluí-lo. Se você precisar, ainda está no controle de origem. YAGNI embora.

bbrown
fonte
6
Comento o código antigo durante a refatoração, mas apenas até verificar se o código de substituição funciona. Assim que a nova versão estiver totalmente funcional, excluo as linhas comentadas antigas.
muusbolla
Na verdade - eu também comento o código, mas apenas por alguns dias. Se eu voltar e perceber que há algo que perdi, ele será excluído antes que o novo código seja trabalhado.
Colin Mackay
4
Eu digo verificar o código comentado uma vez, ENTÃO excluí-lo. Muitas vezes você testa vários bits de código diferentes e não quer verificar o código corrompido ...
DisgruntledGoat
Sem mencionar que o controle de versão é seu amigo.
David Thornley
1 Trabalhei com um programador que insistiu em comentar todo o código que ele refatorou ou reescreveu. Isso me deixaria louco, porque às vezes eu teria que rolar por 1k + linhas de merda para descobrir no que estava trabalhando.
Evan Plaice
46

O uso excessivo / abuso das diretivas #region. É apenas uma coisa pequena, mas em C #, eu costumava usar as diretivas #region em todo o lugar, para organizar minhas classes. Por exemplo, eu agruparia todas as propriedades de classe em uma região.

Agora eu olho para o código antigo e principalmente fico irritado com eles. Eu não acho que isso realmente torna as coisas mais claras na maioria das vezes, e às vezes eles simplesmente te atrasam. Portanto, mudei de ideia e sinto que as aulas bem organizadas são em sua maioria mais limpas, sem diretivas regionais.

Scott Ferguson
fonte
31
Eu odeio região. As pessoas da minha equipe os usam levianamente. Eu os chamo de "ocultadores de códigos ruins".
rball
9
Eles são definitivamente um cheiro de código.
Frank Schwieterman
3
EU ODEIO regiões. Atualmente, estou mantendo um código em que a função é quase 500 linhas e, para gerenciá-lo, o desenvolvedor inteligente colocou pedaços de código em 10 a 15 regiões.
SolutionYogi
6
@Solution Yogi: Não acho que as regiões sejam o problema real no seu caso :-)
Ed S.
9
Acho que as regiões podem ficar bem se usadas com moderação.
Gregory Higley
39

Desenvolvimento em cascata em geral e, em específico, a prática de escrever especificações funcionais e de design completas e abrangentes que, de alguma forma, se espera que sejam canônicas e, em seguida, esperar que uma implementação delas seja correta e aceitável. Já o vi ser substituído pelo Scrum, e bom tempo para ele, eu digo. O simples fato é que a natureza mutável das necessidades e desejos do cliente torna qualquer especificação fixa efetivamente inútil; a única maneira de realmente abordar o problema de maneira adequada é com uma abordagem iterativa. Não que Scrum seja uma bala de prata, é claro; Eu já vi isso ser mal usado e abusado muitas e muitas vezes. Mas é melhor do que cachoeira.

Paul Sonier
fonte
3
Diga isso ao meu cliente ... Estou no meio de escrever um documento de especificação inútil "Sou um programador com uma bola de cristal, então sei exatamente como meu design de baixo nível ficará em 6 meses"
Igor Brejc
36

Nunca batendo.

Parece uma ideia tão boa, não é? Os usuários não gostam de programas que travam, então vamos escrever programas que não travem, e os usuários devem gostar do programa, certo? Foi assim que comecei.

Hoje em dia, estou mais inclinado a pensar que, se não funcionar, não deveria fingir que está funcionando. Fracasse o mais rápido possível, com uma boa mensagem de erro. Se você não fizer isso, seu programa irá travar ainda mais fortemente algumas instruções depois, mas com algum erro de ponteiro nulo indefinido que levará uma hora para depurar.

Meu padrão favorito de "não travar" é este:

public User readUserFromDb(int id){
    User u = null;
    try {
        ResultSet rs = connection.execute("SELECT * FROM user WHERE id = " + id);
        if (rs.moveNext()){
            u = new User();
            u.setFirstName(rs.get("fname"));
            u.setSurname(rs.get("sname"));
            // etc
        }
    } catch (Exception e) {
        log.info(e);
    }
    if (u == null){
        u = new User();
        u.setFirstName("error communicating with database");
        u.setSurname("error communicating with database");
        // etc
    }
    u.setId(id);
    return u;
}

Agora, em vez de pedir a seus usuários para copiar / colar a mensagem de erro e enviá-la a você, você terá que mergulhar nos registros tentando encontrar a entrada do registro. (E como eles inseriram um ID de usuário inválido, não haverá entrada de registro.)

gustafc
fonte
Qual é a probabilidade de o usuário fornecer a mensagem de erro real, em vez de seus logs produzirem o problema? (Muito baixo neste caso específico, mas os usuários quase nunca citam as mensagens de erro!) Eles ao menos as leem?
Arafangion
1
Admito que a chance de um usuário aleatório enviar a mensagem de erro é baixa, mas a chance é diferente de zero (exemplo trivial: às vezes você usa seu próprio aplicativo), e alguns usuários realmente aprendem com o tempo o que copiar / colar. Não estou dizendo que você não deve logar (deveria), mas quando o aplicativo está quebrado, ele está quebrado. Mostrar uma mensagem de erro é muito melhor, muito mais honesto para o usuário do que fingir que o nome do usuário é "erro de comunicação com o banco de dados" (ou pior ainda, nullou a string vazia).
gustafc
Há um NullReferenceException na linha dois
oɔɯǝɹ
Obrigado, oɔɯǝɹ, eu consertei. (Embora tenha sido um pouco mais lento com ele lá: todo esse trabalho para evitar exceções e outros "travamentos", e ainda assim travou incondicionalmente.)
gustafc
33

Achei que fazia sentido aplicar padrões de design sempre que os reconhecia.

Mal sabia eu que estava realmente copiando estilos de linguagens de programação estrangeiras, enquanto a linguagem com a qual estava trabalhando permitia soluções muito mais elegantes e fáceis.

Usar várias (muito) línguas diferentes abriu meus olhos e me fez perceber que não tenho que aplicar mal as soluções de outras pessoas para problemas que não são meus. Agora eu estremeço ao ver o padrão de fábrica aplicado em uma linguagem como Ruby.

molf
fonte
2
Desculpe minha ignorância sobre rubi, mas por que não deveríamos usar o padrão de fábrica com ele?
Mike Chamberlain
Não é um rubi aqui, mas a fábrica é evitar depender de uma implementação, mas o ruby ​​é dinâmico e você pode simular ou fazer um esboço de qualquer coisa. Então você realmente não depende de uma implementação.
Stéphane de
27

Teste obsessivo. Eu costumava ser um defensor fanático do desenvolvimento teste-primeiro. Para alguns projetos, faz muito sentido, mas percebi que não é apenas inviável, mas prejudicial para muitos projetos, aderir de maneira submissa a uma doutrina de escrever testes de unidade para cada peça de funcionalidade.

Realmente, aderir servilmente a qualquer coisa pode ser prejudicial.

Yalestar
fonte
22
Funciona muito bem com cracas.
MusiGenesis
A cobertura do teste deve ser proporcional ao benefício. Qualquer coisa que você fizer realmente deve mostrar um benefício. 100% de cobertura não vai lhe dar tanto. diferença de 80 ou 90 em uma forma que não é em um cenário de suporte de vida / lançamento de míssil.
Spence
+1 dependência de teste de unidade em oposição a teste.
Preet Sangha
25

Isso é uma coisa pequena, mas: Preocupar-se sobre onde vão as chaves (na mesma linha ou na próxima linha?), Sugeriu comprimentos máximos de linha de código, convenções de nomenclatura para variáveis ​​e outros elementos de estilo. Descobri que todos parecem se importar mais com isso do que eu, então sigo o fluxo de quem quer que esteja trabalhando hoje em dia.

Edit: A exceção é, é claro, quando sou eu quem mais se importa (ou quem está em posição de definir o estilo de um grupo). Nesse caso, faço o que quero!

(Observe que isso não é o mesmo que não ter estilo consistente. Acho que um estilo consistente em uma base de código é muito importante para facilitar a leitura.)

Daniel Lew
fonte
5
Alguém deu um voto negativo, mas acho que é uma perspectiva prática. Qual é o melhor estilo de código? Não é importante. Olhe para cima e para baixo no mesmo arquivo e duplique.
Frank Schwieterman
12
O melhor estilo de código é aquele que for o padrão para aquela loja.
David Thornley
É por isso que adoro as opções de formatação automática do Visual Studio. Não importa como os outros desenvolvedores escreveram o código, eu apenas faço uma formatação rápida e é exatamente como eu gosto ... na maioria das vezes.
corimathews
5
@cory: isso não atrapalha a capacidade do seu software de controle de versão de mostrar a diferença entre as versões do arquivo que você acabou de reformatar?
Steve Melnikoff
É por isso que me sinto atraído em aprender python ... pensar que só preciso me preocupar com o que meus tabs estão configurados, e não com os estilos de reforço. É meio atraente.
Chris K de
24

Talvez a "prática de programação" mais importante sobre a qual mudei de ideia desde então é a ideia de que meu código é melhor do que o de todo mundo. Isso é comum para programadores (especialmente iniciantes).

Nippysaurus
fonte
20

Bibliotecas de utilitários. Eu costumava carregar uma montagem com uma variedade de métodos e classes auxiliares com a teoria de que eu poderia usá-los em outro lugar algum dia.

Na verdade, acabei de criar um namespace enorme com muitas funcionalidades mal organizadas.

Agora, apenas os deixo no projeto em que os criei. Com toda probabilidade, não vou precisar disso e, se precisar, sempre posso refatorá-los em algo reutilizável mais tarde. Às vezes, vou sinalizá-los com um // TODO para possível extração em um assembly comum.

JamesWampler
fonte
12
Há uma boa citação (não consigo encontrar o original no momento) que era algo como "nem pense em criar uma rotina genérica até que você
precise
9
"Três ataques e você refatorou" - Refatoração de Martin Fowler. A Regra de Três , página 58.
Nick Dandoulakis
20

Projetando mais do que eu codifiquei. Depois de um tempo, torna-se uma paralisia da análise.

Paul Nathan
fonte
44
Ocasionalmente, invoco a frase "Se você achar que está pensando demais, pare e faça. Se você achar que está fazendo muito, pare e pense."
Neil N
Isso é bom, mas quanto é demais?
Hamish Grubijan
Muita dependência de UML (Useless Modeling Language). Ela ocasionalmente tem seus usos. Mas, quando vejo alguém começar a desenhar diagramas de classe e pregar sobre os benefícios de "como seria incrível gerar código a partir dos diagramas", amarro meus tênis de corrida. Além disso, o Visual Studio tem um gerador de diagrama de classes interativo integrado que faz tudo automaticamente e funciona como o explorador de objetos no crack.
Evan Plaice
15

O uso de um DataSet para realizar a lógica de negócios. Isso vincula o código com muita força ao banco de dados, também o DataSet geralmente é criado a partir de SQL, o que torna as coisas ainda mais frágeis. Se o SQL ou o Banco de dados mudar, ele tende a escorrer para tudo o que o DataSet toca.

Executar qualquer lógica de negócios dentro de um construtor de objeto. Com herança e a capacidade de criar construtores sobrecarregados tendem a dificultar a manutenção.

Eric Schneider
fonte
15

Abreviando variável / método / tabela / ... Nomes

Eu costumava fazer isso o tempo todo, mesmo quando trabalhava em idiomas sem limite obrigatório de comprimento de nomes (bem, provavelmente eram 255 ou algo assim). Um dos efeitos colaterais foram muitos comentários espalhados por todo o código explicando as abreviações (não padronizadas). E, claro, se os nomes fossem alterados por qualquer motivo ...

Agora, prefiro muito mais chamar as coisas do que realmente são, com bons nomes descritivos. incluindo apenas abreviações padrão . Não há necessidade de incluir comentários inúteis, e o código é muito mais legível e compreensível.

Rhys Jones
fonte
Sim, tenho que adorar esses tipos de declarações: void Foo (x1, y, x2, y2, p, r, j) ... WTF ?!
Ed S.
Ou pior (e sim, eu realmente vi isso), Foo(int arg0, String arg1, float arg2) etc
Mac
14

Envolvendo os componentes de acesso a dados existentes, como a biblioteca corporativa, com uma camada personalizada de métodos auxiliares.

  • Isso não torna a vida de ninguém mais fácil
  • É mais código que pode conter bugs
  • Muitas pessoas sabem como usar os componentes de acesso a dados EntLib. Ninguém, exceto a equipe local, sabe como usar a solução interna de acesso a dados
blu
fonte
14

Eu ouvi pela primeira vez sobre programação orientada a objetos enquanto lia sobre Smalltalk em 1984, mas não tive acesso a uma linguagem oo até usar o compilador cfront C ++ em 1992. Eu finalmente consegui usar Smalltalk em 1995. Eu esperava ansiosamente oo tecnologia e comprou a ideia de que isso economizaria o desenvolvimento de software.

Agora, eu apenas vejo oo como uma técnica que tem algumas vantagens, mas é apenas uma ferramenta na caixa de ferramentas. Eu faço a maior parte do meu trabalho em Python e freqüentemente escrevo funções autônomas que não são membros da classe, e freqüentemente coleto grupos de dados em tuplas ou listas onde no passado eu teria criado uma classe. Ainda crio classes quando a estrutura de dados é complicada ou preciso de um comportamento associado aos dados, mas tendo a resistir.

Na verdade, estou interessado em fazer algum trabalho em Clojure quando tiver tempo, o que não fornece recursos oo, embora possa usar objetos Java se eu entendi corretamente. Não estou pronto para dizer nada como oo está morto, mas pessoalmente não sou o fã que costumava ser.

Greg Graham
fonte
13

Em C #, usando _notationpara membros privados. Agora acho que é feio.

Em seguida, mudei para this.notationpara membros privados, mas descobri que era inconsistente ao usá-lo, então abandonei também.

JulianR
fonte
29
Ainda estou usando _notation e acho que é ótimo.
Arnis Lapsa
3
Eu odeio _notation; Eu uso ThisNotation para membros públicos e thisNotation para membros privados.
Callum Rogers
Eu também odeio. Isso me confunde :(
Broken_Window
4
Discordo. Isso torna muito mais fácil gerenciar nomes. Use PascalCase para propriedades ou membros públicos / internos, _UnderscorePascalCase para membros que são expostos por meio de uma propriedade e camelCase para nomes de parâmetros em métodos / construtores e membros privados. A palavra-chave 'this' só é necessária se você precisar passar a referência da classe atual fora da classe ou acessar um membro gerado automaticamente dentro da classe (como nome, controles, etc ...).
Evan Plaice
@Evan: Eu faço exatamente o que você está descrevendo, exceto pela última parte. Eu tendo a usar thisou Me(C # e VB.NET respectivamente) ao chamar métodos e propriedades. IMO, torna meu código mais fácil de ler e entender mais tarde, especialmente quando há quatro ou mais objetos dentro desse escopo específico.
Alex Essilfie
11

Eu parei de usar o método de design recomendado pela universidade antes da implementação. Trabalhar em um sistema caótico e complexo me forçou a mudar de atitude.

É claro que ainda faço pesquisas de código, especialmente quando estou prestes a mexer em um código que nunca toquei antes, mas normalmente tento me concentrar em implementações tão pequenas quanto possível para fazer algo funcionar primeiro. Este é o objetivo principal. Em seguida, refine gradualmente a lógica e deixe o design aparecer por si só. A programação é um processo iterativo e funciona muito bem com uma abordagem ágil e com muita refatoração.

O código não terá a aparência que você inicialmente pensou que seria. Acontece sempre :)

Ralphtheninja
fonte
10

Eu costumava ser grande em design por contrato. Isso significou colocar muitas verificações de erros no início de todas as minhas funções. Os contratos ainda são importantes, do ponto de vista da separação de interesses, mas em vez de tentar impor o que meu código não deve fazer, tento usar testes de unidade para verificar o que ele faz.

Frank Schwieterman
fonte
Fui ensinado a programar assim. Claro, eu estava sendo ensinado por um professor de matemática do HS, então suponho que faz sentido que ele quisesse todas as suas funções de verificação automática.
Alex
10

Eu usaria estática em muitos métodos / classes, pois era mais conciso. Quando comecei a escrever testes, essa prática mudou muito rapidamente.

rball
fonte
10

Exceções verificadas

Uma ideia incrível no papel - define o contrato de forma clara, sem margem para erros ou esquecimento de verificar alguma condição de exceção. Fui vendido quando soube disso.

Claro, acabou sendo uma bagunça na prática. A ponto de ter bibliotecas hoje como Spring JDBC, que tem como um de seus principais recursos ocultar exceções verificadas de legado.

Gregory Mostizky
fonte
9

Que tudo o que vale a pena só foi codificado em um idioma específico. No meu caso, eu acreditava que C era a melhor linguagem de todos os tempos e nunca tive motivo para codificar nada em qualquer outro idioma ... nunca.

Desde então, comecei a apreciar muitos idiomas diferentes e os benefícios / funcionalidades que eles oferecem. Se eu quiser codificar algo pequeno - rapidamente - eu usaria Python. Se eu quiser trabalhar em um grande projeto, codificaria em C ++ ou C #. Se eu quiser desenvolver um tumor no cérebro, codificaria em Perl .

Patrick Gryciuk
fonte
8

Quando precisei fazer alguma refatoração, achei que era mais rápido e mais limpo começar imediatamente e implementar o novo design, consertando as conexões até que funcionassem. Então percebi que é melhor fazer uma série de pequenas refatorações para progredir de forma lenta, mas confiável, em direção ao novo design.

Ying
fonte
posso lembrar quantas vezes isso me
picou
8

Talvez a maior mudança em minhas práticas de codificação, assim como em outras, seja a aceitação de classes e bibliotecas externas baixadas da internet como base para comportamentos e funcionalidades em aplicativos. Na escola, na época em que frequentei a faculdade, éramos incentivados a descobrir como melhorar as coisas por meio de nosso próprio código e confiar na linguagem para resolver nossos problemas. Com os avanços em todos os aspectos da interface do usuário e consumo de serviço / dados, essa não é mais uma noção realista.

Existem certas coisas que nunca irão mudar em uma linguagem, e ter uma biblioteca que envolve esse código em uma transação mais simples e em menos linhas de código que eu tenho que escrever é uma bênção. Conectar-se a um banco de dados sempre será o mesmo. A seleção de um elemento no DOM não mudará. O envio de um e-mail por meio de um script do lado do servidor nunca mudará. Ter que escrever isso uma e outra vez é uma perda de tempo que eu poderia usar para melhorar minha lógica central no aplicativo.

Liam
fonte
7

Inicializando todos os membros da classe.

Eu costumava inicializar explicitamente cada membro da classe com algo, geralmente NULL. Eu percebi que isto:

  • normalmente significa que cada variável é inicializada duas vezes antes de ser lida
  • é bobo porque na maioria das linguagens inicializa automaticamente as variáveis ​​como NULL.
  • na verdade, impõe um leve impacto no desempenho na maioria dos idiomas
  • pode inchar o código em projetos maiores
Nippysaurus
fonte
4
Às vezes, as consequências de NÃO inicializar todos os membros da classe podem realmente incomodar você.
muusbolla
A menos que você esteja usando uma linguagem baseada em protótipo que cria novas instâncias por clonagem. Inicializar todos os membros pode realmente evitar muitos problemas.
Wojciech Bederski
6

Como você, também adotei os padrões de IoC para reduzir o acoplamento entre vários componentes dos meus aplicativos. Isso torna a manutenção e a troca de peças muito mais simples, desde que eu consiga manter cada componente o mais independente possível. Também estou utilizando mais estruturas de objetos relacionais, como o NHibernate, para simplificar as tarefas de gerenciamento de banco de dados.

Em suma, estou usando "mini" frameworks para ajudar na construção de software de forma mais rápida e eficiente. Esses mini-frameworks economizam muito tempo e, se feitos da maneira certa, podem tornar a manutenção de um aplicativo extremamente simples. Plug 'n Play para a vitória!

ajawad987
fonte
-1 Não suporto a proliferação de IoC e frameworks. Desacoplamento bom, IoC e frameworks = complexidade desnecessária
Paul Hollingsworth
Como você pode elogiar o desacoplamento e ainda assim odiar o IoC e outros frameworks? Isso é o que muitos frameworks IoC e padrões de design fazem para começar.
ajawad987