Ruby: Kötü Bölümler [kapalı]


20

Son zamanlarda Crockford'un "Javascript: The Good Parts" kitabını okudum ve temel alanlardan biri, programlama dillerinin programcıların kaçınması gereken kötü özelliklere sahip olabilmesiydi.

Ben bir Rubyistim ve dili sevsem de perspektif kazanmanın her zaman değeri var. Peki, Ruby'deki en kötü özellik (ör. Yöntemler, sınıflar, uygulamalar) olarak ne görüyorsunuz? Buradaki amacım, dilin kendisinin esası ya da hızı vb. Hakkında bir tartışma başlatmak değil. Daha ziyade, geçmiş deneyimlere dayanarak, tehlikeli / zahmetli / acı verici olarak düşündüğünüz özellikleri tartışmayı tercih ederim.


1
Hiç "son" kelimesini kullanmak zorunda kalmadım ve daha sonra "{" ve "}" ile olan karışımı daha da can sıkıcı oluyor. Python tarzı sözdizimini veya düz {&} 'leri takdir etmemi sağlıyor. Kişi bunun üzerinde ileri geri tartışabilir ve sonuçta kişisel tercih ile ilgisi vardır. Birisinin Ruby'nin Python ve Perl'in en çirkin kısımlarını aldığını ve bir araya getirdiğini söylediğini duydum. Yine de Ruby öğrenmekten keyif alıyorum.

Aslında bu soruyu oldukça seviyorum ve cevapları dört gözle bekliyorum, ancak yine de kapatmak için oy verdim. Stack Overflow (potansiyel olarak çok öznel / tartışmacı, açık uçlu, vb. Olması nedeniyle) için uygun olduğunu düşünmüyorum.
stakx

Önlemek için tehlikeli uygulamaları aydınlatabileceği için tartışmaya değer olduğunu düşünüyorum. Ne demek istediğini anlıyorum ve soruyu daha dar olacak şekilde düzenledim.

9
Bu sorunun yeterince farklı olduğunu görmüyorum, örneğin Ruby dilinde geliştirilmesini istediğiniz şeyler nelerdir? , Bir acemi hakkında uyarılması gereken Ruby Gotchas nelerdir? , Ruby ile ilgili gerçek dünya sorunları nelerdir? ya da Ruby'nin acı noktaları hakkındaki diğer gazillion sorularından herhangi biri. Hatta Artı, eğer bu soruyu o diğerlerinden kendini farklılaştırmak için gelişti, bu on uygun olur Programmers.SE değil StackOverflow'daki.
Jörg W Mittag

2
Gözlerimi kontrol ettirmem gerekiyor - bu sorunun başlığının "Ruby: Brad Pitts" olduğunu düşündüm.
oosterwal

Yanıtlar:


8

Gary Bernhardt - Python vs Ruby: Ölümüne Bir Savaş izle Alıntı yapıyor:

Ruby'de çirkin bulduğum şey, RSpec gibi şaşırtıcı Ruby yazılımını mümkün kılan şeydir ve Python'un (mevcut uygulama göz önüne alındığında) asla sahip olamayacağı şeydir.

Özellikle Python hakkında çok konuşurken, Ruby'de sadece garip olan birçok şeye dokunuyor. Büyük kapsayıcı konulardan biri maymun yamasıdır .

Yakut nesneler (diğer nesne yönelimli dillerdeki nesnelerin aksine) ayrı ayrı değiştirilebilir. Her zaman nesne başına yöntem ekleyebilirsiniz. Ruby'de, bir nesnenin davranışı veya yetenekleri kendi sınıfı tarafından sağlananlardan farklı olabilir.

Bu, çok fazla esneklik sağlar ve Ruby'nin en popüler ve karmaşık taşlarından bazılarına güç sağlarken, bir yerlerde bir kütüphanenin çekirdek bir yöntemi değiştirdiğini fark etmeden bir sorunu ayıklamaya çalışıyorsanız, sizi popoda ısırır.


Javascript, nesnelere de bu şekilde davranmanızı sağlar.
0112

8

Bazı insanlar yakutu raylar üzerinde yakut olarak düşünür ve bu biraz sinir bozucu çünkü dil kendi başına iyi duruyor.


7

Bence en kötü özellik, open classesdeğişen sınıfın tüm mevcut ve gelecekteki örneklerinin davranışını küresel olarak değiştirmenize izin vermesidir.

Bu özelliğin sorunlu kısmı, Ruby yorumlayıcısı tanımla karşılaştığında bu çalışma sırasında (global) değişikliklerin meydana gelmesidir; bu, davranışlarını aniden değiştiren birkaç nesneyi zaten başlatmanızdan çok sonra olabilir.

Büyük bir kod tabanında bu, hataların bulunması çok, çok zor olabilir - özellikle de Ruby'nin zayıflığıyla (örneğin CLR veya JVM ile karşılaştırıldığında) hata ayıklama hikayesi ve evalbu bağlamda diğer özelliklerin (örneğin ) kullanılması bu küresel değişimin gerçekleştiği yeri bulmak oldukça zor. yani 'doğru' sınıfın soruna neden olduğundan şüphelendiğiniz noktaya ulaştıysanız! Deneyimlerime göre, sorunlar gerçek suçluyu kullanarak bir nesnede ortaya çıkmaya başladığı için genellikle vahşi bir kaz kovalamacıyla başlarsınız.

Bu yüzden en iyi şey, ya açık sınıfları kullanmayı bırakmak ( #extendve değişiklikleri a koymak ModuleIMHO'yu çok daha güvenli, anlaşılması daha kolay ve test edilmesi daha iyi olacaktır) ya da bundan kaçınılamıyorsa:

  • yalnızca yeni davranışa sahip sınıfları genişlet (yani mevcut davranışı geçersiz kılmamak)
  • kaynak kod ağacında, açık sınıfları kullanan tüm uzantıların yerleştirilmesi gereken tanımlanmış bir yere sahip olmak
  • #evalaçık sınıflar oluşturmak için ve arkadaşlarını kullanmayın
  • açık sınıfların tüm kullanımlarını, tüm geliştiricilerin görebileceği büyük bir görünür grafiğe koyun - ve bunlarda yapılacak herhangi bir değişikliğin, hızlı saldırıların yeri değil, tüm kod tabanını (yaptıkları) etkileyen 'mimari kararlar' olduğunu açıkça belirtin mevcut göreviniz için

5

Ruby'yi kullanmamamın en büyük nedeni: Buzul çağında Ocak ayında Kuzey Kutbu'ndaki pekmezden daha yavaş . Karşılaştırma dilleri tam olmayan bir bilimdir, ancak Ruby, JavaScript ve Python'dan bile çok daha yavaş görünür.


o da benim deneyimimdi.
Chuck Stephanski

2
hangi yakut için çok yavaş geliştirilen uygulama neydi? Demek istediğim, yavaş olduğunu söylediğin zaman sana inanıyorum, ama hedefine ulaşmanı nasıl engelledi?
David

1
Prototip gibi bir şey yapmak ve hızlı bir şekilde yapılmasını istediğinizde, Ruby'nin çok büyük olmayan ve çok sayıda krizi yapamayacağı zaman harika olduğunu düşünüyorum. Çok fazla CPU döngüsünü sürekli çiğnemeyi bekliyorsanız, iyi bir programcı C veya C ++ gibi bir şey kullanmayı bilir.
Jeff Welling

1
@David: Basit DNA dizisi işleme kodu için Ruby kullanmayı düşünürdüm, ama Python benzer bir niş doldurduğundan, benzer özelliklere sahip olduğundan ve çok daha hızlı olduğundan yapmıyorum. Daha düşük bir seviyeye gitmek istersem, D daha da hızlı ve yine de kullanışlı.
dsimcha

1
@Jeff: Kabul etti, ancak C ve C ++ yazmak için bir acı. Ruby gibi üst düzey dillerin amacı, bu acıyla mümkün olduğunca uğraşmaktan kaçınmaktır. Ne kadar yavaşlarsa, bu hedefi o kadar iyi yerine getiremezler. Ruby, üst düzey bir dinamik dil için bile yavaştır. Bu ve NumPy / SciPy, üst düzey bir dinamik dile ihtiyacım olduğunda bunun yerine Python kullanıyorum.
dsimcha

4

Bu, Ruby on Rails'e genişletilebilirse, o zaman:

  1. Veritabanı mantığının her tabloya auto_increment, bunlara ihtiyaç duymayan ve bunlara sahip olmaması gereken tablolar da dahil olmak üzere birincil anahtar sağlaması.

  2. Bileşik anahtarların hiç desteklenmemesi.

Sadece sade Ruby için benim tutkum ifade güvenliği için her dil ile aynı olurdu; küçük bir kodla çok şey yapmak kolaydır, ancak herhangi bir miktarda kodla büyük bir karmaşa yapmak kolaydır.


Sorunun kapsamını daraltırken lütfen düzenlemelerime bakın. Düzenlemeleri olan bu soru onaylanırsa, Rails için başka bir paralel soru başlatacağım.

1
Maalesef, yanılıyorsunuz, Rails uygulamasındaki her tablonun bir auto_incrementkimliğe sahip olması gerekli değildir , özellikle has_and_belongs_to_many ilişkileri için tablolara katılmanın açıkça bir id sütununa sahip OLMAMASI önerilir.
Brett Bender

@Brett - Bunlar nispeten yeni eklemeler mi? 2008'in başlarında onunla oynarken kesinlikle bu özelliklere sahip değildi. Her durumda, şu anda hazır olmaları harika.

1
@aroth: Herkesin "son üç yıl içinde" demek için "nispeten yeni" olarak değerlendireceğinden emin değilim :-)

Rails 'ActiveRecord'a DataMapper adı verilen ve ActiveRecord kadar görüşlü olmayan bir alternatif var .
Endy Tjahjono

3

Ruby meta programlamayı (yansıma, içgözlem), çoklu paradigma programlamayı ve dinamizmi nadir bir düzeyde kucaklar. Güç ve esneklikle ayağınıza ateş etmek kolaydır.

Zahmetli? Ruby son derece okunabilir veya anlaşılmaz olabilir. Bash betiğine ait gibi görünen bir kod gördüm.

Kötü Uygulamalar? Bazı Rubyist bilgelik üzerinde zekâya değer verir. Akıllılıklarını gösteren püf noktaları yazarlar ve paylaşırlar, ancak bu okunamayan ve kırılgan kodlar yaratır.

Bir kenara: Javascript tasarım açısından bir felaketti ve "İyi Parçalar" kitabı gizli güzelliğini çıkarmaya çalışıyor. "Bunu Yapmanın Birden Fazla Yolu Var" (yani esneklik) popülerliğini taşıyan Perl, "Perl, En İyi Uygulamalar" da benzer bir kitaba sahiptir. Perl'in tarihi bir deney ve zor kazanılmış deneyimlerden biridir, "En İyi Uygulamalar" bilgisini temsil eder. Perl 6, bence söylemek gerekirse, bu bilgiye ve daha fazlasına dayanan bir dilin yeniden başlatılması adil olacak. Ruby benzer sorunlardan muzdarip olabilir.

@James ve döngüler için ... Ruby'de bir for döngüsü yaptığınızda ".each" olarak adlandırılır. Bu nedenle, "for" C tarzı döngülerden daha rahat insanlar için sözdizimsel şekerdir. Ancak bir Rubyist olarak, her zaman .map, .inject, .each_with_object gibi yineleyicileri kullanacaksınız. Asla yakutta "i = 0; i> 6; i ++" gibi bir şey için bir for döngüsü yazmak zorunda kalmazsınız ve böylece alışkanlığı düşürürsünüz. @andrew ... etkili yakut döngüler için onay vermez.


-1

Bu programcılar hakkında dilden çok daha fazlası, ama Ruby programcıları döngüler için neden bu kadar nefret ediyorlar?

Ruby'nin:

someCollection.each do |item|
   ...
end

ancak for döngüsünün tamamen aynı şeyi yapmayacağı durumlarda kullanıldığını hiç görmedim.

Birkaç kez sordum ve buna iyi bir cevap alamadım.

Sadece stil bir şeyse, bunu kabul etmekten mutluluk duyuyorum, ama Ruby programcılarının bu konuda gerçekten işe yaradığını gördüm ve gerçekten merak ediyorum.


1
Bir kez "Bu daha az tuşa basma" cevabını aldım, ki bu kesinlikle yanlış ... :-)
James

2
İki teori: 1) forDöngüler kullanmak n00b'lerin yaptığı bir şeydir. Ruby'de C programlayan insanlar. 2) Bloklar Ruby'de çok kullanılır, bu yüzden blok benzeri olmayan bir şey kullanmak sadece ekstra zihinsel çaba.
Andrew Grimm

3
Ruby öğrenmeye yeni başlamışken, Python'u kullanmaya çalıştığımda bloklar gerçekten sevdiğim ve özlediğim bir şey. For döngüsü de aynı şeyi yapar mı? Tabii ki, bana göre, bu tarz bir stil sadece bir for döngüsünden ziyade tercihlerime uyuyor.
Mart'ta Jetti

2
@andrew Dürüst olmak gerekirse, ilk cevabınız tam olarak daha önce sorduğumda aldığım çöp türüdür. Üstünde ince bir hakaret ile gerçek bir neden yok. @Wayne, @Jetti ve @andrews 2. cevap: teşekkürler. O zaman yeterince adil.
James

1
Döngüler için "gelişmiş" anlamına gelirseniz (<expression> içindeki <değer> için ... olarak da bilinir), #each kullanımda olmak ve yaygın olarak kullanılan kuzenlerine daha yakın görünmek dışında hiçbir fark yoktur #inject, #collect, # 'C' tarzı indeksli döngülerden bahsediyorsanız (aka. int i = 0; i <ne olursa olsun; ++ i) fark şu ki, a) "birer birer kapalı" hatalar imkansızdır ve b) döngünüzün amacını netleştirir - #each "her öğe için bir yan etki üretir". For döngüsü, amacının 'özünü' elde etmek için tüm döngüyü okumanızı gerektirir.
Alexander Battisti

-1

Genellikle eklenen dillerden diğer dillerle geriye dönük olarak uyumlu olmaktan kaçınırım. Örneğin, Perlisms ve for x in y.


Az önce Ruby Programcılar ve döngüler için bir cevap gönderdim ve açıklayabilirseniz minnettar olurum :-)
James
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.