Ruby: The Bad Parts [fechado]


20

Recentemente, li o livro de Crockford "Javascript: The Good Parts" e uma das premissas subjacentes era que as linguagens de programação podem ter conjuntos de recursos ruins que os programadores devem evitar.

Sou rubiista e, embora adore a linguagem, sempre há valor em obter perspectivas. Então, qual você vê como o pior recurso (por exemplo, métodos, classes, práticas) no Ruby? Minha intenção aqui não é iniciar uma discussão sobre os méritos da própria linguagem ou sua velocidade e assim por diante. Em vez disso, prefiro discutir quais recursos você considera perigosos / problemáticos / penosos de usar, com base em experiências passadas.


1
Eu nunca fui fã de ter que usar a palavra "fim", e então a mistura disso com "{" e "}" fica ainda mais irritante. Isso me faz apreciar tanto a sintaxe no estilo Python quanto as {&}. Embora alguém possa argumentar sobre isso e, em última análise, isso tem muito a ver com preferência pessoal. Ouvi alguém dizer que Ruby pega as partes mais feias de Python e Perl e as reúne. Mas estou gostando de aprender Ruby.

Na verdade, gosto bastante dessa pergunta e gostaria de receber respostas, mas mesmo assim votei para fechá-la. Eu não acho que seja um bom ajuste para o estouro de pilha (devido a ser potencialmente muito subjetivo / argumentativo, aberto, etc.).
stakx

Acho que vale a pena discutir, pois isso poderia iluminar práticas perigosas a serem evitadas. Entendo o seu ponto e editei a pergunta para ser mais restrita.

9
Não vejo como essa pergunta é suficientemente distinta, por exemplo: Quais são as coisas que você gostaria que fossem melhoradas na linguagem Ruby? , Quais são os Ruby Gotchas sobre os quais um novato deve ser alertado? , Quais são os problemas do mundo real com Ruby? ou qualquer uma das outras perguntas sobre os pontos problemáticos de Ruby. Além disso, mesmo que essa pergunta tenha evoluído para se diferenciar das outras, ela pertenceria ao Programmers.SE , não ao StackOverflow.
Jörg W Mittag 26/03

2
Preciso verificar meus olhos - pensei que o título desta pergunta fosse "Ruby: The Brad Pitts".
Oosterwal

Respostas:


8

Você deve assistir Python vs Ruby: A Battle to the Death de Gary Bernhardt. Ele faz a citação:

As mesmas coisas que acho feias no Ruby são o que torna possível um incrível software Ruby como o RSpec, e que o Python nunca poderia ter (dada a implementação atual).

Enquanto ele fala muito sobre Python em particular, ele aborda muitas coisas estranhas em Ruby. Um dos grandes assuntos abrangentes é o remendo de macacos .

Objetos Ruby (ao contrário de outros idiomas orientados a objetos) podem ser modificados individualmente. Você sempre pode adicionar métodos por objeto. No Ruby, o comportamento ou os recursos de um objeto podem se desviar dos fornecidos por sua classe.

Embora isso ofereça muita flexibilidade e ofereça algumas das gemas mais populares e complicadas do Ruby, ele pode te incomodar se você estiver tentando depurar um problema sem perceber que alguma biblioteca em algum lugar modificou o método principal.


Javascript permite tratar objetos dessa maneira também.
0112 de

8

Algumas pessoas só pensam em rubi em termos de rubi nos trilhos e isso é meio irritante porque a linguagem se sustenta muito bem.


7

Acho que a pior característica é open classesque permite alterar globalmente o comportamento de todas as instâncias atuais e futuras da classe alterada.

A parte problemática desse recurso é que essas alterações (globais) acontecem durante o tempo de execução quando o intérprete Ruby se depara com a definição, o que pode levar muito tempo depois que você já instanciar alguns objetos que agora mudam seu comportamento de repente.

Em uma grande base de código, isso pode resultar em bugs muito, muito difíceis de encontrar - especialmente porque isso é agravado pela fraca história de depuração de Ruby (em comparação, por exemplo, com o CLR ou JVM) e o uso de outros recursos (por exemplo eval) nesse contexto pode tornar é muito difícil encontrar o local em que essa mudança global ocorreu. ou seja, se você já chegou ao ponto em que suspeita que a classe 'certa' está causando o problema! Na minha experiência, você geralmente começa com uma perseguição de ganso selvagem, à medida que os problemas começam a aparecer em um objeto usando o verdadeiro culpado.

Portanto, o melhor seria parar de usar as classes abertas ( #extende colocar as alterações em um ModuleIMHO é muito mais seguro, mais fácil de entender e melhor para testar) ou se não for possível evitar:

  • estender apenas classes com novo comportamento (ou seja, não substituindo o comportamento existente)
  • ter um local definido na árvore de códigos-fonte, onde todas as extensões que usam classes abertas devem ser colocadas
  • não use #evale amigos para criar classes abertas
  • coloque todos os usos de classes abertas em um grande gráfico visível, onde todos os desenvolvedores possam vê-las - e deixe claro que quaisquer alterações nelas são 'decisões arquiteturais' que afetam toda a base de código (o que elas fazem) e não o local para hacks rápidos úteis para sua tarefa atual

5

Maior razão para não usar Ruby: é mais lento que o melaço em janeiro no Pólo Norte durante uma era glacial. Linguagens de benchmarking são uma ciência inexata, mas Ruby parece drasticamente mais lento que o JavaScript e o Python.


essa foi a minha experiência também.
Chuck Stephanski

2
qual foi o aplicativo que você desenvolveu para o qual o ruby ​​era muito lento? Quero dizer, acredito em você quando diz que é lento, mas como isso o impediu de alcançar seu objetivo?
David

1
Eu acho que Ruby é ótimo quando você quer fazer algo como um protótipo e quer que seja feito rapidamente, algo que não é enorme e não fará trituração massiva de números. Se você espera consumir muitos ciclos de CPU constantemente, qualquer bom programador sabe usar algo como C ou C ++.
Jeff Welling

1
@ David: Eu consideraria o uso de Ruby para o código de processamento de seqüência de DNA simples, mas não porque o Python preenche um nicho semelhante, tem recursos semelhantes e é muito mais rápido. Se estou disposto a ir para um nível mais baixo, D é ainda mais rápido e ainda é conveniente.
dsimcha

1
@ Jeff: Concordo, mas C e C ++ são uma dor de se escrever. O ponto de linguagens de alto nível como Ruby é evitar lidar com essa dor o máximo possível. Quanto mais lentos eles são, menos bem eles cumprem esse objetivo. Ruby é lento, mesmo para uma linguagem dinâmica de alto nível. É por isso que NumPy / SciPy é o motivo de eu usar o Python quando preciso de uma linguagem dinâmica de alto nível.
dsimcha 29/03

4

Se isso puder ser estendido para Ruby on Rails, então:

  1. O fato de a lógica do banco de dados atribuir a cada tabela uma auto_incrementchave primária, incluindo tabelas que não precisam delas e não devem tê-las.

  2. O fato de que chaves compostas não são suportadas.

Por Ruby simples, minha queixa seria a mesma de qualquer idioma que troque segurança por expressividade; é fácil fazer muito com apenas um pouco de código, mas é igualmente fácil fazer uma grande bagunça com qualquer quantidade de código.


Por favor, veja minhas edições conforme reduzi o escopo da pergunta. Iniciarei outro paralelo para o Rails se esta pergunta com edições for aprovada.

1
Desculpe, mas você está enganado, nem todas as tabelas em um aplicativo Rails precisam ter um auto_incrementID, especialmente as tabelas de junção para relacionamentos has_and_belongs_to_many, sugeridas para NÃO explicitamente ter uma coluna de ID.
Brett Bender

@Brett - São adições relativamente novas? Quando eu estava tocando com ele no início de 2008, definitivamente não tinha esses recursos. De qualquer forma, é ótimo que eles estejam disponíveis agora.

1
@aroth: Eu não tenho certeza que todo mundo iria considerar "relativamente novo" para significar "nos últimos três anos" :-)

Existe uma alternativa ao ActiveRecord do Rails chamado DataMapper , que não é tão opinativo quanto o ActiveRecord.
Endy Tjahjono

3

Ruby adota metaprogramação (reflexão, introspecção), programação multiparadigma e dinamismo em um nível incomum. É fácil dar um tiro no pé com força e flexibilidade.

Problemático? Ruby tem a capacidade de ser extremamente legível ou inescrutável. Eu vi código que parece pertencer a um script Bash.

Más práticas? Alguns rubiistas valorizam a inteligência sobre a sabedoria. Eles escrevem e compartilham truques que mostram sua inteligência, mas isso cria código ilegível e frágil.

Como um aparte: Javascript foi um desastre por design, e o livro "The Good Parts" tenta extrair sua beleza oculta. O Perl, uma linguagem que popularizou "Há mais de uma maneira de fazer" (ou seja, flexibilidade), tem um livro semelhante em "Perl, Best Practices". A história de Perl é de experimentação e experiência conquistada com dificuldade, "Melhores Práticas" representa seu conhecimento. Perl 6 será, acho justo dizer, uma reinicialização da linguagem com base nesse conhecimento e muito mais. Ruby pode sofrer de problemas semelhantes.

@ James e para loops ... Quando você faz um loop for em ruby, ele chama ".each". Portanto, "for" é um açúcar sintático para pessoas mais confortáveis ​​com loops no estilo C. Mas como Rubyist, você vai usar iteradores como .map, .inject, .each_with_object, o tempo todo. Você nunca precisará escrever um loop for com algo como "i = 0; i> 6; i ++" em ruby, e assim acabará abandonando o hábito. @andrew ... rubi eloquente não apoia loops.


-1

Isso é mais sobre os programadores do que sobre a linguagem, mas por que os programadores Ruby odeiam tanto os loops?

Eu percebo que Ruby tem:

someCollection.each do |item|
   ...
end

mas nunca vi isso usado em situações em que um loop for não faria exatamente a mesma coisa.

Eu perguntei várias vezes e nunca recebi uma boa resposta para esta.

Se é apenas uma coisa de estilo, fico feliz em aceitar isso, mas vi os programadores Ruby realmente se preocupando com isso e estou muito curioso.


1
Uma vez que eu mesmo tenho a resposta "É prensas menos chave", o que é claramente falso ... :-)
James

2
Duas teorias: 1) Usar forloops é algo que n00bs faz. Pessoas que estão programando C em Ruby. 2) Os blocos são muito usados ​​no Ruby, portanto, usar algo que não seja do tipo bloco é apenas um esforço mental extra.
Andrew Grimm

3
Enquanto eu comecei a aprender Ruby, os blocos são algo que realmente gosto e sinto falta quando tento usar o Python. Um loop for faria a mesma coisa? É claro que, para mim, esse tipo de estilo combina mais com minhas preferências do que com um loop for.
28411 Jetti

2
@andrew Para ser sincero, sua primeira resposta é exatamente o tipo de lixo que recebi quando perguntei antes. Nenhuma razão real, com um insulto sutil no topo. @Wayne, @Jetti e @andrews 2ª resposta: obrigado. Justo o suficiente então.
James

1
Se você quer dizer "aprimorado" para loops (também conhecido como <valor> na <expressão> do ...), não há diferença além de #cada em uso e aparência mais próxima de seus primos comumente usados ​​#inject, #collect, # rejeite etc. Se você estiver falando de loops indexados no estilo 'C' (também conhecido como int i = 0; i <tanto faz; ++ i) a diferença é que: a) os erros "off by one" são impossíveis eb) que deixa clara a intenção do seu loop - #cada significado "para cada elemento produz um efeito colateral". Um loop for exige que você leia o loop inteiro apenas para obter a essência do seu objetivo.
Alexander Battisti

-1

Eu geralmente evitava coisas que eram adicionadas apenas para serem compatíveis com outros idiomas. Por exemplo, Perlismos e for x in y.


Acabei de publicar uma resposta sobre Ruby Os programadores e para loops, e se você pode explicar Eu ficaria grato :-)
James
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.