En sevdiğiniz dil hakkında nefret ettiğiniz beş şey nedir? [kapalı]


403

Son zamanlarda Stack Overflow'da bir Perl-nefret kümesi oldu, bu yüzden " En sevdiğiniz dil hakkında nefret ettiğiniz beş şey " sorumu Stack Overflow'a getireceğimi düşündüm . En sevdiğiniz dili alın ve bundan nefret ettiğiniz beş şeyi söyleyin. Bunlar sadece sizi rahatsız eden, tasarım kusurlarını, tanınan performans sorunlarını veya başka bir kategoriyi kabul eden şeyler olabilir. Sadece nefret etmelisin ve en sevdiğin dil olmalı.

Başka bir dil ile karşılaştırmayın ve zaten nefret ettiğiniz diller hakkında konuşmayın. En sevdiğiniz dilde sevdiğiniz şeyler hakkında konuşma. Sadece nefret ettiğin şeyleri duymak istiyorum ama diğer şeylerin hepsini kullanabilmek için hoşgörülü olmak istiyorum ve bunu diğer insanların kullanmasını istediğin dil hakkında duymak istiyorum.

Birisi en sevdiği dili bana itmeye çalıştığında ve bazen röportaj sorusu olarak soruyorum. Birisi en sevdiği araç hakkında nefret edecek beş şey bulamazsa, onu savunmanın veya kullanarak büyük dolar çekmenin yeterince iyi olduğunu bilmez. Tam olarak keşfetmek için yeterli farklı durumlarda kullanmadı. Bunu bir kültür ya da din olarak savunuyor, yani en sevdiği teknolojiyi seçmezsem yanılıyorum.

Hangi dili kullandığın umurumda değil. Belirli bir dili kullanmak istemiyor musunuz? Öyleyse yapma. Bilgili bir seçim yapmak için gereken özeni gösteriyorsunuz ve hala kullanmıyor musunuz? İnce. Bazen doğru cevap "İyi uygulamalara ve Bar'da çok deneyime sahip güçlü bir programlama ekibiniz var. Foo'ya geçmek aptalca olur."


Bu, kod incelemeleri için de iyi bir soru. Gerçekten bir kod tabanı bilen insanlar bunun için her türlü öneriye sahip olacaklar ve onu çok iyi bilmeyenlerin spesifik olmayan şikayetleri var. "Bu projeye yeniden başlasaydın, farklı şekilde ne yapardın?" Bu fantezi dünyasında, kullanıcılar ve programcılar sevmedikleri her şey ve her şeyden şikayet ediyorlar. "Daha iyi bir arayüz istiyorum", "Modeli görünümden ayırmak istiyorum", "Bu modülü diğeri yerine kullanırdım", "Bu yöntem kümesini yeniden adlandıracağım" veya gerçekten ne yaparlarsa yapsınlar mevcut durumu sevmiyorum. Bu şekilde belirli bir geliştiricinin kod tabanı hakkında ne kadar bilgi sahibi olduğunu öğrenebilirim. Ayrıca programcının ne kadarı hakkında bir ipucu. '

Nefret, insanların ne kadar bildiğini anlamanın tek boyutu değil, ama bunun oldukça iyi olduğunu gördüm. Nefret ettikleri şeyler de konuyu ne kadar iyi düşündüklerine dair bir ipucu veriyor.


11
Bu eski "en sevdiğiniz dil" sorusuna gerçekten güzel bir dönüş. İyi bir gerekçe.
Tom Leys

14
SO'nun geniş bir .NET kitlesine sahip olmasına rağmen, bu yazı yazıldığı sırada 24 cevap olduğu ilginçtir, bunlardan sadece biri (benimki) .NET veya .NET dili ile ilgilidir. Bunun SO veya .NET hakkında ne söylediği hakkında hiçbir fikrim yok, ama ilginç ...
Jon Skeet

22
C / C ++ ile programlamanın ilk 15 yılı, nefret ettim (alfabetik sırayla): 1. İşaretçiler 2. İşaretçiler 3. İşaretçiler 4. İşaretçiler 5. İşaretçiler
ileon

4
İnsanların kendi seçtikleri dilden nefret etme konusunda ne kadar yorum yaptıkları merak ediyorum, çünkü kendi seçtikleri dilde programlamayı anlamadılar ....
Kris.Mitchell

3
Bu harika bir soru. Bir dilin nasıl bir şey olduğunu merak ediyorsanız, bu sayfada bu konu hakkında 3 farklı yanıt okumak, kolayca bulabileceğiniz en iyi zaman-bilgi-bilgisi olacaktır. Ayrıca, dili zaten biliyorsanız bir programcının deneyim (ve alçakgönüllülük) düzeylerini ölçmek için harika bir yoldur.
j_random_hacker

Yanıtlar:


182

Java hakkında nefret ettiğim beş şey:

  • Birinci sınıf işlev yok.
  • Tür çıkarımı yok.
  • Örneğin grafiklerde aklı başında varsayılanların olmaması.
  • NullPointerException null değeri hakkında daha fazla bilgi içermiyor.
  • Anlamsız "yapılandırılabilir" çerçevelerin / servis sağlayıcı arayüzlerinin / fabrika sınıflarının / bağımlılık enjeksiyon sistemlerinin yaygınlaşması. Yapılandırılabilirlik neredeyse hiç kullanılmaz, DRY acımasızca ihlal edilir ve kod dört kat büyüklükte ve okunaklılıkta yarıya iner.

Biliyorum, Scala'ya bakmalıyım.


7
@both: NPE, yığın transtörünün ilk satırında gösterilir. (Çoğu zaman) sınıf, java dosya adı ve satır numarasını içerir: "at your.faulty.code.Instance (Intance.java:1234)" Sonra o dosyayı açın, o satıra gidin ve orada atanmış hiçbir değişkeni olmayan bir değişkendir.
OscarRyz

35
@Oscar Reyes - Ee, bunu biliyoruz. Ancak bu satırda birden fazla değişken olabilir ve istisna mesajı bana hangisinin boş olduğunu söylemiyor.
Zarkonnen

10
Scala'nın siğilleri de var. Ancak, Java'dan muhteşem bir şekilde daha iyidir.
wheaties

10
Çerçevelerin çoğalması vb. İçin +1
Erich Kitzmueller

6
@Valentin, sadece NullPointerException'ın gece koşusundan devasa bir günlük dosyasında olduğunu hayal edin ve ne olduğunu anlamanız gerekiyor ... Hata ayıklama bir seçenek değil.
Thorbjørn Ravn Andersen

216

Vay canına, SQL'in henüz burada oluşturmadığına şaşırdım . Sanırım kimse sevmiyor demek :)

  • Uygulamalar arasında tutarsız sözdizimi
  • Küçük kod farklılıklarının, görünüşte belirsiz nedenlerden dolayı büyük performans sonuçları olabilir
  • Metin manipülasyonu için zayıf destek
  • Kolay giriş maliyeti, ancak dilde uzmanlaşmaya yönelik dik öğrenme eğrisi
  • En iyi uygulamalar için topluluk genelinde minimum standardizasyon, sözdizimi stilini içerir.

... Ve nefret etmek için birkaç ekstra neden, ekstra ücret ödemeden

  • WHERE yan tümcesi geçer, bir UPDATE (GÜNCELLEŞTİR) veya DELETE (YÜKSELT) işlemini yürütmeyi kolaylaştırarak tüm tabloyu yok eder. Bunun yerine, NEREDE ön tarafa bir yere gitmeli.
  • İlişkisel bölünmeyi uygulamak zor.
  • NULL için bir değer ayarlayabilirim, ancak NULL ile eşitlik için test edemiyorum. Ben IS NULL kontrol edebilirsiniz, ama bu sadece kodu karmaşık - gereksizce, bence.
  • Neden sütunda bir takma ad ayarlamak ve daha sonra diğer adla (veya SIRALA'da olduğu gibi sütun dizini) GRUPLI sütun için formüle tamamen saygı duymalıyız?

7
Belki de hiç kimse onu bir dil olarak düşünmeyi bırakana kadar sevmeyi öğrenemez. :)
Alan Moore

4
Her şey için +1. Yine de insanlar neden
ORM'nin

2
@Alan M ... L'nin anlamı bu değil mi? :)
Kev

29
INSERT sözdiziminin UPDATE'den neden bu kadar farklı olduğunu anlayamıyorum. MERGE anlaşılmaz.
LaJmOn

3
DOĞRU ve YANLIŞ'tan hemen sonra NULL'un üçüncü bir olası sonuç olduğunu düşünüyorsanız, IS NULL'un gerekliliği açık olmalıdır. Anlamı "bilinmiyor" olduğu için, bilinmeyen bir şeyin bilinmeyen başka bir şeyle eşleşip eşleşmediğini söyleyemezsiniz. Başka bir örnek: NULL, NULL değerine eşitse, bu, JOIN'leri yapma kavramının tümünün imkansız olacağı anlamına gelir, çünkü herhangi bir NULL değeri başka bir NULL değeriyle eşleştirilebilir. Bunu (üçlü mantık olarak da adlandırılır) anlarsanız, NULL'a karşı test etmek için "IS" operatörünün kullanılmasının nedenini anlayabilirsiniz.
Alex

159

JavaScript :

  1. Tüm havalı şeyler delicesine karmaşıktır, ancak daha sonra, tüm serinlik de o kadar az miktarda kodla sarılır ki, onu takip etmekte zorlandığınız için aptal hissedersiniz.

  2. '+', zayıf yazılan bir dilde birleştirme için saçma bir operatör seçimidir. Mezarları korkutmaya mı çalışıyorlardı ?

  3. Bu bir tarayıcılar arası uyumluluk mayın tarlasıdır (açık olsa da olmasa da boşver)

  4. Genellikle güvenilmez - geri düğmesini engelleme, asla ölmeyen pop-up'lar vb.

  5. Hata ayıklamak neredeyse imkansızdır çünkü yalnızca birkaç farklı hata mesajı ve birkaç farklı tür vardır (Sayı, Dize, Nesne vb.)

JQuery olmasaydı, muhtemelen eskiden olduğu kadar nefret ederdim :)


15
Mausch'a katılıyorum. ECMAscript kendi içinde güzel ve güçlü bir dildir. Adını karıştıran sinir bozucu tarayıcılar (: öksürük: IE).
TJ L

32
@Mausch: Javascript vakaların büyük çoğunluğunda nerede yaşıyor ? "Otomobiller küresel ısınmaya katkıda bulunmuyor, bunu yapan araba kullanıyor" - yani, elbette, ama noktayı kaçırmak - bir araba ile başka ne yapıyorsunuz?
jTresidder

20
@Chris: Evet, "+" güçlü yazılan bir dilde (Python gibi) birleştirme için iyi bir operatördür. Zayıf yazılan bir dilde (Javascript veya C gibi) korkunçtur; (sessizce!) 'sum:' + 2 + 3'ün 'sum: 5' değil 'sum: 23' olduğuna karar verir. Daha fazla Javascript deneyimi olan biri daha iyi örnekler verebilir.
ShreevatsaR

5
Evet, C, örneğin Python ile karşılaştırıldığında zayıf yazılmıştır (örneğin, chars'ye tamsayı atayabilir , herhangi bir şeye void * işaretçileri vb. Yoluyla herhangi bir şey atayabilirsiniz ) Dinamik olarak yazılmak yerine statik olarak yazılır ve ayrıca açık yazım gerektirir tip çıkarım, ancak bunlar güçlü v / s zayıf yazmayla ilişkisizdir. [Rastgele örnekler: Python, örtülü dinamik güçlü yazmaya sahiptir, Haskell (isteğe bağlı olarak açık) statik güçlü yazmaya sahiptir, Java açık (çoğunlukla statik) güçlü yazmaya sahiptir, C açık statik (nispeten zayıf) yazmaya sahiptir.] "Güçlü yazılmıştır" ve "zayıf yazılmıştır "aslında iyi tanımlanmamıştır.
ShreevatsaR

5
@ShreevatsaR Klasik örnek: '3'+'2'='32', '3'-'2'=1.
Thomas Ahle

148

PHP:

1) Gereksiz değişkenler yapmaya zorlar:

$parts = explode('|', $string);
$first = $parts[0];

2) Lambdas bir uygulama kabaca kullanmak için eşdeğer eval()ve çok iğrenç yanlış ben hiç kullanmadım (bkz. Http://www.php.net/create_function ).

3) Oluşabilecek hataların sadece% 80'ini yakalayabilen bir deneme / yakalama sistemi.

4) Regex desteği, lambda desteği kadar topaldır, çünkü düzenli dizelerin içine yazılmalıdır ve öğrenmesi en zor programlama araçlarından birini yaklaşık üç kat zorlaştırır. Ve PHP "kolay" bir dil olması gerekiyordu?!?!?

5) İki kez yazmadan veya kendi işlevinizi oluşturmadan veya '@' operatörünü kullanmadan eşyaları $ _POST'dan güvenle çıkarmanın yolu yok:

$x = isset($_POST['foo']['bar']) ? $_POST['foo']['bar'] : null;

6) Bonus cevap: '@'. Kodunuzu doğru şekilde yazmaktan rahatsız olmuyorsanız, sadece '@' ekleyin ve kodunuzu daha sonra hata ayıklamak zorunda olan herkes için çok kötü.


44
list ne olacak ($ ​​first) = patlayabilir ('|', $ string); ?
mlarsen

44
İdeal olarak, some_function (explode ('|', $ string) [0]) kullanmak istiyorum;
Çok fazla php

8
Ne tuhaf değişken kapsam belirleme? Yerel olan her şeye sahip olmak ve bir küresel kullanmak istediğinizde sizi bildirmeye zorlamak iyi bir fikirdir, noobs'un, argümanları kullanmak zorunda oldukları gibi döndürmek ve değerleri döndürmek yerine sadece globalleri kullanan işlevler yapmasını önler.
scragar

24
parametre sırasının rastgele değiştiği fonksiyonları unuttun
dusoft

39
VerbNoun, verb_noun, noun_verb, nounverb, verbnoun, nounVerb vb. Hakkında unuttun.> _>
Warty

135

C ++

  • Belleği rastgele bozmak ve bulmak neredeyse imkansız hatalar oluşturmak çok kolay ( Valgrind bunu düzeltmek için uzun bir yol kat ediyor).
  • Şablon hata mesajları.
  • Şablonları kullanırken, her şeyi bir dosyaya dahil etmek ve daha sonra aptal derleme süreleri almak son derece kolaydır.
  • Standart kütüphane modern çağda bir şaka (varsayılan olarak hala konu veya ağ yok?)
  • Çok kötü küçük bit C alay (özellikle, kısa / int / unsigned / vb arasındaki tüm dönüşümleri ..)

13
Ben STL katılıyorum ama ne diyecekler olduğunu oldukça iyi vardır.
Bernard

22
Unicode. ascii'nin sadeliğine saygı duyuyorum, ama iyilik için 21. yüzyıla geldik.
wilhelmtell

29
@Kieveli const doğruluk aslında diğer dillerde programlama yaparken en çok özlediğim şeylerden biri. özellikle dinamik olarak yazılmış olanlar. raii de sık sık özlediğim büyük bir özelliktir.
wilhelmtell

6
C ++ sorunlarının çoğu bir ISO standardı olmaktan ve 10 yıl boyunca kilitlenmekten kaynaklanmaktadır.
graham.reeds

7
+1 "Şablon hata mesajları."
João Portela

129

C # / .NET:

  • Sınıflar varsayılan olarak mühürlenmelidir
  • Herhangi bir lockifade olmamalıdır - bunun yerine, belirli kilitleme nesneleriniz olmalı ve Acquiretek kullanımlık kilit belirteçlerini döndüren yöntemler olmalıdır . Sonuç: Her nesne için bir monitör olmamalıdır.
  • GetHashCode()ve Equals()olmamalı System.Object- her şey hash için uygun değil. Bunun yerine, sahip IdentityCompareraynı işlevi gören ve tutmak IComparer<T>, IComparable<T>, IEqualityComparer<T>ve IEquatable<T>özel karşılaştırmalar için arayüzleri.
  • Değişmezlik için zayıf destek
  • Uzantı yöntemlerini keşfetmenin kötü yolu - sadece bir ad alanı kullandığımdan çok daha bilinçli bir karar olmalıdır.

Bunlar kafamın tepesindeydi - yarın bana sor ve ben farklı bir 5 ile geleceğim :)


22
Varsayılan olarak mühürlü: kalıtım ya bir sınıfa (zaman alır ve gelecekteki seçenekleri sınırlar) tasarlanmalıdır ya da yasaklanmalıdır. hashCode / eşittir: Java'da da berbat. Bir gün bunun hakkında uzun bir blog yazısı yazacağım. Kalıtım zincirlerinde niçin eşit olduğunu öğrenmek için Etkili Java'yı okuyun.
Jon Skeet

88
Varsayılan olarak mühürleme, birinin sınıfınızdan miras almak isteyebileceği her türlü nedeni düşündüğünüz anlamına gelir ve hiçbirinin mantıklı olduğunu düşünmezsiniz. Üzgünüm, ama hiçbirimiz o kadar akıllı değiliz.
Ed S.

69
Bu durumda benim kodumdan türetmek için yeterince zeki değilim: çünkü kodunuzu kırabilecek gelecekteki değişiklikleri ne yapacağımı tahmin edemiyorum. Bu çok önemli bir sorun, IMO. Kodun mühürlenmesi daha kısıtlayıcıdır, ancak daha fazla uygulama özgürlüğü ve sağlamlığına yol açar.
Jon Skeet

11
Kimse "goto case" sözdiziminden bahsetmediğine inanamıyorum, ondan nefret ediyorum!
Aistina

20
Jon Skeet'in C # tasarlamadığı iyi bir şey, ya da listem "1. sınıflar varsayılan olarak mühürlendi; 2. kilitleme çok karmaşık; 3. çoğu nesne yıkanamaz" gibi görünüyor!
Gabe

113

C

  • dize değiştirme.

Dize arabellekleriyle elle uğraşmak hataya yatkın bir acıdır. Çok fazla bilgi işlem gerçekten dizeleri hareket ettirdiğinden ve değiştirdiğinden (bilgisayarlar, insanların ne zaman geri döneceklerini düşündükleri kadar çok sayıda çatırdayan şeyler için kullanılmaz), yönetilen dilleri veya C ++ dizesini kullanmak gerçekten güzel bunlarla başa çıkmak için. Düz C'de yapmam gerektiğinde, bataklıkta yüzmek gibi geliyor.


50
Kabul. Dize manipülasyonu, C hakkında nefret ettiğim şeylerin
1'den 5'ine kadar olan şeydir

1
DJB'nin güvenli dize kitaplığını veya başka bir şeyi kullanmanız yeterlidir. XML manipülasyonu çoğu dilde zordur ve birçok program XML manipülasyonu yapar, ancak "Perl tamamen bozuldu, çünkü DOM düğümlerini ilkel bir veri türü olarak desteklemediğinden" diyen birçok gönderi görmüyorsunuz. Bir kütüphane kullanıyorlar.
Steve Jessop

5
C string manipülasyonu berbat, ancak dil sorunları söz konusu olduğunda, en kötü şey değil.
Chris Lutz

3
strcat birleştirmek için, ama bekleyin ... hedef yeterli alan var mı ... tamam, eğer kontrol etmek için if ifadesi eklemek gerekir ... ama beklemek, ne benim dize yığın ise? Tamam, boyutu takip etmek için etrafında bir değişken tutmak gerekir ... Ve bu devam ve devam edebilir ...
blwy10

4
C hakkında nefret etmediğimiz beş şey için bir konuya ihtiyacımız var ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

94

"Bir dil hakkında nefret ettiğim şeyler" listelerinden nefret ettiğim beş şeye ne dersiniz? : D

5- Turuncu kırmızıyı boyamak onu elma yapmaz.

Bir dil tasarlandığında, tasarımcılar genellikle ne işe yaradığını akıllarında tutarlar. Şey bambaşka bunu kullanarak yapabilirsiniz çalışması, ancak yok olduğunda şikayet saçmasıydı. Python'u al. Eminim ya biri var ya da bir gün exe Python kodunu oluşturmak için bir yardımcı program yapacak eminim. Neden Tanrı'nın yeryüzünde sen olacağını istediğiniz bunu yapmak için? Düzgün olurdu - beni yanlış anlamayın - ama faydası yok. Yani bu konuda şikayet durdurmak!

İyi tasarlanmış bir proje muhtemelen birden fazla dilden kod içerecektir. Bu sadece bir dil ile bir projeyi tamamlayamayacağınız anlamına gelmez. Bazı projeler kullandığınız dilin yetenekleri dahilinde olabilir.

4- tahta ayakların üzerinde mi duruyorsun?

Platform, dilin yapabileceklerinin büyük bir etkisi olabilir. Günümüzde çöp toplayıcıları, hatta paskallar "çöp toplama" erken girişimi ile, bellek solmaya yardımcı olabilir (belki daha fazla koç malloc ??). Bilgisayarlar daha hızlıdır ve tabii ki, dillerimizden daha fazlasını bekliyoruz. Ve açıkçası, muhtemelen yapmalıyız. Ancak, derleyici karma tablolar veya dizeler veya diğer çeşitli kavramlar oluşturmak için kolaylık için ödemek için büyük bir fiyat var. Bunlar, kullanıldığı platforma miras alınmayabilir. Bir dile dahil etmenin kolay olduğunu söylemek, sadece ayakta duracak bir bacağın olmayabileceğini söylüyor.

3- kimin suçu gerçekten?

Hatalar. Bilirsin. Böcekleri seviyorum. Neden hataları seviyorum. Çünkü bu işimi sürdüreceğim anlamına geliyor. Böcek olmadan, birçok kapalı pizza dükkanı olurdu. Ancak, kullanıcılar hatalardan nefret eder. Ama burada biraz soğuk su sıçraması var. Her hata olduğunu programcılar hatası. Dil değil. Bu kadar katı bir sözdizimine sahip bir dil, kaç hatanın üretilebileceğini önemli ölçüde azaltacaktır, tamamen işe yaramaz bir dil olacaktır. Yetenekleri muhtemelen bir yandan sayılabilir. Esneklik mi yoksa güç mü istiyorsun? Böceklerin var. Neden? Çünkü mükemmel değilsin ve hatalar yapıyorsun. C'de gerçekten tanımlanabilir bir örnek alın:

int a[10];
for (int idx = 0; idx < 15; idx++) a[idx] = 10;

Bunun ne yapacağını hepimiz biliyoruz. Ancak, belki bazılarımızın farkına varmadığımız şey, işlevselliğin çok faydalı olabileceğidir. Ne yaptığınıza bağlı olarak. Arabellek taşmaları bu işlevin maliyetidir. Yukarıdaki kod. Eğer bunu gerçekten halka açıklasaydım. Yine .. benimle söyle .. "Benim hatam". Bunu yapmama izin verdiğim için C değil.

2- Bunu geri dönüşüm kutusuna koymamalıyız?

Anlamadığımız bir dilde bir özelliğe işaret etmek çok kolay çünkü sık kullanmıyor ve aptal olarak adlandırıyoruz. Orada olduğu gibi şikayet edin. Goto hep beni eğlendirir. İnsanlar her zaman goto'nun bir dilde varlığından şikayet ediyorlar. Yine de bahse girerim ki son programınız bir tür goto içerir. Daha önce bir mola ya da devam ettiyseniz, bir goto kullandınız. İşte böyle. Verilmiş, "güvenli" bir goto, ama ne olduğunu. Goto'nun kullanımları var. Devam et veya kes gibi "örtük" goto'ların kullanılıp kullanılmadığı veya açık gotos (herhangi bir dil için gerçek "goto" anahtar kelimesini kullanarak). Dil geliştiricileri kusursuz değildir, ancak tipik olarak ... işlevsellik zamanın başlangıcından beri mevcutsa (o dil için). Muhtemelen bu yön, o dilin tanımlayıcı bir kalitesidir. Anlamı .. it ' kullanılan ve büyük olasılıkla geriye dönük uyumluluk nedeniyle takılmıyor. Bugün kullanılıyor. 5 dakika önce olduğu gibi. Ve düzgün kullanılır. Şey ... tartışmasız birisi de yanlış kullanıyor, ama bu benim listemde # 3 ile ilgili.

1. - Her şey bir nesnedir.

Tamam .. bu gerçekten # 2'nin bir altkümesi. Ancak bu, nefret listelerinde gördüğüm en rahatsız edici şikayet. Her şey bir nesne değildir. Ait olmayan veya nesne olması gereken pek çok kavram vardır. Eşyaları ait olmadıkları bir yere koymak sadece çirkindir ve bir programın verimliliğini düşürebilir. Elbette. Belki dile bağlı çok fazla değil. Bu ayrıca # 5 ile ilgilidir. Bu ... evet. Global iyi. Statik yöntemlere uygulandığı gibi fonksiyonlar iyi. OO programlamanın küresel işlevlerle birleştirilmesi sorun yaratmaz. Şimdi .. bu, hepimizin dışarı çıkıp kodumuzu nesne modellerinden "serbest bırakmamız gerektiği" anlamına gelmez. Bir kod bölümü veya tüm bir proje tasarlarken, perde arkasında neler olması gerekirbir araya getirirken dikkat edin. Sadece bu kavramın yaşadığı yer ve diğer pek çok faktör değil. Neden hiçbir işe yaramazsa global işlevleri sınıflar veya isim alanı kavramları içinde kapatalım? Statik üye değişkenleri alın. Bu beni çok eğlendiriyor çünkü .. iyi ... Tabii ki dile ve uygulamaya bağlı olarak, ama genel olarak konuşursak, sadece bir küresel ilan ettiniz. Evet, bu OO olmayan kavramları OO sarmalayıcılarına sarmanın bazı nedenleri vardır. Tabii ki kendi kendini belgeleyen kod. Bu mantıklı olabilir. Yani .. dediğim gibi. Dışarı çıkmayın ve kodunuzu "serbest bırakmayın". Ancak, iyi bir modern dilin OO modellemesi dışında küresel bir konsepti olacaktır. Evet, özellikle küresel bir konsepti olmayan bir OO programlama dilinin ciddi bir tasarım kusuruna sahip olduğunu belirtmek istiyorum. Yine de .. dilin niyetine ve tasarımına bağlıdır, bu yüzden belirli bir dili seçmeye çalışmıyorum ve burada analiz etmek için çok fazla şey var. Her halükarda, kodun nerede yaşayacağını ve en etkili olması gerektiğini düşünün. İşlev veya destek eklemeyen bir şeye bir sürü parlama eklemek klavyeyi daha hızlı yıpratır. Kimseye faydası yok. Şey ... Eğer muhtemelen size yanlış bir şekilde her şeyin bir nesne olduğunu öğreten kişiden kek puanları sevmiyorsanız.

Kısacası, programlama sadece dikkatsizce klavyeye dokunmakla kalmıyor. Herhangi bir proje için birçok tasarım düşüncesi vardır. Klişe olduğunu biliyorum, ama ona her açıdan bakmalısın. Günümüzde güvenli metinlerle bile. Sadece kodun dışına çıkmaz ve iyi çalışmasını beklemezsiniz. Elbette .. işe yarayabilir, ancak bu konuda doğru yol olmayabilir. Genel olarak, belirli bir iş VE çevre için en uygun dili ve formatı seçin. Fakat hiçbir dil onun arkasındaki düşünceyi ortadan kaldırmaz. Eğer düşünmüyorsanız .. sadece yazıyorsunuz.


19
Diller mükemmel değildir ve bir dil hakkında nefret ettiğiniz şeylerin bir listesini yaparsanız, bazı ilginç yorumlar ve fikirler alabilirsiniz. Birincisi, başkalarının size var olmadığını bilmediğiniz çözümler vermesini sağlar (mesajlara bakın, birkaç şeyin öğrenildiğini göreceksiniz). İkincisi, dil geliştiricileri için kullanıcı geri bildirimi oluşturur (kullanıcılarınız yazılımınızla ilgili en çok nefret ettikleri 5 şeyin bir listesini bulsaydı ilgilenmez miydiniz?) Ve üçüncü olarak, kusurları düşünmek ilginçtir araçları.
Sylverdrag

4
Eğer o seviyede görüntülerseniz sadece kırılma ve devam etme gotos değildir, fakat döngüler gotostur (koşul karşılandığında döngü başlangıcını atla), eğer giderse (koşul karşılanmazsa blok üzerinden atla, işlev çağırır) Gitmek (fonksiyonun başlangıcına atlamak ve daha sonra geri atlamak), ...
helyum

17
Kaynak koddan çalıştırılabilir dosyalar oluşturmak "faydası yok" mu? Ne?
detly

4
Perl, 80'lerin sonlarından beri bir Perl dosyasından yürütülebilir dosya oluşturabilir. Dağıtmak için bir şey yararlıdır. A) Perl'i kurmaya, b) programın bileşenlerini kurmaya, c) yolları ayarlamak ve hepsini yürütmek için bir komut dosyası yazabiliriz ... Evet, gerçekten işe yaramaz.
xcramps

1
Ancak, kaynaktan .exe dosyaları oluşturamazsanız, Windows kullanıcıları dosyayı çalıştıramaz. ;)
Evan Plaice

88

Java hakkında nefret ettiğim beş şey (şu anda benim en sevdiğim dil) belirli bir sırada yok.

  1. Java Generics'in hayranı olduğum kadar, tasarlanma şeklinden kaynaklanan birçok tuhaflık var. Bu nedenle, jeneriklerle ilgili sayısız sinir bozucu sınırlama vardır (bazıları tip silme işleminin sonucudur).
  2. Object.clone () ve Cloneable arayüzlerinin çalışma şekli tamamen bozulmuştur.
  3. Sun, yola çıkıp her şeyi bir nesne yapmak (a.la. SmallTalk) yerine, iki farklı veri türü kategorisi oluşturdu: Nesneler ve ilkeller. Sonuç olarak , temel veri türleri ve boks / kutudan çıkarma ve Koleksiyona ilkel yerleştirememe gibi garip meraklar için iki temsil var .
  4. Salıncak çok karmaşık. Beni yanlış anlamayın: Swing ile yapabileceğiniz birçok harika şey var, ancak aşırı mühendislik için harika bir örnek.
  5. Bu son şikayet aynı derecede Sun'ın ve Java için XML kitaplıkları yazanların hatasıdır. Java XML kitaplıkları çok karmaşıktır. Sadece bir XML dosyasında okumak için, sıklıkla hangi ayrıştırıcıyı kullandığım konusunda endişelenmem gerekir: DOM veya SAX? Her biri için API'ler aynı derecede kafa karıştırıcıdır. XML'i kolayca ayrıştırmak / yazmak için dilde yerel destek çok güzel olurdu.
  6. java.util.Tarih berbat. Sadece gereksiz bir şekilde karmaşık olmakla kalmaz, aynı zamanda tüm yararlı yöntemler onaylanmamıştır (ve karmaşıklığı artıran başkaları ile değiştirilmiştir).

32
Java.util.Date'i unuttun!
TM.

3
Ayrıca: "Klonlanabilir" arayüzde "clone ()" yöntemi yoktur. Bu, Klonlanabilir arayüzü bir Oksimoron yapar. Ve clone () bir Object döndürdüğünden, tip güvenliği pencereden çıkar (J2SE 5.0'da Generics eklendikten sonra bile bunu düzeltmek için hiçbir girişimde bulunulmaz).
Ryan Delucchi

2
Klonlanabilir olduğumuz sürece, Serializable "arabirimi" olarak da adlandırılabilir. Her kullandığımda kendimi bıçaklamak istiyorum.
wds

12
Bir dosyayı açmak ve ondan okumak gibi basit şeyler yapmak zor.
Eric Johnson

3
@Ryan clone () mutlaka "Object" i döndürmek zorunda değildir. J2SE 5.0 ile Java, kovaryant dönüş türlerini tanıttı, bu da bir temel sınıfın herhangi bir alt türünü döndürebileceğiniz anlamına gelir. Yani genel MyType klonu () mümkün!
helpermethod

73

Ruby'nin hızı ile ilgili birçok kusuru var, ama onlardan nefret etmiyorum. Ayrıca topluluk evanjelizminin üstesinden geldiği kusurları var, ama bu beni gerçekten rahatsız etmiyor. Nefret ediyorum:

  • Kapaklar (bloklar) 4 farklı oluşturma sözdizimine sahiptir ve hiçbiri optimum değildir. Zarif sözdizimi karma ve belirsiz ve tam sözdizimi çirkin.
  • Topluluk, 'kodu okumak' lehine gerçek belgelere karşı olma eğilimindedir. Bu çocukça ve tembel buluyorum.
  • Meta programlamanın kötüye kullanılması, özellikle kütüphanelerde, hataları izlemek bir kabus haline gelir.
  • İlgili bir notta, yaygın metaprogramlama, kapsamlı bir IDE'yi imkansız olmasa bile yapmayı zorlaştırmaktadır.
  • Fonksiyonlara geçmenin yolu aptalca. Blokların parametre listesinin dışına aktarılmasının veya erişim (verim) için garip özel sözdiziminin olması için hiçbir neden yoktur. Bloklara daha az belirsiz bir sözdizimi verilmesi gerektiği (veya hash'lerin farklı sınırlayıcılar kullanmış olabileceği; belki de {} yerine <>) olabileceği ve yöntem olarak parametre olarak geçirmenin diğer tüm parametreler gibi olması gerektiği görüşündeyim.

    object.method(1, {|a| a.bar}, "blah")
    

    Blok gibi bu tuhaflıklar geçen son parametre olmalı ve birden fazla bloğu geçmek daha uzun sözdizimi ile farklı, gerçekten beni rahatsız ediyor.


2
daha iyi olmasına rağmen alt optimal m17n & unicode desteği. 1.9 karmaşık kalır ...
Keltia

37
Metaprogramlama kötüye kullanımına "deyimsel yakut" denir :)
Slartibartfast

2
akway: Diğer iki sözdizimi lambda ve Proc.new .
Myrddin Emrys

2
Belgeleme olarak, bir zamanlar Pragmatic Programmers yayınevinde çalışan birinin, şirketin kurulduğu zaman Ruby kitabını istediklerini, çünkü mevcut olanın sadece Japonca olduğunu söylediklerini duydum. Yani bu kitabı şirketleri tarafından tercüme ettirebilir ve yayınlayabilirlerdi. Ama bunun yerine yaptıkları kaynak kodunu okuyacaklar :-) Ruby kitabı görünüşe göre Pragmatik Programcıları başlatan kitaplardan biriydi.
Arthur Reutenauer

13
Bunların 3'ünün dilin kendisi ile değil, insanlarla ilgisi olması ilginç buluyorum. Ruby en az nefret ettiğim dil olmaya devam ediyor.
Toby Hede

72

Perl

  • İşaretlerin karışık kullanımı

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = $array[0]; # not @array[0], you would get the length instead
    my $four = $array->[0]; # definitely not $array[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = @$array[1,2]; # coerce to array first
    
    my $length_a = @array;
    my $length_s = @$array;
    
    my $ref_a = \@array;
    my $ref_s = $array;
    
    • Örneğin , bunların hiçbiri aynı değildir:

      $array[0]   # First element of @array
      @array[0]   # Slice of only the First element of @array
      %array[0]   # Syntax error
      $array->[0] # First element of an array referenced by $array
      @array->[0] # Deprecated first element of @array
      %array->[0] # Invalid reference
      $array{0}   # Element of %array referenced by string '0'
      @array{0}   # Slice of only one element of %array referenced by string '0'
      %array{0}   # Syntax error
      $array->{0} # Element of a hash referenced by $array
      @array->{0} # Invalid reference
      %array->{0} # Deprecated Element of %array referenced by string '0'
      

    Gelen Perl6o olduğu yazılı :

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = @array[0];
    my $four = $array[0]; # $array.[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = $array[1,2];
    
    my $length_a = @array.length;
    my $length_s = $array.length;
    
    my $ref_a = @array;
    my $ref_s = $array;
    
  • Gerçek OO eksikliği

    package my_object;
    # fake constructor
    sub new{ bless {}, $_[0] }
    # fake properties/attributes
    sub var_a{
      my $self = shift @_;
      $self->{'var_a'} = $_[0] if @_;
      $self->{'var_a'}
    }
    

    Gelen Perl6o olduğu yazılı :

    class Dog is Mammal {
        has $.name = "fido";
        has $.tail is rw;
        has @.legs;
        has $!brain;
        method doit ($a, $b, $c) { ... }
        ...
    }
    
  • Kötü tasarlanmış normal ifade özellikleri

    /(?=regexp)/;           # look ahead
    /(?<=fixed-regexp)/;    # look behind
    /(?!regexp)/;           # negative look ahead
    /(?<!fixed-regexp)/;    # negative look behind
    /(?>regexp)/;           # independent sub expression
    /(capture)/;            # simple capture
    /(?:don't capture)/;    # non-capturing group
    /(?<name>regexp)/;      # named capture
    /[A-Z]/;                # character class
    /[^A-Z]/;               # inverted character class
    # '-' would have to be the first or last element in
    # the character class to include it in the match
    # without escaping it
    /(?(condition)yes-regexp)/;
    /(?(condition)yes-regexp|no-regexp)/;
    /\b\s*\b/;              # almost matches Perl6's <ws>
    /(?{ print "hi\n" })/;  # run perl code
    

    Gelen Perl6o olduğu yazılı :

    / <?before pattern>  /;   # lookahead
    / <?after pattern>   /;   # lookbehind
    / regexp :: pattern  /;   # backtracking control
    / ( capture )        /;   # simple capture
    / $<name>=[ regexp ] /;   # named capture
    / [ don't capture ]  /;   # non-capturing group
    / <[A..Z]>           /;   # character class
    / <-[A..Z]>          /;   # inverted character class
    # you don't generally use '.' in a character class anyway
    / <ws>               /;   # Smart whitespace match
    / { say 'hi' }       /;   # run perl code
    
  • Çoklu gönderim eksikliği

    sub f(   int $i ){ ... }  # err
    sub f( float $i ){ ... }  # err
    sub f($){ ... } # occasionally useful
    

    Gelen Perl6o olduğu yazılı :

    multi sub f( int $i ){ ... }
    multi sub f( num $i ){ ... }
    multi sub f( $i where $i == 0 ){ ... }
    multi sub f(     $i ){ ... } # everything else
    
  • Kötü Operatör aşırı yüklenmesi

    package my_object;
    use overload
      '+' => \&add,
      ...
    ;
    

    Gelen Perl6o olduğu yazılı :

    multi sub infix:<+> (Us $us, Them $them) |
                        (Them $them, Us $us) { ... }
    

5
Gerçek OO eksikliğini sizin yaptığınız kadar kötü görmüyorum. Bazen, özellikle kullandığınız CPAN modülü ihtiyacınız olanı ortaya çıkarmayı düşünmediğinde bir kurtarıcıdır. Ve çoklu sevkiyat eksikliği daha kötü olabilir: perl güçlü bir şekilde yazılmış olabilir ;-)
Tanktalus

3
Perl'in güçlü bir şekilde yazılmamasını seviyorum, ancak bazı tür bilgileri eklemek yararlı olacaktır.
Brad Gilbert

13
En sevdiğiniz olmayan bir dili eleştirmeyi seçmişsiniz gibi görünüyor (perl6'yı eleştirmiş olmalısınız)
Frew Schmidt

5
Perl 6 ile karşılaştırmanın anlamı nedir? Perl 6'nın sorunlarınızı çözmesini veya devam ettirmesini öneriyor musunuz?
Robert P


57

Ben yapacağım PHP Ben zamanlarda hoşuna olarak ve Python çok fazla yapmaktan yolu olacak.

  • Ad alanı yok; her şey daha büyük ortamlarda cehennem olan çok büyük bir isim alanında

  • Fonksiyonlar söz konusu olduğunda standartların olmaması: dizi fonksiyonları ilk argüman olarak bir iğne alır, ikinci olarak samanlık alır (bkz. Array_search ). Dize işlevleri genellikle önce samanlığı alır, daha sonra iğne (bkz. Strpos ). Diğer işlevler yalnızca farklı adlandırma şemaları kullanır: bin2hex , strtolower , cal_to_jd

    Bazı işlevler normal olanın dışında garip dönüş değerlerine sahiptir: PHP, boş bir diziyi tür hokkabazlığıyla verimli bir şekilde yanlış olarak yorumlayabilirken, sizi başka bir yerden bildirilen üçüncü bir değişkene sahip olmaya zorlar. Aynı işi yapan başka hiçbir fonksiyon yok.

    $var = preg_match_all('/regexp/', $str, $ret);
    echo $var; //outputs the number of matches 
    print_r($ret); //outputs the matches as an array
    
  • Dil (PHP6'ya kadar), neredeyse geciktirilmiş bir geriye dönük uyumluluğa saygı göstermek için elinden gelenin en iyisini yapar, bu da gerekli olmadığında kötü uygulamalar ve işlevler taşır (bkz. Mysql_escape_string'e karşı mysql_real_escape_string ).

  • Dil, cazip bir dilden tam bir arka uca dönüştü. Bu, herhangi birisinin istediği zaman çıktı alabileceği ve kötüye kullanıldığı anlamına gelir. Şablon bir dil için şablon motorlarla sonuçlanırsınız ...

  • Dosyaları içe aktarmada berbat. Bunu yapmak için 4 farklı yolunuz var (include, include_once, requir, requir_once), hepsi yavaş, çok yavaş. Aslında tüm dil yavaştır. En azından, topladığımdan python (hatta bir çerçeve ile) ve RoR'den oldukça yavaş.

Yine de PHP'yi seviyorum. Bu web geliştirme motorlu testere: küçük ve orta ölçekli bir sitenin gerçekten hızlı bir şekilde yapılmasını ve herhangi birinin bunu barındırabileceğinden emin olmanız gerekir (yapılandırmalar farklı olabilir)? PHP tam orada ve her yerde tam bir LAMP veya WAMP yığını yüklemek sadece 5 dakika sürüyor. Şimdi Python ile çalışmaya geri dönüyorum ...


4
Sanırım nokta 1 5.3'te uygulanmaktadır :) Param sıralama daha iyi olurken adlandırma hala kötü. Gerçi geriye dönük uyumluluğa katılıyorum.
Ross

4
# 4'ü sevmeliyim. Bu beni de en çok rahatsız eden şeylerden biri.
Franz

1
Hız argümanı oldukça öznel. Hız, kodun dilin kendisine göre ne kadar verimli olduğuna bağlıdır. Kötü PHP kodu muhtemelen yüksek kaliteli python kodundan daha yavaştır, ancak iyi PHP de kötü Python'dan daha iyi performans gösterebilir.
selfawaresoup

17
no_really_now_mysql_escape_the_string_im_serious ()
Salaryman

2
ad alanları. PHP dünya çapında web üzerinde, bu yüzden her şey küresel olmalı
Evan Plaice

50

İşte Java hakkında sevmediğim bazı şeyler (bu benim en sevdiğim dil değil):

  • Jenerik tip silme (yani birleşik jenerik yok)
  • Tek bir yakalama bloğunda birden fazla istisna (farklı türde) yakalayamama
  • Yıkıcıların eksikliği (finalize () çok zayıf bir ikame edicidir)
  • Kapanışlara veya işlevlerin veri olarak ele alınmasına destek yok (anonim iç sınıflar çok ayrıntılı bir alternatiftir)
  • Genel olarak kontrol edilen istisnalar veya daha spesifik olarak, kurtarılamayan istisnaları kontrol ettirme (örn. SQLException)
  • Değişmez koleksiyonlar için dil düzeyinde destek yok
  • Genel sınıf kurucuları çağrıldığında hiçbir tür çıkarım yok, yani tür parametreleri '=' ifadesinin her iki tarafında da tekrarlanmalıdır.

1
@Svish - Bence mesele, bu yapıyı yalnızca ne tür bir İstisna ile uğraştığınız umurumda değilken kullanmanızdır. Başka bir deyişle, hepsini aynı şekilde ele almak istediğinizde
Dónal

3
Dilin bir GC'si ve her sürümde daha iyi ve daha iyi olan bir GC'si olduğunda yıkıcı eksikliğini kusur olarak adlandırmam. Yıkıcılar java 1.1.8'de kaçırıldı, ancak jc 6'da çok gelişmiş olduğu için java 6'da kaçırılmadı.
Mike Reedell

7
C #, birden çok özel durumu yakalamak dışında bunların hepsini düzeltir. Jenerikler bir araya getirilir, yıkıcılar / IDisposable kullanılarak değiştirilir, anon yöntemleri ve lambdalarla kapatmalar uygulanır, istisnalar işaretlenmez, toplama değişmezleri vardır ve inşa edilen türü iki kez belirtmekten kaçınmak için 'var' vardır.
Daniel Earwicker,

1
Java kesinlikle kapanıyor. Anonim bir iç sınıf, kapsamındaki yerel son değişkenleri kapatır. Ben anonim iç sınıflar anonim fonksiyonlar için uygun bir yerine olmadıklarını kabul ederler, fakat olan kapanışları.
Adam Jaskiewicz

2
Anon iç sınıfları KAPALI DEĞİLDİR: "sum + = current.amount ()" gibi bir şeyle ziyaretçi geri araması oluşturmayı deneyin; burada "sum", kapsam dahilindeki son olmayan bir değişkendir. Yakın, ama puro yok.
Roboprog

40

C ++

  1. Şablon Sözdizimi
  2. Elmas Kalıtım sorunları
  3. Modern dillerin sahip olduğu standart kütüphanelerin bolluğu / eksikliği (destek olsa da).
  4. IOStreams
  5. IOStreams çevresinde kullanılan sözdizimi

piton

  1. Alanlar anlamlıdır (bazen)
  2. altı çizili anahtar kelimeler
  3. Sınırlı iplik desteği (en azından şu anda)
  4. "this" yerine "self"
  5. Alanlar anlamlıdır (bazen)

80
"Benlik" i gerçekten "istediğiniz" olarak tanımlayabilirsiniz (başkalarının izlemesi zor olsa da). "Self" bir anahtar kelime değildir ve değişkene istediğiniz her şeyi adlandırabilirsiniz.
mipadi

36
işte gidiyorsunuz, aslında Python'daki boşlukların (özellikle girinti) anlamını en büyük artılarından biri olarak listeliyorum ...;)
Oliver Giesen

22
"boşluk anlamlı" python en iyi özelliklerinden biridir !! ps " gelecekteki ithalat parantez gelen" bir yorumlayıcıda çalıştırmak deneyin
hasen

4
İplik desteği hariç hemen hemen tüm python listenize katılmıyorum. Boşluk anlamlı değil, girinti anlamlı; büyük bir fark var.
Christian Oudard

3
Vay. Kimse boşlukları / sekmeleri özel karakter olarak vurgulayan / gösteren bir metin editörü icat etmiş gibidir (Ne, not defterinde kod yazıyorsunuz?). Ayrıca, sekmeleri boşluklara genişletirseniz, lütfen ateşte ölün.
Sahte Ad

37

Objective-C

1) İsim alanı yok, sadece manuel adlandırma kuralları - Sınıf ayrımı açısından bunu umursamıyorum, ancak tüm sınıf tanımlarını bir ad alanındaki tek bir satırda (import com.me.somelibrary gibi) içe aktaramam. *).

2) Kütüphanelerin RegEx desteği gibi önemli alanlarda hala bazı delikleri vardır.

3) Özellik sözdizimi, bir özelliği bildirmek için üç satır (iki ayrı dosyada) gerektiren biraz beceriksizdir.

4) Tut / bırak modelini seviyorum, ancak bir referans yayınlamak ve daha sonra yanlışlıkla onu kullanmaktan daha kolay.

5) Gerçekten bir dil özelliği olmasa da, Xcode Objective-C kullanımı ile çok iç içe geçmiştir. Daha çok, istediğiniz bir şeyi bulmanız için sizi ödüllendiren ve daha sonra onu bir seçenek olarak sunan bir sistem gibidir. Ama sanırım otomatik tamamlama motorlarını hiç sevmedim.


2
İsim alanlarını kabul edin, sınıfları harf kodlarıyla önekleme aptal. Ve gerçek sınıf değişkenleri için eksik destek eklerdim, onları dosya statikleriyle taklit etmekten hoşlanmam.
zoul

2
Amaç-C özellikleri. Ciddi, şok edici, özellikle C # onları ne kadar iyi görmek hype anlayamıyorum.
Justicle

6
Aslında Lisp ve ObjC'nin bu yönünü gerçekten sevdim - Emacs veya XCode gibi iyi brace eşleşmesine sahip bir editöre ihtiyacınız var. Genellikle herhangi bir şey yazmadan önce çiftler halinde parantez yazıyorum, bu yüzden gerçekten eşleştirme ile ilgili sorunlara girmiyorum ... ve XCode da herhangi bir küme ayracı üzerine çift tıklayarak bir küme ayracı tarafından çevrelenen bölgeyi vurgulayabilir.
Kendall Helmstetter Gelner

1
@Chris S: Booleans YES/NOiçin kötü bir şey mi diyorsun ? Ve daha da önemlisi, Adlandırılmış Parametrelerin kötü bir şey olduğunu mu söylüyorsunuz? Bools anlayabiliyorum, ancak adlandırılan params muhtemelen ObjC'nin en iyi özelliklerinden biridir (okunabilirlik açısından).
jbrennan

3
Belki ben bir mazoşistim ama ön ekli sınıf isimlerini seviyorum. Google ve dokümantasyon aramalarını netleştirir, sınıf NSString olarak adlandırılırsa ne tür bir dize kullandığınız konusunda hiçbir karışıklık olmaz.
kubi

36

C ++

  • Teller.
    Platform dizeleriyle birlikte çalışamazlar, bu nedenle std :: vector süresinin yarısını kullanırsınız. Kopyalama politikası (yazma veya derin kopyada kopyalama) tanımlanmadığından, açık sözdizimi için performans garantileri verilemez. Bazen kullanımı çok sezgisel olmayan STL algoritmalarına güvenirler. Maalesef çok fazla kütüphane, maalesef kullanımı daha rahat. Bunları birleştirmeniz gerekmedikçe.

  • Dize temsillerinin çeşitliliği
    Şimdi, bu biraz bir platform problemi - ama yine de daha az inatçı bir standart dize sınıfı daha önce mevcut olsaydı daha iyi olurdu umuyoruz. Sık kullandığım aşağıdaki dize gösterimleri:

    • genel LPCTSTR,
    • CoTaskMemAlloc tarafından tahsis edilen LPC (W) STR,
    • BSTR, _bstr _t
    • (A) dizi,
    • CString,
    • std :: vector
    • bilinen uzunluktaki bir (w) karakter * arabelleğine aralık denetimi ve temel işlemler ekleyen bir roll-my-class ( iç çekme )
  • Model oluşturun.
    Kim-içerir-ne, ileri bildirimler, önceden derlenmiş üstbilgileri optimize ve en azından artımlı inşa süreleri katlanılabilir, vb tutmak için içerir karıştırarak harcanan her zaman ölümüne hasta. Seksenli harikaydı, ama şimdi? Bir kod parçasını paketlemek için çok fazla engel var, bu yüzden annelerin köpeği bile beni dinlerken sıkılıyor.

  • Ayrıştırılması zor
    Bu, harici araçları özellikle yazmayı ve düzeltmeyi zorlaştırır. Ve bugün, biz C ++ adamlar çoğunlukla takım zincirinde eksik. C # yansımamı ve delegelerimi seviyorum ama onlarsız yaşayabilirim. Yeniden düzenleme olmadan yapamam.

  • Diş açmak çok zor
    Dil bunu (şimdiye kadar) bile tanımıyor ve derleyicinin özgürlükleri - harika olsa da - acı verici.

  • Statik ve isteğe bağlı başlatma Teknik olarak, burada hile yapıyorum: "yeniden kullanmak için kodları sarın" daki başka bir bulmaca parçası: Sadece gerektiğinde başlatılan bir şeyin kabusu. Diğer tüm redist sorunlara en iyi çözüm, her şeyi başlıklara atmaktır, bu sorun "neeener - yapamazsınız" diyor.


Kabul edilirse, bunların çoğu katı dil kapsamının ötesindedir, ancak IMO'nun tüm araç zincirinin yargılanması ve gelişmesi gerekir.


STL'deki belgelere bakmak, grafik kartını sıfırdan nasıl oluşturacağınıza dair kılavuzlar aramak gibidir.
aviraldg

Açıkçası, bu noktaların çoğu C ++ 'ı düzgün bir şekilde öğrenmek için hiç rahatsız etmediğiniz gibi geliyor ... Bu, içerme korumaları her C ++ programcısının bilmesi gereken bir şey olduğu için # 3'te oldukça belirginleşiyor . Nokta # 1'i nasıl anlayacağımdan emin değilim, kafanız mı karıştı std::string? belki de iyi bir dokümantasyon ve / veya öğretici okumak std::vector(ve neden std::stringhiç tasarlanmadığı yerlerde kullanmamanız gerektiği ) bunu sizin için temizleyebilir.

@nebukadnezzar: Meyers'ın STL üzerinde aydınlandığını gördüm, ancak temel sorunları çözmedi. Açıkçası, bu hiç bir zaman büyük bir projeyi sürdürmek zorunda olmadığınız gibi, düzinelerce derinlik içeren bir hiyerarşide dairesel bir bağımlılık avlamak zorunda kalmadınız. Muhafızları da dahil biliyorum, ama neden onlarla uğraşmak zorundayız? BTW. her sorunu çözmezler. std::stringEğer yarısını kullanamıyorsam nasıl "standart" olur ? (C ++ 0x en azından bunu düzeltir, ancak hala farklı dize gösterimleri kullanan düzinelerce kitaplık ile sıkışıp kaldım).
peterchen

but why do we have to bother with them (inclusion guards)- çünkü C ++ modül içermez. How "standard" is a std::string if I can't use it half of the time?- Bence bu senin kullanma şekline bağlı std::string. Dize sınıfı olarak dize verilere erişmesine olanak tanır const char*aracılığıyla std::string::c_strzaten yapar, std::stringayrıca aldığı her sınıf / işlevi ile mükemmel uyumlu const char*argümanlar.

çünkü C ++ modüllere sahip değil - tam olarak şikayetim: yapı modeli antika (modüllerden başka herhangi bir çözümü de kabul ediyorum). ----- mükemmel uyumlu - ama diğer birçok senaryo ile mükemmel uyumsuz (C ++ 0x sabitleme bu burada bir nokta var diyor diyor.) Eğer std :: string yeterince yaygın olsaydı mutlu olurdu 10 yıl önce dize sınıfı olarak kabul edildi, ama değildi - diğer şikayet.
peterchen

35

JavaScript :

  • ObjectPrototip değiştirilebilir. Programınızdaki her nesne yeni özellikler kazanır ve muhtemelen bir şey kırılır.

  • Tüm nesneler karma haritalardır, ancak bunları güvenli bir şekilde kullanmak zordur. Özellikle, anahtarlarınızdan biri olursa __proto__, başınız belada demektir.

  • İşlev referans zamanında nesne kapanması yok. Aslında, hiçbir nesne kapatma - bunun yerine, thisnesne gösterimi veya newişleç ile bir işlev çağrıldığında ayarlanmaz . Özellikle olay geri çağrıları oluştururken çok karışıklık yaratır, çünkü thisprogramcının beklediği gibi ayarlanmamıştır.

    • Sonuç: nesne işareti veya işleç olmadan bir işlev çağrıldığında , genel nesneye eşit olarak ayarlanır ve çok fazla kopma olur.newthis
  • Ekleme operatörü, iki işlem temelde farklı olmasına rağmen, dize birleştirmesini gerçekleştirmek için aşırı yüklendi. Bir sayı olmasını beklediğiniz bir değer aslında bir dize olduğunda acıyla sonuçlanır.

  • ==ve !=operatörler tip baskısı yaparlar. Farklı türler arasındaki karşılaştırmalar, hiçbir faninin tam olarak hatırlayamadığı bir kurallar listesi içerir. Bu, operatörler ===ve !==operatörler tarafından hafifletilir .

  • Hem nullve undefinedkurnazca farklı, ama gereksiz anlamlarla, mevcuttur. Neden?

  • Prototip zincirleri oluşturmak için garip sözdizimi.

  • parseInt(s)C stili bir sayı bekler, bu nedenle baştaki sıfırları sekizlik, vb. olarak ele alır. En azından yapabilirsiniz, parseInt(s, 10)ancak varsayılan davranış kafa karıştırıcıdır.

  • Blok kapsamı yok.

  • Aynı değişkeni bir kereden fazla bildirebilir.

  • Bir değişkeni bildirmeden kullanabilir, bu durumda küreseldir ve muhtemelen programınızı bozar.

  • with { }.

  • JavaDoc benzeri araçlarla belgelenmesi gerçekten zor.


3
İçin nullve undefined: bazen gerçekten değişken bir değer atanmış veya değil olup olmadığını bilmek istiyorum. Null bir değer olduğundan, tanımlanmanın tek yolu tanımsızdır. Verilmiş, bunu yararlı bulduğum tek zaman alıcı / ayarlayıcı işlevleri oluşturmaktı.
Zach

1
"anahtarlarınızdan biri proto ise " - özel bir anlamı olan ayrılmış bir kelimedir. fordeğişken adı olarak kullanamayacağınızdan şikayet etmek gibi .
nickf

5
@nickf: Bir karma işleminin anahtarı bir dizedir. Dizeler, ayrılmış kelimeler de dahil olmak üzere herhangi bir değere sahip olabilir. Değer "for", özellikle bir karma anahtarı olarak geçerlidir. __proto__ayrılmış bir sözcük değil. Karma anahtar olarak kullanıldığında beklendiği gibi çalışmayan özel dize değerleri, ilişkilendirilebilir dizilerin herhangi bir dilde nasıl çalıştığı konusunda makul beklentileri ihlal eder. Ayrıca EcmaScript spesifikasyonunu da ihlal ediyorlar.
Daniel Cassidy

2
Thomas: Newline her zaman bir ifadeyi bitirmez. Bu nedenle, mantıklı kodlayıcılar, kodu daha açık hale getirmek için her ifadeyi noktalı virgülle sonlandırır.
Daniel Cassidy

2
newline may or may not end a statement depending on contextbenim en iyi 5 listemden biri
reinierpost

34

Python:

  • Statik yazım eksikliği
  • Varsayılan bağımsız değişken işleme (özellikle gelecekteki arayanlar için varsayılan bağımsız değişkeni değiştirebilmeniz !)
  • Çok fazla gerekli alt çizgi (yapıcılar çağrılmalıdır __init__)
  • Uygun özel üyelerin ve işlevlerin eksikliği (konvansiyon sadece alt çizgiyle başlayan çoğu şeyin özel olduğunu söylüyor, bunun dışındaki tüm şeyler hariç __getattr__)
  • printBir dosyaya girmenin komik sözdizimi (ancak Python 3'te düzeltiyorlar)

10
İstediğim statik türleri kullanma seçeneği .
Greg Hewgill

4
BTW: init gerçekten yapıcı değil, nesne zaten oraya girdiğinizde yaratıldı (tahmin et benliğin ne olduğunu ...). Oluşturucu, somutlaştırılacak sınıfa erişebileceğiniz acutally yenidir .
André

90
Statik yazmayı tercih ediyorsanız, neden Python favori dilinizdir?
finnw

9
finnw: Statik yazım, bazı programlar için mükemmeldir ve diğer türler için gerçekten gerekli değildir. Genellikle statik yazım eksikliğine aldırmıyorum, ancak ihtiyacınız olduğunda , en azından seçeneğe sahip olmak gerçekten güzel.
Greg Hewgill

8
Statik yazım eksikliğinin işlevsellik eksik değil, bir özellik olduğunu söyleyebilirim ...
17'de arnorhs

32

C #

  • Keşke switch()herhangi bir tipte caseolabilseydim ve bu herhangi bir ifade olabilir.

  • Nesne başlatıcı sözdizimini 'salt okunur' alanlar / otomatiktoplar ile kullanamazsınız private set. Genel olarak, değişmez türler yapmak için dil yardımı istiyorum.

  • Kullanımı {}için ad ve sınıfın ve yöntemin ve mülk / dizin blokları ve çoklu deyim blokları ve dizi başlatıcıları . Uzakta veya yanlış eşleştiğinde nerede olduğunuzu bulmanızı zorlaştırır.

  • Yazmaktan nefret ediyorum (from x in y ... select).Z(). Sorgu sözdizimi bir şey eksik olduğundan yöntem çağrı sözdizimi için geri düşmek istemiyorum.

  • doSorgu sözdizimi gibi bir cümle istiyorum foreach. Ama o zaman gerçekten bir sorgu değil.

Gerçekten buraya geliyorum. Bence C # fantastik ve kırık olan çok şey bulmak zor.


14
Herhangi bir tipte geçiş için +1
o

Şimdiye kadar hiç düşünmediğim geçiş sorunları için +1 ve {} sorunları
Maslow

Nefret ediyorum {}. Çok fazla benziyorlar (). Uyumsuzluk benim için hiç bir zaman sorun olmamıştı çünkü temelde tek katmanlı olmadıkça onları her zaman aynı seviyeye koydum.
Loren Pechtel

2
Linq sorgusu için +1. Özellikle sadece bir nesnenin geri gönderilmesini istediğinizde İlk önce () yerine neden (x in y'den üst 1'i seçin) veya gerçek sql sözdizimine daha yakın olacak bir şey olmasın.
AdmSteck

dilerseniz () herhangi bir tür üzerinde () geçiş yapabilirsiniz ve bu durumda herhangi bir ifade olabilir F # desen eşleme kontrol edin. c-sharpcorner.com/UploadFile/mgold/…
gradbot

26

PHP

  1. Sunucuyu kontrol etmezseniz hata ayıklama özelliği yok ve hatta o zaman onlar emmek
  2. Aşırı miktarda kötü PHP kodu etrafında yüzen tüm PHP programcılarına kötü bir isim verir
  3. Tutarsız işlev adlandırma
  4. İstersem statik yazılan değişkene sahip olamama (Zamanın% 90'ını yazarken dinamik bir hayranıyım)
  5. REGISTER_GLOBALS şeytandır

25
REGISTER_GLOBALS bir kez köpeğimi yedi :(
Pim Jager

2
1: xdebug ve MacGDBp gibi bir GUI istemcisi öneririm. Bu gerçekten acıyı hafifletiyor ... Diğer noktalara katılıyorum.
Jonas Due Vesterheden

5
# 2: Tanrım, beni buna başlama. Kendimi bir PHP geliştiricisi olarak sadece birçok insanın PHP ile yarattığı karışıklığı görmüş insanlara karşı savunmak zorundayım.
selfawaresoup

1
# 2 için +1 Kendimi bir PHP geliştiricisi olarak savunmak için çok fazla zaman harcadım.
UnkwnTech

# 2 için +1 - kötü maaş da sonuçları :(
Shiki

25

C (Tamam, bu benim favorim değil, ama henüz yapılmadı.)

  • Soket kütüphanesi sözdizimi.
  • Fonksiyon aşırı yüklenmesi yok.
  • C tarzı dizeler.
  • Arabellek aşıldı.
  • Şifreli sözdizimi. Kaç kez atoi gibi şeylere baktığımı bilmiyorum, alnımı tokatladı ve "Elbette!" Diye bağırdı.

DÜZENLEME: Daha fazla kütüphane koduna başvurduğumda (soketlerle yaptığım gibi, ancak bunlar özellikle kötü) daha fazla gelebilirim, ama zaten C'yi seçmek için hile yaptığımı hissettim. C'nin iyi kısımlarını ve kötü olanın yerine, ölü bir atı yenmek gibi bir şey olduğunu.


22
Hangi soket sözdizimi? C'nin soket kavramı yoktur.
Ferruccio

3
Oh, hadi! Beş tane ile gelebilirsin. İşaretçi aritmetiği sadece emmek değil mi? :)
brian d foy

8
+1 "C tarzı iplere" güldüm. Ve @brain_d_foy: işaretçi aritmetiği yalnızca anlamadığınızda berbat.
Chris Lutz

1
@Chris Luts: Düz C'yi öğrenirken bile (C ++ veya başka bir OO dilini bilmeden önce) char dizileri hakkında yanlış bir şey olduğunu biliyordum. :)
Kertenkele Bill

2
pointer aritmetik bir elektrikli testere - çok verimli, ama tüm bacağınızı alma riski
Thorbjørn Ravn Andersen

24

Ortak Lisp:

  1. Anahtar kelimeler genellikle çok gariptir.
  2. Kütüphane desteği zavallı.
  3. Belleği daha sıkı işlemek isteyen işletim sistemlerinde iyi çalışmaz.
  4. İşletim sistemi ile etkileşime girmek için iyi imkanlara sahip değildir.
  5. "Döngü" tesisi iyi tanımlanmamıştır ve Lispy'a bakmaz.

2
'loop' lispy olmayabilir, ancak bu konuda kötü tanımlanmış olan nedir?
Daniel Cassidy

2
Standardı kendim okumadım, çoğunlukla Paul Graham'ın "On Lisp" sine gidiyorum. Standardın çoğunlukla örnek olduğunu ve köşe vakalarını iyi tanımlayamadığını söylüyor.
David Thornley

3
"Çok kötü sözler" anlamına mı geliyor?
GClaramunt

"Lispy" olmadığına katılıyorum, ancak CLtLv2 buna çok zaman harcıyor. Sadece çok fazla şey yapmak için tasarlandığını düşünüyorum. sunsite.univie.ac.at/textbooks/cltl/clm/…
Hans Van Slooten

"Döngü" ye ek olarak, "format" da Lisplike değildir. Lisp benim en sevdiğim dil olsa da "format" ve "loop" dan nefret ediyorum.
Paul Reiners

24

Brainf * ck

  • Kişisel vurgulamak Eğer olduğunuzdur tam Turing ?! Perl düzenli ifadelerinde daha fazlasını yapabilirim!

  • Nesne eksikliği. Hadi millet! O durum sanki merhaba ...

  • Ağ kütüphanesi yok. Tek istediğim bir web sayfasını kazımak, GOSH.

  • Birinci sınıf işlev yok. Tebrikler - Java arkadaşlarınızla iletişim kurabilirsiniz.

  • Depolama için sonsuz bir bant ve başka bir şey yok. Bu Lisp yazıyor olabileceğimiz kadar iddialı.


6
Ad alanı veya dinamik modül desteği yok. Bu temeller olmadan kimyasal tesis kontrol sistemlerini nasıl yazmamız beklenebilir?
Donal Fellows

> 10 (10 kez hareket edin), 0 (sıfır girin), +5 (5 ekleyin) gibi sözdizimsel şeker yok.
Squall

23

JavaScript

  1. sayıları dize olarak - Sayılar dize olarak yorumlandığında matematik sinir bozucu olabilir. 5 + 2 = 52 ° C? Grrr ...
  2. izinler - en iyi şeylerin tümü kullanıcının iznini gerektirir!
  3. ekran güncellemeleri - Ekranı güncellemek için tarayıcının sabit durumda olması gerekir. Ekranı bir komut dosyasının ortasında güncellenmeye zorlamanın bir yolu yok gibi görünüyor.
  4. Yavaş - Google'ın Chrome güzel olmasına rağmen ...
  5. Tarayıcı farklılıkları, dili kullanmayı [sansürlenmiş] yapar.

4
Dizge olarak sayılar kolayca sabitlenir. Bir dizeniz varsa, onu ayrıştırmanız gerekir (x, 10). Dev başarısızlık, 10'u terk ettiğinizde ve '017'yi OCTAL olarak yorumlar
Orion Edwards

3
false == 0 == [] == "" ancak null ve NaN değildir. NaN! = NaN. null == null.
Jimmy

7
typeof "bir dize" == "dize". typeof new String ("another string") == "object. new String ('a'). constructor ==" a ".constructor. typeof new Array () == 'object'
Jimmy

1
for (object in x) fonksiyonları döndürür
Jimmy

14
-1, bu liste dilin kendisi değil, çoğunlukla tarayıcı sorunları ile ilgilidir.
Mauricio Scheffer

20

PHP:

  • Biri neredeyse tüm yaygın uzantıların tüm web sunucularında bulunduğundan emin olamaz .
  • gelecekte her şey olmaya çalışır (git, kapanış, ...)
  • tecrübesiz kullanıcılar için birçok güvenlik riski
  • daha fazla operatör yüklemesi iyi olurdu
  • düzgün çalışmasını ve kötü bir isim vermeyi öğrenmeyen tüm fakir programcılar

Yine PHP (betik) dili. ;-)


Tamam, sadece bir şey kaldı!
brian d foy

4
Nokta 5 ile tamamen katılıyorum - bir Javascript listesinde de olurdu.
Steve Claridge

"Düzgün çalışmasını ve kötü bir isim vermeyi öğrenmeyen tüm fakir programcılara" katılmıyorum. Ben "çalışma zamanı dil yapılandırma seçenekleri üzerinde büyük tacked" ile değiştirmek istiyorum.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

18

VB6

  1. Yalnızca Windows.
  2. Artık desteklenmiyor.
  3. Diziler, tümü 0 olarak normalleştirilmek yerine herhangi bir sayıdan başlayabilir.
  4. derlenmiş uygulamalar düzgün çalışması için birçok dll's bağlıdır.
  5. Tarayıcı kontrolü veya karmaşık kod parçaları gibi birçok karmaşık denetim, derlenmemiş kodu çalıştırdığınızda IDE'yi kırma eğilimindedir, ancak derlendiğinde iyi çalışır.

13
VB birinin favori dili mi? O_o. Neden "diğer dillerle tamamen farklı ve uyumsuz" syntaz "ve" diğer dillerle ilgili kötü alışkanlıklar veriyor "?
Jonta

3
Aslında # 3 çok güçlü bir özellik buluyorum, bir hata değil - VB.NET'in bunu gerçekten sevmesini isterdim. AWK bir anlamda var, ama sonra AWK dizileri gerçekten kılık değiştirmiş hashesler :(
Joe Pineda

3
1 ve 4 ve .NET C #, bir TAM ÇERÇEVE ve İşletim Sistemi gerektirmez ??? (hey, ben mono bigot duyduğunuzu duydum ... bu hala sizin için "tam bir çerçeve" ve bir debian dist hiç yediklerinden şüpheliyim). 5 ile ilgili olarak, hiçbir sağ görüşlü VB6 programcısı (gün içinde geri) varsayılan "İstek Üzerine Derleme" seçeneğini AÇIK tuttu ...
jpinto3912

2
Hala vb6 ara sıra destek olmak zorunda. Pet pieves: bildirimde bir değişken başlatamaz, parametrelenmiş yapı yok, dosya başına bir sınıf, vb ... Bu sorunları düzeltirlerse, dil 10 yıl daha kolay devam edebilir.
AngryHacker

14
"On Error Resume Next" hakkında ne dersiniz? "Bu kod F ** KED'dir, ama yine de çalıştırmaya devam
edelim

18

Ruby benim en sevdiğim dil, işte sevmediğim şey:

  • Yeşil iş parçacıkları + engelleme C kitaplıkları = dev başarısız
  • ÇOK YAVAŞÇA YAVAŞ
  • Standart kütüphanenin kendisi patlama kullanımı ile tutarsız! yöntemleri
  • Modülü içerir + uzatmak dağınık.
  • "Açık Sınıflar" kapsam dışı olamaz - Bir String # dostuff eklemek istiyorum, ancak tüm üçüncü taraf kütüphanelerine sızmasını istemiyorum
  • İkili dağıtım paketleme çözümü yok.

3
Ruby 1.9.1'i denediniz mi? Ruby 1.8.6'ya kıyasla büyük bir hızlanma sunuyor
Christian Stade-Schuldt

Jrubyc'i deneyin. JVM JIT FTW!
KitsuneYMG 25:10

En yüksek puan alan Ruby cevabından 'nefretlerin' aksine, makul problemleri dahil etmek için +1.
Phrogz

17

Delphi:

  • IDE biraz kararsız.
  • Kod bilgileri bazen karışıktır.
  • Hata ayıklama bazen hatalıdır.
  • Birkaç proje dosyasının güncellenmesi hantal olabilir.
  • Bir veya daha fazla paket kullanılamadığında başlatılırsa, hata mesajı birkaç kez açılır.

5
Bütün bunlar dil Delphi (AKA Nesne Pascal) yerine IDE Delphi hakkında şikayetler gibi görünüyor
Dónal

11
Muhtemelen bunun nedeni Object Pascal'ın mükemmel olmasıdır ;-)
Mark Bessey

3
Partiye biraz geç kaldım, ama yine de burada gidiyor: - yöntem imzalarını iki kez yazmak zorunda (arayüz + uygulama) - Birim adı dosya adıyla aynı olması GEREKİR. O NE LAN?!?
Martijn

1
Başlangıcını buldum ... daha üstün olmak istiyor - {} 'dan çok daha net. Kodu okumaktan çok daha fazla zaman harcıyorsunuz. Bununla birlikte, bir yakınma için - bir durumda numaralandırılmış türlerin tanımlanmış alt aralıklarını, durumda tam olarak orada beyan ederseniz mükemmel yasal olsa da kullanamazsınız. Ayrıca, birimler arasında ileri referans yok.
Loren Pechtel

1
@AlexanderN: Hayır, hiç bu kadar canlı, popüler ve harika olmamıştı.
Andreas Rejbrand

16

JavaScript

  • Her komut dosyası tek bir global 'ad alanında' yürütülür ... farklı kaynaklardan komut dosyalarıyla çalışırken dikkat etmeniz gereken bir şey

  • Bir değişken kullanılır ancak önceden tanımlanmamışsa, global bir değişken olarak kabul edilir

  • Tarayıcı satıcıları istedikleri gibi standartlar oluşturuyor ve böyle güzel bir dili kullanan geliştiriciler için olması gerekenden daha zor kodlama yapıyor

  • Büyük / Küçük Harfe Duyarlılık - derleme zamanı denetimi ile js geliştirmek için iyi bir IDE bulunmadığı

  • hasOwnPropertyBazı basit işlemleri gerçekleştirmek için geçici çözümler ( yöntem kullanımı gibi ).


AFAIK, tarayıcı satıcıları tarafından JS diline (DOM değil) yönelik tüm uzantılar , standartlar süreci bunu başaramasa bile, en azından standart benimsenmeye itilmiştir. hasOwnProperty / geçici çözümler: çift ucu keskin kılıç. "Sadeliği" zorlamak için çok fazla güç ve esneklik kaybediyoruz. Bu şikayet beni hep sinirlendiriyor. Döngülerinizi doğru yazın (ve nesne üyelerinizi de kontrol edin)!
eyelidlessness

15

Haskell:

  1. Tembel değerlendirmeden boşluk sızıyor.
  2. Sayısal Hiyerarşi, matematiksel soyutlamalara göre oluşturulmamıştır.
  3. Sıkı monadik IO hata ayıklamayı zorlaştırabilir.
  4. Büyük uygulamalar, G / Ç'yi standartla pek uyumlu görünmeyen şekillerde işler. (Özellikle, karakterlerin çıktısı yalnızca düşük 8 bit verir ve daha sonra ikili I / O yapmak için bu varsayımı kullanan kod oluşturulur.)
  5. ($)Bazı ifadeleri daha güzel hale getirmek için operatörün ilişkilendirilebilirliği değiştirilebilir.

Bunların çoğu nefret düzeyine yükselmiyor ve bunların her biri için sağlam çözümler bulmaya veya inşa etmeye çalışan insanlar var.

Düzenleme: Nokta 5 hakkında bazı karışıklıklar oldu. Özellikle bazı insanlar ben değil argümanların sırası demek düşündüm. Ne demek istediğimi açıklamak yerine, insanları şu bağlantıyı göstereceğim: http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity , bunu iyi ifade ediyor.


3
Neden ($) 'nın ilişkisini değiştirmek istersiniz? 'fghx' parantezleri '((fg) h) x' ve 'f $ g $ h $ x' parantezlerini 'f (g (hx))' olarak ... ...
Erik Hesselink

1
Ben <3 Haskell. Standart kütüphane, vektör uzayları ve ark. Başlangıç, aynı zamanda ($) gibi fakat soldan sağa {source |> func1 |> filter func2 |> map (func3 10)} zincirlerini işleyen bir operatöre ihtiyaç duyar.
yfeldblum

10
Gerçekten kötü olanı kaçırdınız: Haskell programcılarının tek harfli değişken adları kullanma eğilimi.
Benjamin Confino

1
Sol çağrışımlı ($) operatörü, Haskell'de boşluk karakteriyle temsil edilen sadece işlev uygulamasıdır. @Justice: Kapak işlevini deneyin. (|>) = flip ($)
Apocalisp

1
Birisi # 5'in noktasını açıklayabilir mi? Doğru ilişkinin ($) bütün mesele olduğunu düşündüm.
Tim Matthews
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.