Herhangi bir programlama dilinde karşılaştığınız en büyük tasarım hatası nedir? [kapalı]


29

Tüm programlama dilleri tasarım kusurlarına sahiptir çünkü tek bir dil, çoğu (hepsi?) Diğer şeylerde olduğu gibi mükemmel olamaz. Bir kenara, bir programlama dilinde hangi tasarım hatası, bir programcı olarak geçmişiniz boyunca sizi en çok rahatsız etti?

Bir dil, sadece belirli bir şey için tasarlanmadığı için "kötü" ise, bir tasarım kusuru değil, tasarımın bir özelliği olduğunu unutmayın ; Bir dil tasarlandığı şey için uygun değilse, bu elbette tasarımdaki bir kusurdur. Uygulamaya özgü şeyler ve başlık altındaki şeyler de sayılmaz.


6
Birisi bu sorunun ne kadar yapıcı olduğunu sorgulamak istiyorsa, bunun dil tasarımcıları için yapıcı olduğunu unutmayın (kaçınılması gereken hatalar).
Anto


1
@greyfade: Gerçekten değil, bu gerçek dilin kusurları ile ilgili, bu bir dilin benimsenmesini azaltan şeylerle ilgili gibi görünüyor, ki bu standart bir standart kütüphane veya dil için sadece kötü bir web sitesi içerebilir. Bazı cevaplar örneğin kötü sözdizimi listeler, ancak bu belirli bir tasarım hatası değildir
Anto

8
Herhangi bir programlama dilinde en büyük hata? İnsanlar.
Joel Etherton

Bu cevaplar en büyük kusursa, programlama dillerinden gerçekten etkilendim.
Tom Hawtin -

Yanıtlar:


42

En büyük sıkıntılarımdan biri, switchkullanmayı unutursanız C'den türetilmiş dillerdeki davaların varsayılan olarak bir sonraki davaya düşmesidir break. Bunun çok düşük seviyeli kodda (örneğin, Duff's Device ) faydalı olduğunu biliyorum, ancak genellikle uygulama seviyesi kodu için uygun değildir ve yaygın bir kodlama hatası kaynağıdır.

1995 yılında, ilk kez Java'nın ayrıntılarını okuduğumda, switchifade hakkındaki kısma geldiğimde varsayılan düşme davranışını korudukları için çok hayal kırıklığına uğradığımı hatırlıyorum . Bu sadece başka bir isimle switchyüceltilir goto.


3
@Christopher Mahan: switchBu şekilde çalışmak zorunda değil. Örneğin, Ada'nın davası / when ifadesi (anahtar / davaya eşdeğerdir) düşme davranışına sahip değildir.
Greg Hewgill

2
@Greg: switch-C ile ilgili olmayan dillerdeki ifadelerin bu şekilde çalışması gerekmez. C tarzı kontrol akışını (kullanırsanız Ama {... }, for (i = 0; i < N; ++i), returnvs.), dil çıkarım insanlar bekliyoruz yapacaktır switchC gibi çalışmalarına, ve Ada / Pascal / TEMEL benzeri semantik karıştı olurdu insanlar vererek. C # gerektirir breakiçinde switch, aynı nedenle ifadeleri yapar rağmen daha az hata sessiz fallthrough karıĢırlar. (Ama fall;çirkin yerine yazabilmeyi diliyorum goto case.)
dan04

4
sonra anahtarı yazmayın, if () yazın. Şikâyet ettiğinizin nedeni, anahtarı daha iyi yapan şeydir: doğru / yanlış bir şartlı değil, sayısal bir şartlı ve bu onu farklı kılar. Yine de kendi geçiş fonksiyonunuzu da yazabilirsiniz.
Jokoon

9
-1 Düşmesine izin vermenin faydası olduğunu düşünüyorum, aptallıktan başka bir tehlikesi yok, ancak ek işlev veriyor.
Orbling, 0:25

11
Sorun, buna switch izin vermemektir. Bu, sonbaharın çoğu kullanımının kasıtlı olmadığıdır.
dan04,

41

C-türevlerinde =atama ve ==eşitlik testi kullanımından hiç hoşlanmam . Karışıklık ve hata potansiyeli çok yüksek. Ve beni ===Javascript'te başlatmaya bile gerek yok .

Daha iyisi, :=atama ve =eşitlik testi için olurdu . Anlambilim, bugünkü ile tam olarak aynı olabilirdi, burada atama aynı zamanda bir değer üreten bir ifadedir.


3
@Nemanja Trifunovic: Aslında bu öneriyi düşündüm, fakat C'de negatif bir sayıya (yani x<-5) kıyasla daha az kıyaslandığında talihsiz bir belirsizlik var . C programcıları bu tür gerekli boşluklara tahammül edemezler :)
Greg Hewgill

7
@Greg: Ben tercih ederim :=, ==çünkü unutmak çok kolay olurdu :ve =bugün unutmuş olsanız bile (halihazırda olduğu gibi) bildirilmemesi çok kolay olurdu . Bu konuda derleyici uyarıları için minnettarım ...
Matthieu M.

13
Kullandığım hemen hemen tüm klavyelerde ": =", yazarken shift tuşunu değiştirmeyi gerektirir. Şu an kullandığım birinde ':' büyük harf ve '=' küçük harf ve bunu tersine çevirdim. Çok fazla ödev yazıyorum ve bunlarda bu tür bir sıkıntıya gerek yok.
David Thornley

14
@David Thornley: Kod yazıldığından daha çok okunur . "Yazarak güçlük" hakkında herhangi bir argüman satın almıyorum.
Greg Hewgill

8
@Greg Hewgill: Elbette yazıldığından daha sık okunur. Ancak, aralarında sorun =ve ==okuma, çünkü onlar konum farklı semboller değil. Yazılı ve doğru olanı aldığınızdan emin olmak.
David Thornley

29

Seçimi +ikisi için JavaScript eklenmesi ve karakter dizisi birleştirme korkunç bir hataydı. Değerler yazılmamış olduğundan, bu +, her işlemcinin tam içeriğine bağlı olarak eklenip eklenmeyeceğini belirleyen Bizans kurallarına yol açar .

$Dize bitiştirme gibi tamamen yeni bir operatör tanıtmak başlangıçta kolay olurdu .


13
@Barry: Pek değil. +Güçlü bir şekilde yazılmış bir dilde bir dizi birleştirme işleci olarak çok anlam ifade eder. Sorun şu ki Javascript onu kullanıyor ama kesinlikle yazılmamış.
Mason Wheeler

13
@Mason: +bitiştirmenin bir anlamı yoktur, çünkü bitiştirme kesinlikle değişmeli değildir. Endişelendiğim kadar kötüye.
Matthieu M.

12
@ Matthieu: Umm ... neden önemli? Birleştirme değişmeli değildir (ekleme gibi), ancak iki dizenin eklenmesi saçmadır, bu yüzden kimse böyle düşünmez. Hiçbir şeyin olmadığı bir problem icat ediyorsun.
Mason Wheeler

4
sadece C ++ 'a geçin ve istediğiniz operatöre ezoterik aşırı yüklenmeye her türlü ekleyin
Newtopian

8
@ Matthieu: Değişkenlik burada sorun değil. JS'nin bir Matrix sınıfı olsaydı, bir *işleç sahibi olması için kötüye olduğunu düşünür müsün?
dan04

24

Javascript’i varsayılan olarak global olarak ana konuya, JSLint veya benzeri kullanmıyorsanız sık sık kaynaklara neden buluyorum.


2
Global olarak varsayılan? O zaman JS kullanmıyorum sevindim ...
Anto

5
Aslında çok hoş bir dil, içinde birkaç kötü tasarım seçeneği var. Bu en büyüğüdür, eğer bir değişkeni kapsamazsanız, onu global olarak kapsamalıdır. İyi bir şey, Doug Crockford'un Jslint programını kullanarak bu hatayı ve daha fazlasını yakalayabilmenizdir.
Zachary K,

1
Sadece varbir değişken ilan ettiğinizde ve kullanmanız iyi olduğunda kullanın . Bana yazmanın çok fazla olduğunu söyleme çünkü Java sizi bütün türleri iki kez ilan etmeye zorlar ve kimse bunun boktan bir tasarım seçimi olduğundan şikayet etmez.
davidk01

3
@ davidk01: İnsanlar bundan şikayet ediyor. Benzer şekilde, insanlar std::map<KEY, VALUE>::const_iteratorC ++ 'da değişkenleri autobu dile eklenecek kadar açıklamak zorunda olduklarından şikayet ettiler.
dan04,

1
"use strict"es5'e eklenmiş olan direktif, bildirilmemiş referansları bir hataya dönüştürür.
Sean McMillan

22

C ve C ++ 'daki önişlemci muazzam bir kirleticidir, elek gibi sızan soyutlamalar oluşturur, sıçanların #ifdefifade yuvaları aracılığıyla spagetti kodunu teşvik eder ALL_CAPSve sınırlamaları etrafında çalışmak için korkunç derecede okunamayan isimler gerektirir . Bu sorunların kökü, sözdizimsel veya anlamsal seviyeden ziyade metin düzeyinde işleyişidir. Çeşitli kullanım durumları için gerçek dil özellikleri ile değiştirilmiş olması gerekirdi. Bazı örnekler, kuşkusuz bunlardan bazıları C ++, C99 veya resmi olmayan ancak fiili standart uzantılarla çözülmüş olsa da :

  • #include Gerçek bir modül sistemi ile değiştirilmeliydi.

  • Satır içi işlevler ve şablonlar / jenerik, işlev çağrısı kullanım durumlarının çoğunun yerini alabilir.

  • Bu tür sabitleri bildirmek için bir çeşit tezahür / derleme zaman sabiti özelliği kullanılabilir. D'nin enum uzantıları burada harika çalışıyor.

  • Gerçek sözdizimi ağacı düzeyindeki makrolar çok çeşitli kullanım durumlarını çözebilir.

  • Dize karışımları , kod enjeksiyon kullanım durumu için kullanılabilir.

  • static ifveya versionifadeler şartlı derleme için kullanılabilir.


2
@ dsimcha: Konuya katılıyorum #include, ancak modül sistemi icat edildi ... sonra! C ve C ++ ise maksimum geriye dönük uyumluluk hedefliyor: /
Matthieu M.

@Matthieu: Evet, modül sistemleri şifrelerden sonra icat edildi, ama biz yine de burada rüzgardan bahsediyoruz.
dsimcha

3
Bunun çeşitli vücut kısımlarında büyük bir ağrı olduğuna katılıyorum, ancak çoklu geçiş tasarımının basitlik avantajı var: bir C derleyicisinin bir C kodunu başarıyla derlemeden önce işlemin bağlamı hakkında çok fazla bilgi sahibi olması gerekmiyor . Bu, yalnızca C dili içinde (örneğin C ++ benzeri sınıflar) varsayımsal bir modül sistemi kullanmanın maliyetlerinin her zaman mevcut cpp tabanlı #includesaldırıya göre daha düşük veya karşılaştırılabilir olduğunu gösterebiliyorsanız, bir tasarım hatası olarak nitelendirilebilir .
reinierpost 08:00

Katılıyorum. Ancak, bazı insanlar önişlemenin iyi bir şey olduğunu düşünüyor ve Java'da desteklenmediğinden şikayet ediyorlar.
Stephen C

5
@Stephen: Bir önişlemcili Java'nın, Java olmadan daha iyi olabileceğine katılıyorum, ancak yalnızca Java, önişlemciyi değiştirmek için gerekli olan "gerçek" özelliklerden birkaçına sahip olmadığı için. Bu gibi özellikleri içeren D gibi dillerde ve dinamik olarak diğer yollarla esneklik sağlayan Python'u bir bit bile kaçırmam.
dsimcha

21

Kişi yüzlerce dilde yüzlerce hatayı listeleyebilir, ancak IMO dil tasarımı açısından yararlı bir alıştırma değildir.

Niye ya?

Çünkü bir dilde yanlış olacak bir şey başka bir dilde hata olmaz. Örneğin:

  • C'yi yönetilen (yani toplanan çöpler) bir dil yapmak ya da ilkel türleri ayırmak kullanışlılığını yarı portatif düşük seviyeli bir dil olarak sınırlar.
  • Java'ya C tarzı bellek yönetimi eklemek (örneğin, performans endişelerini gidermek).

Orada olan tarihsel bağlam öğrenilecek dersler, ama dersler nadiren kesin vardır ve onları anlamaya teknik dengeler anlamalısın ... vb. (Örneğin, Java’nın jenerik teknolojisinin uygulanması, geriye dönük uyumluluğu korumak için geçersiz kılan bir iş gereksiniminin bir sonucudur .)

IMO, eğer yeni bir dil tasarlama konusunda ciddiysen, gerçekten geniş bir dil yelpazesi kullanmalısın (ve tarihsel dilleri çalışmalısın ...) ve hataların ne olduğuna karar vermelisin. Ve bu dillerin her birinin belirli bir ihtiyacı karşılamak için belirli bir tarihsel bağlamda tasarlandığını aklınızda bulundurmanız gerekir.

Genel olarak öğrenilecek dersler varsa “meta” seviyesindedirler:

  • Her amaç için ideal bir programlama dili tasarlayamazsınız.
  • Hata yapmaktan kaçınamazsınız ... özellikle de arka görüş alanlarına bakıldığında.
  • Pek çok hata dilinizi kullananlar için düzeltmek için çok acı verici.
  • Hedef kitlenizin geçmişini ve becerilerini göz önünde bulundurmalısınız; yani mevcut programcılar.
  • Herkesi memnun edemezsin.

9
-1 - programlama dilleri tasarım hedeflerini takip eder. Bu amaçlara karşı çalışan bir dilin özellikleri, diğer amaçlarından biri için gerekli bir uzlaşma olmadıkça, tasarımdaki kusurlardır. Herkesi memnun etmek amacıyla birçok dil yapılmamıştır, ancak tüm diller, en başta tatmin etmek için belirlediği insanları tatmin etmeye çalışmalıdır. Bu tür bir postmodernist politik doğruluk, dil araştırmalarını ve geliştirmelerini programlamak için oldukça etkileyicidir.
Rei Miyasaka

Demek istediğim tasarım amaçlarını göz önünde bulundurmadan dersleri öğrenmenin zor olduğu.
Stephen C

1
Bana öyle geliyor ki, OP soruyu ikinci paragrafta cevabınızı zaten oluşturuyordu.
Aidan Cully

20

C ve C ++ : yok Tüm bu tamsayı türleri ortalama şey.

Özellikle char. Metin mi yoksa küçük bir tamsayı mı? Metinse, "ANSI" bir karakter mi, yoksa UTF-8 kod birimi mi? Bir tam sayıysa imzalı mı yoksa imzasız mı?

int "yerel" boyutlu bir tamsayı olması gerekiyordu, ancak 64-bit sistemlerde öyle değil.

longbüyük olabilir veya olmayabilir int. Bir işaretçinin boyutu olabilir veya olmayabilir. Derleyici yazarlar için 32-bit veya 64-bit olsun, keyfi bir karardır.

Kesinlikle 1970'lerin bir dili. Unicode'dan önce. 64 bit bilgisayarlardan önce.


10
C, standart bir dile göre tasarlanmadı, bu nedenle bir tasarım hatası olamaz. Bir cpu özel montajcı kodu kaçınarak taşınabilir montajcı olarak modellemek için tasarlanmıştır. Ancak, Java ile düzeltildi.

7
Bence en büyük sorun, tarihin bize korkunç bir fikir olduğunu göstermesine rağmen, aynı anlamsız terimleri kullanmaya devam eden yeni diller olduğunu düşünüyorum. En azından C adamları hatalarını fark ettiler ve standart int türleri yarattılar.
Mark H

5
Bir karakter bir utf-8 birimi değildir. Bir utf-8 karakteri saklamak için 8 bitten fazla sürebilir. C 1970'lerin dili değil, şimdi bir proje için kullanıyorum (gönüllü olarak).
dan_waterworth

4
C, PDP-11 işlemcisinin üst düzey bir soyutlamasından biraz daha fazlasıdır. Örneğin, artış öncesi ve sonrası PDP-11 tarafından doğrudan desteklendi.
bit-twiddler

5
Bu korkunç derecede yanlış yönlendirilmiş bir cevap. İlk olarak, C ve C ++ birbiriyle değiştirilemez. İkinci olarak, dil belirtimi açıkça bir karakterin ne olduğunu tanımlar - karakter türü olarak bildirilen bir nesne, temel çalıştırma karakter kümesinin herhangi bir üyesini depolayacak kadar büyüktür. . Üçüncüsü, C "70'lerin dili" değildir, donanıma yakın yaşayan bir dildir ve muhtemelen sonuçta tüm üst düzey soyutlamalarınızın bir CPU'ya anlam ifade etmesini sağlayan dildir. Sadece yüksek seviyeli dilleri bilen ve işlerin gerçekte nasıl yürüdüğü konusunda hiçbir değeri olmayan bir kişi olarak çıkıyorsunuz. -1
Ed S.

18

null.

Mucidi Tony Hoare, ona "milyar dolarlık hata" diyor .

60'lı yıllarda ALGOL'de tanıtıldı ve günümüzde yaygın olarak kullanılan programlama dillerinin çoğunda var.

OCaml ve Haskell gibi dillerde kullanılan daha iyi bir alternatif, bir belki . Genel fikir, nesne referanslarının, olabileceğinin açık bir göstergesi olmadıkça boş / boş / varolmayan olamayacağıdır.

(Tony alçakgönüllülüğü içinde harika olsa da, neredeyse herkesin aynı hatayı yapabileceğini düşünüyorum, ve o sadece ilk oldu.)


Mucit ile bile aynı fikirde değil !!! boş, işaretçi / referans veri türü için boş değerdir. Dizelerde boş dize, kümelerde boş küme (Pascal boş küme = []), tam sayılar 0 vardır. Tam değişkenler 0 değerine sahipse, null / nil / whatever kullanan çoğu programlama dili vardır.
Umlcat

4
@ user14579: Herhangi bir diziyi veya dizeyi veya diziyi destekleyen her dilde {} var, ancak yine de bir dizi sınırına neden olabilecek bir şeye sahip olmadığınız sürece, yine de semantik olarak uygun ve çökmeyecek - ama bu başka bir konudur. Boş bir dizeyle sonuçlanacak tüm karakterleri büyük harf yapmak için boş bir dizge işleyebilirsiniz. Aynı şeyi boş bir dizgede denersiniz ve doğru şekilde düşünmeden, çökecektir. Sorun şu ki, bu uygun düşüncenin sıkıcı, sık sık unutulmuş olması ve tek-ifade fonksiyonlarını yazmayı zorlaştırmasıdır (yani lambdalar).
Rei Miyasaka 10:11

1
Ne zaman boş yazsam para kazanırım ... oh doğru ne zaman boş yazsam biri para kaybediyor. Bu sefer hariç.
kevpie

3
@umlcat - Belki x'i kullanarak Ocaml, Haskell ve F # gibi desenleri eşleştiren dillere sahipseniz Hiçbir desen derleme zamanında boş vakayı unutmanızı engellemez. Hiçbir derleme zamanı kandırması, null'un yerleşik deyim olduğu dillerde bir hata yakalayamaz. Açıkça, Belki ve Bazı monadları olan dillerdeki boş durumla ilgilenmemeyi seçmeniz gerektiğinden, "boş" yaklaşıma göre ciddi bir avantaja sahiptirler.
JasonTrue

1
@Jason - Ben maybebir null opt-in olarak düşünmek hoşuma gidiyor , oysa null istisna bir opt-out. Tabii ki, çalışma zamanı hataları ile derleme zamanı hataları arasındaki fark hakkında da söylenecek bazı şeyler var, ancak sadece null'un aslında davranışları enjekte etmesi gerçeği kendi içinde kayda değer.
Rei Miyasaka

14

PHP'yi tasarlayanların normal bir klavyeyi kullanmadıklarını, bir colemak klavyeyi kullanmadıklarını, çünkü ne yaptıklarını fark etmeleri gerektiğini hissettim.

Ben bir PHP geliştiricisiyim. PHP yazmak eğlenceli değil.

Who::in::their::right::mind::would::do::this()? ::Operatör tutma vardiya ve daha sonra iki basılmasını gerektirir. Ne kadar enerji kaybı.

Although-> this-> IS-> değil-> çok-> daha iyi. Bu aynı zamanda, iki sembol arasında geçiş varken üç tuşa basılmasını gerektirir.

$last = $we.$have.$the.$dumb.'$'.$character. Dolar işareti muazzam miktarda kullanılır ve ödülün klavyenin en üstüne ve bir üst karakter tuşuna basılmasını gerektirir.

Neden PHP'yi yazmak için çok daha hızlı anahtarlar kullanacak şekilde tasarlayamadılar? Neden we.do.this()varslar sadece bir tuşa basmayı gerektiren - veya hiç olmayan (JavaScript) bir anahtarla başlayamıyor veya sahip değiller ve sadece tüm varlıkları önceden tanımlayın (yine de E_STRICT için yapmam gereken gibi)!

Yavaş bir daktilo değilim - ama bu sadece bir topal tasarım seçimdir.


Perl bu acıyı paylaşıyor.
Daenyth

2
Öyleyse C ++ ve bazı açıklanamayan tuhaf sebeplerden dolayı PowerShell.
Rei Miyasaka

2
Daha güçlü bir editör kullanın ve bu operatörler için kendi anahtar dizilerinizi tanımlayın.
kevin cline

1
I::have::nothing::against::this->at.all()
Mateen Ulhaq

1
Belki de qwerty klavyeleri kullanmazlar. $ and: klavyeler gibi azerty tuşlarına basma tuşuna basmanıza gerek yok.
Arkh

13

Masaüstü kullanımı ilham formları içinde asp.net .

Her zaman bir şekerleme hissettim ve yol ya da web aslında nasıl çalıştığını aldı. Neyse ki asp.net-mvc bu ilhamdan dolayı Ruby vb.


18
Bu bir kütüphane olayı değil mi?
nikie

@nikie bu iyi bir nokta;)
güvercin

1
@nikie Aslında, XML tabanlı ASPX kodu bir dildir, böylece çalışmak için bunu çevirebilirsiniz. : D
CodexArcanum

2
ASP.NET ile ilgili asıl sorun, web detaylarını programlayıcıdan gizlemeye ne kadar zor olduğunu düşünüyorum. ASP.NET'te gerçekten çok temiz ve faydalı şeyler oluyor, ama çok sıkı bir şekilde mücadele etmelisiniz ve bunu elde etmek için çok derine dalmalısınız.
CodexArcanum

1
Öte yandan, "klasik" masaüstü uygulaması şeyini kullanarak bir araya getirilen binlerce ve binlerce basit ve başarılı veri toplama uygulaması var. Tek kötü şey, MVC'ye kadar tek Microsoft seçeneğinin pencere formları olmasıydı.
ElGringoGrande 12:11

13

Benim için PHP'nin standart kütüphanesindeki adlandırma ve argüman siparişi sözleşmelerinin mutlak eksikliğidir.

Her ne kadar JASS , başvurulan nesne serbest bırakıldıktan / çıkartıldıktan sonra (veya referans kaçak yapar ve birkaç byte hafıza kaybedilirse) referansları geçersiz kılma zorunluluğu olsa da, daha ciddidir, ancak JASS tek amaçlı bir dil olduğundan, o kadar da kritik değildir.


9
PHP'nin stdlib'deki sözleşmelerin eksikliğinin bir dil tasarım hatası olmadığı tartışılabilir .

3
@delnan: Sözleşmelerin eksikliği, PHP'nin nasıl tasarlandığının bir sonucudur ve bu nedenle de dil tasarımı ile çok ilgisi vardır. Ayrıca, kütüphaneler ve dil arasında açık bir ayrım olduğu da açık değil. Özellikle Lisp, bir dili diğerinin üzerine önyükleme geleneğine sahiptir
btilly

1
JASS ile ilgili gerçekten dikkat çekici olan şey, tutamaçlarda sayma referansına sahip olmasıydı, ancak manuel olarak yok edilmedikçe onları temizlemeyecekti (ve grafik arayüzü her yerde belleği sızdıran işlevler yarattı)!
Craig Gidney

13

Karşılaştığım en büyük tasarım hatası, python'un başlangıçta python 3.x gibi tasarlanmamış olması.


1
Guido bile her şeyi tek seferde doğru

5
@delnan, oh biliyorum ve python <3 hala şaşırtıcı derecede iyi bir dil, ancak kullanamadığım python 3.x biçiminde daha iyi bir dilin olması biraz can sıkıcı çünkü tüm modülleri kırar. İhtiyacım var.
dan_waterworth 6:11

Python 3.x modülleriniz için lobiye devam edin! Bu arada 2.5.4'te yazmaya devam edeceğim. SO sayesinde gerçekten 3.x'in canlı ve iyi olduğunu hatırlattı.
kevpie

@kevpie Öncelikle, kütüphaneyi koruyanlar için geçişi kolaylaştırmak amacıyla python'a koşullu derleme eklemek için lobi. 2to3 uzun vadede sürdürülebilir bir çözüm değildir.
Evan Plaice

12

C dizisinde bozunma ve sonuç olarak C ++.


Ben de uygun dizi desteği diliyorum. C ++ 'da abscons sözdizimini ve şablonlarını kullanarak çürümeyi önleyebilirsiniz ... fakat daha çok kesmek: /
Matthieu M.

1
Bunun C ++ 'ın ayrı deleteve delete[]operatörlere sahip olmasının nedeni olduğunu unutmayın .
dan04,

Bir diziyi her zaman bir yapıya yerleştirebilir ve isterseniz değere göre geçirmesini sağlayabilirsiniz, ancak bu genellikle orijinal problemden daha gariptir. C ++ 'da, dizileri kullanma gereğini genellikle önleyebilirsiniz.
David Thornley

2
En azından C durumunda, uygun dizi desteğine karşı argüman "dizi sınırlarının kontrolü pahalıdır" dır, özellikle de C işaretçisi aritmetiğinin işe yaradığı şekilde.
Stephen C

@Stephen C: Hangi dizi sınırları kontrol etmenin dizi çürümesi ile ilgisi var?
Nemanja Trifunovic 10:11

11

Java'da ilkel türler.

java.lang.ObjectTeorik bir bakış açısıyla dil şartnamesinin ek karmaşıklığına yol açan ve pratik bir bakış açısıyla koleksiyon kullanımını son derece sıkıcı hale getiren her şeyin bir soydan geldiği ilkesini çiğniyorlar.

Otomatik kutulama pratik dezavantajları hafifletmeye yardımcı oldu, ancak spesifikasyonları daha da karmaşık hale getirme ve büyük bir yağ muz derisi getirme pahasınayken: Artık basit bir aritmetik işlem gibi görünen şeyden boş bir gösterici istisnası alabilirsiniz.


İlkel türlerini kaldırırsanız, korkunç performans sorununa neden olur. Ve otomatik kutulama oldukça kolay bir şekilde karışabilir, bu yüzden hiçbir şeyi iyileştirmez.
deadalnix

O zamanlar, bu Java tasarımcılarının mantıklı bir karardı. 90'lı yıllarda mevcut olan makineler / VM'lere verilen performans kazanımları, java.lang.Object çevresindeki her şeyi birleştirmenin kavramsal avantajlarından ağır basmıştır.
mikera

10

Perl'i en iyi tanıyorum, o yüzden seçeceğim.

Perl birçok fikir denedi. Bazıları iyiydi. Bazıları kötüydü. Bazıları orjinaldi ve iyi bir nedenden ötürü kopyalanamadı.

Birincisi bağlam fikri - her işlev çağrısı listede veya skalar bağlamında gerçekleşir ve her bağlamda tamamen farklı şeyler yapabilir. Http://use.perl.org/~btilly/journal/36756 de işaret ettiğim gibi, bu her API'yi karmaşıklaştırıyor ve Perl kodunda sık sık ince tasarım sorunlarına yol açıyor.

Bir sonraki, sözdizimi ve veri türlerini bu kadar tamamen bağlama fikridir. Bu, nesnelerin diğer veri türleri gibi maskelenmesine izin vermek için bağın icat edilmesine yol açar. (Aşırı yük kullanarak da aynı etkiyi elde edebilirsiniz, ancak kravat Perl'de daha yaygın bir yaklaşımdır.)

Pek çok dil tarafından yapılan bir başka yaygın hata, sözlükten ziyade dinamik kapsam belirleme ile başlamaktır. Bu tasarım kararını daha sonra geri almak zordur ve uzun süreli siğillere yol açar. Perl'deki bu siğillerin klasik açıklaması http://perl.plover.com/FAQs/Namespaces.html'dir . Bunun Perl'in ourdeğişkenler ve staticdeğişkenler eklemeden önce yazıldığını unutmayın .

İnsanlar, statik ve dinamik yazmaya karşı yasal olarak aynı fikirde değiller. Ben şahsen dinamik yazmayı severim. Ancak, yazım hatalarının yakalanmasına izin verecek kadar yapıya sahip olmak önemlidir. Perl 5 bununla iyi bir iş çıkarır. Fakat Perl 1-4 bunu yanlış anladı. Diğer birkaç dilde de aynı şeyi yapan tiftik damaları vardır. Tüy bırakma kontrolünü zorlama konusunda iyi olduğunuz sürece, bu kabul edilebilir.

Daha fazla kötü fikir (çok sayıda) arıyorsanız PHP'yi öğrenin ve geçmişini inceleyin. En sevdiğim hatam (uzun zaman önce çok fazla güvenlik açığına yol açtığı için düzeltildi), herhangi bir değişkeni form parametrelerine geçirerek herhangi bir değişkeni ayarlamaya izin veriyordu. Ancak bu tek hatadan uzak.


5
Evet, Perl'in çok fazla hatası var, çünkü onu yapan millet yeni fikirler deniyordu ve bunu yaptığınızda sık sık yanlış anlıyorsunuz. (Perl'de çok iyi şeyler de var ve Regexps için herkesin kopyaladığı görülüyor.)
Zachary K

@ zachary-k: Kesinlikle kabul etti. Ve sorunlar arasında yürümeye başlamadan önce bunu netleştirmeye çalıştım.
btilly

4
Lisps başlangıçta dinamik olarak kapsam dahilindeydi ve zamanla sözcüksel kapsam olarak değiştirildi (en azından Scheme ve Common Lisp'te). Değişmesi imkansız değil.
David Thornley

4
@ david-thornley: Bir yere geriye dönük uyumluluktan ödün vermemeniz mümkün değil. Şema her zaman sözcüksel olarak ele alınmıştır. Common Lisp, standart hale getirildiği andan itibaren sözlüksel olarak ele alındı, ancak çeşitli Lisp toplulukları benimseme mücadeleleri verdi. Ve Emacs Lisp, uzun süredir bir değişim arzusu olmasına rağmen, hala dinamik kapsam kullanıyor.
btilly

1
BTW, insanların Perl'den hoşlanmadığı şeylerin çoğu Perl'de icat edilmedi ancak çoğu Bourne kabuğundaki diğer dillerden alındı.
reinierpost

10

JavaScripts kod blokları ve nesne değişmezleri için belirsizlik.

  {a:b}

abir etiket ve bbir ifade olan bir kod bloğu olabilir ; veya adeğeri olan bir niteliği olan bir nesneyi tanımlayabilir.b


Aslında bu JavaScript hakkında seviyorum. Dil yapısı sadeliği güzel ve geliştirici ne yaptığını biliyorsa amaç açık olmalıdır.
Xeoncross

2
Xeoncross: Genelde belirsizliklerden hoşlanmam. Bu durumda, geliştirici için açık, ancak eval () fazladan parantez gerekiyor.
user281377 10:11

2
@ammoQ: Açık mı? Öyleyse nedir? Bir nesne veya kod bloğu?
konfigüratör

configurator: Açıkçası bir nesne. Aklı başında hiç kimse denilen bir etiketi kullanmaz a.
user281377,

10

FORTRAN'a ve boşluklara duyarsızlığa geri döneceğim.

Şartnameyi bozdu. ENDKart uygun olarak, "son" olan bir kart yerine, 'E' olan bir kart, bir N '', ve sütun 7-72 bir sırada bir 'D', ve diğer bir nonblanks olarak tanımlanabilir zorunda sütunlar ve başka hiçbir şey.

Kolay sözdizimsel karışıklığa yol açtı. DO 100 I = 1, 10bir döngü kontrol ifadesiyken, DO 100 I = 1. 101.1 değerini bir değişkene atanmış bir ifadeydi DO10I. (Değişkenlerin bildirilmeden yaratılabileceği gerçeği, ilk harflerine göre türleri, buna katkıda bulundu.) Diğer dillerin aksine, belirsizliği gidermek için belirteçleri ayırmak için boşluk kullanmanın bir yolu yoktu.

Ayrıca başkalarının kafa karıştırıcı kod yazmasına izin verdi. FORTRAN'ın bu özelliğinin bir daha asla tekrarlanmamasının nedenleri var.


1
Değişmezleri yeniden tanımlayabileceğiniz bir dilde bu en kötü örnek - Yani sadece küçük bir uzay aracının çökmesine neden oldu
Martin Beckett

Daha önce, BOYUT yerine DAMNATION yazabilir ve işe yarayabilirdi.
Mike Dunlavey

Halen CS dışındaki kişiler tarafından öğretiliyor. A) bildirimlere karşı mücadele edenlerle, b) boşlukla mücadele, c) "devam çizgileri" gibi, d) 6 karakterli isimler kullandıklarında veya 4, d) gördüklerinde güdüklenmiş (test ? a : b), e) ısrar ediyorum kullanımda **, f) büyük / küçük harf duyarlılığı işlenemez. Bunun çoğu, 50'li yıllardaki anahtar delikleri yüzündendi.
Mike Dunlavey

1
@Martin Beckett - FORTRAN'daki değişmezleri yeniden tanımlamak, bir dil özelliğinden çok bir derleyici kusuruydu. Kesinlikle kasıtlı bir dil özelliği değildi.
Stephen C

1
@ oosterwal: Kesinlikle yaptım. Yanlış olabilirim ama delikli kartlara dayalı dil tanımını belli belirsiz hatırlıyorum. O zamanlar FORTRAN programlarına giriş yapmanın ana yoluydu ve 73-80 numaralı sütunları içeren 80 sütunlu bir çizgi fikri delikli kartlardan geliyor.
David Thornley

9

BASIC ile ilgili en büyük sorunlardan biri, dili ilk ortamlarının ötesine genişletmek için iyi tanımlanmış herhangi bir yöntemin olmayışıydı, bir sürü tamamen uyumsuz uygulamaya yol açtı (ve herhangi bir standardizasyonda neredeyse alakasız bir girişime).

Neredeyse herhangi bir dil, bazı çılgın programcılar tarafından genel amaçlı kullanım için eğilecektir. Çılgın bir fikrin ortaya çıkması durumunda, başlangıçta bu genel amaçlı kullanımı planlamak daha iyidir.


2
+1: Uygun modül ve kütüphanelere sahip olmayan herhangi bir dil, gerçekleşmeyi bekleyen bir hatadır. COBOL bundan da acı çekti, uyumlu olmayan tuhaf değişkenlere de yol açtı.
S.Lott

8

DSL'lere (etki alanına özgü diller) inanıyorum ve bir dilde değer verdiğim bir şey, bunun üzerine bir DSL tanımlamama izin veriyorsa olur.

Lisp'te makrolar var - çoğu insan bunu benim gibi iyi bir şey olarak görüyor.

C ve C ++ 'da makrolar var - insanlar onlardan şikayet ediyor, ancak DSL'leri tanımlamak için onları kullanabildim.

Java'da, dışarıda bırakıldılar (ve dolayısıyla C # dilinde) ve bunların eksikliği bir erdem olarak ilan edildi. Tabii bu size intellisense var sağlar, ama bana sadece bir olduğunu oeuvre . DSL'imi yapmak için, elle genişletmem gerekiyor. Bu bir acıdır ve tonlarca daha az kodla çok daha fazlasını yapmama izin vermeme rağmen kötü bir programcı gibi görünmemi sağlıyor.


4
Makroları olmayan herhangi bir dilin, düzeltilemez dev bir tasarım hatası olduğu konusunda hemfikirdim. Ama ' onlar dışarıda bırakıldı ' derken ne demek istiyorsun ? C önişlemcisi iyi bir makro sistemi değildi. Java, makro içeren herhangi bir uygun dilden türetilmez.
SK-mantık

1
DSL'nizi harici bir makro işleme dilinde yazabilirsiniz (m4 gibi diyelim ki diğerleri arasında).
SADECE benim DOĞRU AŞAMAN

4
@SK: C önişlemcisinin Lisp (örneğin) ile karşılaştırıldığında iyi bir makro sistemi olduğunu söylemeyeceğim. Ancak, hiçbir şey ile karşılaştırıldığında , son derece yararlı.
Mike Dunlavey

4
@reinierpost: Lisp'te yapabileceklerimi düşünüyorum, örneğin diferansiyel uygulama ve geri izleme gibi kontrol yapılarını tanıtmak gibi. Bunlar Lisp makrolarıyla yapılabilir. C / C ++ 'da, C makrolarıyla (ve küçük bir programcı disipliniyle) diferansiyel uygulama yapabilirim, ancak geri izlemem. C # ile ikisini de yapamam. Takas aldığım şey intellisense gibi şeyler. İDT.
Mike Dunlavey

1
@David: Yaptığım gibi, sıradan kodun etrafına dolanacak bir ifadem vardı. Bu alacağını cdrlistenin ve bunun dışında bir lambda kapama (diğer bir deyişle bir devamı) oluşturulması için bir bağımsız değişken olarak geçmek carlistenin. Elbette, yinelemeli bir şekilde yapıldı ve koşullamalar, döngüler ve işlev çağrıları için “doğru olanı yapacaktı”. Sonra "seçim" işlevi sadece normal bir döngüye dönüştü. Güzel değil, ama sağlamdı. Sorun şu ki aşırı iç içe döngüler yapmayı çok kolaylaştırıyor.
Mike Dunlavey

7

İfadeler , onlara ait her dilde. İfadelerle yapamayacağınız hiçbir şey yapmazlar ve pek çok şey yapmanıza engel olurlar. ?:Üçlü bir operatörün varlığı, etraflarında dolaşmaya çalışmak zorunda olmanın sadece bir örneğidir. JavaScript’te özellikle can sıkıcı:

// With statements:
node.listen(function(arg) {
  var result;
  if (arg) {
    result = 'yes';
  } else {
    result = 'no';
  }
  return result;
})

// Without:
node.listen(function(arg) if (arg) 'yes' else 'no')

Burada kafam karıştı: İşleri yapmak için daha basit bir yol mu istiyorsunuz?
LQ

2
Doğru. Her şey için ifadeler.
munificent

1
Lisp bunun için iyi çalışıyor.
David Thornley

1
@ SK-mantık: İfadelerin makine dilinden, FORTRAN, ALGOL ve COBOL aracılığıyla gizlice miras alındığından şüpheleniyorum.
David Thornley

1
Makine dilinin ortak ata olduğundan eminim ve bu sadece von Neumann mimarisine dayanan modern bilgisayarların talimatları sıralı olarak uyguladığı ve durumu değiştirdiği gerçeğinin bir yansıması. Sonuçta, IO olduğunda, anlamlı veri sağlamayan ifadeler olacak, bu nedenle ifadeler anlamsal olarak bazı kodların sadece yan etkileri olduğunu göstermekte tamamen yararsız değildir. İfadeler yerine unittür (aka ()) kavramına sahip olan dillerin bile, uyarı vermemelerini veya başka şekilde garip davranmalarını sağlamak için özel bir düşünceleri vardır.
Rei Miyasaka

6

Benim için, C'den türetilen tüm dilleri rahatsız eden tasarım sorunu; yani, " başka sarkan ". Bu gramer problemi C ++ 'da çözülmüş olmalıydı, fakat Java ve C #' ya taşındı.


3
C ++ 'nın ana hedeflerinden biri, C ile tamamen geriye dönük olarak uyumlu olmaktı. Anlamsal bir davranış değişikliği büyük ölçüde değişmiş olsaydı, olduğu gibi yakalayamayabilirdi (ya da en azından o andaki düşünce
buydu

2
Bununla birlikte, @ S., "sarkan başka" sorunun ortadan kaldırılması, <compound_statement> (aka <block>) gramer üretiminin ortadan kaldırılması ve kıvrık parantezlerin, olduğu gibi koşullu ve yineleyen kontrol yapılarına dahil edilmesiyle başarılabilirdi. try / catch istisna işleme kontrol yapısını ekledi. Java ve C # 'daki bu gramer belirsizliğini düzeltmemek için bir mazeret yok. Şu anda, bu gramer belirsizliği için etraflıca savunma çalışmaları, koşullu veya yinelemeli bir kontrol ifadesini izleyen her bir ifadeyi bileşik bir ifade haline getirmektir.
bit twiddler

1
Bununla ne demek istiyorsun? Bu “dilbilgisi sorunu” değildir (tamamen kesindir). Nasıl “çözersiniz”? Aslında C'deki kuralları tatmin edici buluyorum. Muhtemelen, yalnızca Python benzeri bir sözdizimi (= anlamlı girinti) bu sorunu gerçekten çözebilir. Dahası, aslında modern diller anlamına çok mutluyum değil parantez mecburi kılmaktadır. Tüm C benzeri sözdizimlerinin berbat olduğu, ancak sarkan başkalarının problemlerinin en az olduğu konusunda hemfikirim.
Konrad Rudolph

1
Devam: Python'un bir açıklama listesini tasfiye etmek için bir çentik kullanmasının, inancın ötesinde tuhaf olduğunu düşünüyorum. Bu teknik, sözdizimi taraması ile sözlü taramayı sıkıca birleştirerek "kaygıların ayrılması" ilkesini ihlal ediyor. Bağlamsız bir dilbilgisi kaynağın düzeni hakkında hiçbir şey bilmeden ayrıştırılabilir olmalıdır.
bit-twiddler 6:11

3
@ bit-twiddler: Hayır, değil. Python lexer, beyaz alanı sadece uygun INDENT ve DEDENT belirteçlerine dönüştürür. Bu yapıldıktan sonra Python oldukça geleneksel bir gramer bilgisine sahiptir ( docs.python.org/reference/grammar.html ).
dan04 0

6

Bence şu ana kadarki cevapların çoğu ana dillerin başarısız olmasına işaret ediyor:

Geriye dönük uyumluluğu etkilemeden ana dili değiştirmenin yolu yoktur.

Bu çözülürse, hemen hemen bütün diğer kulplar çözülebilir.

DÜZENLE.

Bu, farklı ad alanlarına sahip kütüphanelerde çözülebilir ve bir dilin çekirdeğinin çoğu için benzer bir şey yapmayı düşünebilirsiniz, ancak bu daha sonra birden fazla derleyiciyi / tercümanı desteklemeniz gerektiği anlamına gelebilir.

Sonuçta, bunu tamamen tatmin edici bir şekilde nasıl çözeceğimi bildiğimi sanmıyorum, ancak bu bir çözümün olmadığı anlamına gelmiyor veya daha fazlası yapılamaz


1
Bunu "çözme" nasıl olur?
Bjarke Freund-Hansen

Tamamen çözülebileceğinden emin değilim - belli ki işleri ana dilden uzak tutmak ve standart bir kütüphanede yardımcı olmak için sanırım bunu gidebildiği kadar zorlamaya çalışacağım
jk.

1
Geriye doğru uyumlu olarak, daha yeni derleyicilerin eski kodu derleyebilmesi gerektiği anlamına mı geliyor?
Rei Miyasaka

Demek istediğim, yeni derleyiciler eski kodun anlamını değiştirmemeli, derlemede başarısız olmak bunun bir altkümesi olacaktır
jk.

Çoğu durumda, belirli bir özellik olmadığında veya değiştirmek istediğinizde, insanlar öncekine göre yeni bir dil oluşturur. Sınıflar ile C => C ++
umlcat 10:11


4

Hem Java hem de C #, genetik eklerken geriye dönük uyumluluğu korumak arzusundan dolayı, kendi tür sistemleri ile ilgili can sıkıcı sorunlar yaşıyor. Java, jenerik ve dizileri karıştırmayı sevmez; C #, bazı yararlı imzalara izin vermez, çünkü değer türlerini sınır olarak kullanamazsınız.

İkincisinin bir örneği olarak, bunu göz önünde bulundurun

public static T Ayrıştırma <T> (Tip <T> tipi, string str) burada T: Enum
yanında veya değiştirirken
public static object Ayrıştırma (Type type, string str)
içinde Enumsınıfa izin verecek
MyEnum e = Enum.Parse (typeof (MyEnum), str);
totolojik değil
MyEnum e = (MyEnum) Enum.Parse (typeof (MyEnum), str);

tl; dr: türünüzü tasarlamaya başladığınızda parametrik polimorfizmi düşünün, sürüm 1'i yayınladıktan sonra değil.


2
Türleri numaralandırmayla sınırlayamaman C # da can sıkıcıdır, ancak bunun gibi çalışabilirsin MyMethod<T>(T value) where T : struct, IComparable, IFormattable, IConvertible Ama yine de bir numara için test etmek zorundasın ve bu bir hack. Bence C # jenerikindeki en büyük eksiklik, dili gerçekten harika konseptlere açacak olan daha yüksek türler için destek olmadığını düşünüyorum.
CodexArcanum

4

Alevlenmek için kendimi açıyormuş gibi hissediyorum, ancak C ++ 'da referansla eski düz veri türlerini geçme yeteneğinden gerçekten nefret ediyorum. Ben sadece referans olarak karmaşık tipleri geçemekten nefret ediyorum. Bir işleve bakıyorsam:

void foo()
{
    int a = 8;
    bar(a);
}

Çağıran noktadan, bartamamen farklı bir dosyada tanımlanabilecek olanın, şöyle olduğunu söylemenin bir yolu yoktur :

void bar(int& a)
{
    a++;
}

Bazıları böyle bir şey yapmanın sadece kötü bir yazılım tasarımı olabileceğini ve dili suçlamamak olduğunu iddia edebilir, ancak dilin bunu yapmanıza izin vermesinden hoşlanmıyorum. İşaretçi kullanma ve arama

bar(&a);

çok daha okunaklı.


+1 Sana katılmıyorum, ama nedenini takdir ediyorum.
Jon Purdy

@Jon Aslında ne düşündüğünle çok ilgilenirdim. "Dili suçlama" görünümünü taşıyor musunuz?
Jeff

6
@Jeff: Birincisi, referans anlambiliminin C ++ 'a girmesinin ana nedeni operatörün aşırı yüklenmesiydi, bunun için tek tip referans davranışı sadece mantıklı geliyordu. Daha da önemlisi, C ++, çok yönlü olmak ve çok ince taneli özellikler sağlamak üzere tasarlanmıştır, öyle olsa bile , programcı hatası önemli derecede risk altındadır. Yani evet, en azından bu özel durumda, dili suçlamayın. Bir dilin yoluma girmesine izin vermektense hatalar yapmayı tercih ederim.
Jon Purdy

@Jon, POD'ler dışındaki her şeye başvurmak için referans olarak geçmek için çok garip olurdu. Bu özellik alternatif olarak tamamen C ++ 'dan eksik olsaydı tercih ederim, ama aynı fikirde olmayı kabul edebiliriz :). Giriş için teşekkürler!
Jeff

Java, sizin kadar işaretçiler gibi görünmüyor.
Mateen Ulhaq

4

alter

COBOL'ü öğrendiğimde , ALTER ifadesi hala standardın bir parçasıydı. Özet olarak, bu ifade çalışma zamanı sırasında prosedür çağrılarını değiştirmenize izin verir.

Tehlike, bu ifadeyi, nadiren erişilen bazı gizli kod bölümlerine koymanız ve programınızın geri kalanının akışını tamamen değiştirme potansiyeline sahip olmanızdı. Birden fazla ALTER ifadesiyle, programınızın herhangi bir zamanda ne yaptığını bilmeyi neredeyse imkansız hale getirebilirsiniz.

Üniversite eğitmenim, çok açık bir şekilde, bu ifadeyi programlarımızdan herhangi birinde gördüğü takdirde bizi otomatik olarak bırakacağını belirtti.


Yine de iyi kullanım durumları var - saplama veya not verme. Bunun yerine yazma v() { if (not alreadyCalculatedResult) { result = long(operation); alreadyCalculatedResult = true; } result; }diyorsunuzv() { result = long(operation); v = () => result; result; }
yapılandırıcı

4

Bir programlama dilinin en kötü günahı iyi tanımlanmamıştır. Hatırladığım bir durum, kökenlerinden C ++ 'dır:

  1. Kitap veya örnekleri takip ederek derlemek ve çalıştırmak için bir program elde edemediğiniz kadar hastalandı.
  2. Bir derleyici ve işletim sistemi altında derleme ve çalıştırma programını değiştirdikten sonra, derleyicileri veya platformları değiştirdiyseniz baştan başlamanız gerekir.

Hatırladığım kadarıyla, C ++ 'ı C kadar profesyonel bir şekilde güvenilir hale getirecek kadar iyi tanımlanmış olması on yıl aldı . Bu bir daha asla olmaması gereken bir şey.

Günah olarak düşündüğüm başka bir şey (farklı bir cevapta mı olmalı?), Ortak bir iş yapmanın birden fazla "en iyi" yoluna sahip olmak. (Yine) C ++, Perl ve Ruby durumlarında.


1
Gelişen bir dilde kötü tanımlanmayı nasıl önleyeceğimi bilmiyorum. Veya, bu konuda, orijinal tasarımcının bazı önemli noktaları kaçırdığı önceden tasarlanmış bir dilde (Pascal gibi).
David Thornley

@David Thornley İyi tanımlanmışlık iyi tanımlanmıştır. Dayanıklı olan hatalar, çoğu programlama dili tasarımcısı en başından beri doğru anlar. Araçlar, bir gramerin tamamlandığında belirsiz olduğunu kontrol edebilir (C ++ en az üç gramer gerektirir) ve standart uygulamalar için anlambilim belirtilmelidir.
Apalala

İyi tanımlanmış dillerin mümkün olduğuna katılıyorum, ancak bu, Standart C ++ gibi gelişen bir dilde olmayacak. Alternatif olarak, her dilin yayınlanmadan önce tamamen tasarlanmış olması ve en iyi dilleri edinmenin yolu olması gerekmez. Dil tasarımı son derece karmaşık olduğundan çoğu programlama dili tasarımcısının başlangıçta bazı şeyleri yanlış yaptığını söyleyebilirim.
David Thornley

Sanırım "iyi tanımlanmış" ile ne demek istediğinizi anlama konusunda sorun yaşıyorum. Şikayetiniz, farklı C ++ derleyicilerinin aslında aynı dili derlemediğinden şikayet ediyor musunuz?
Sean McMillan

3

C ++ 'daki sınıflar, dilde bir çeşit zorunlu tasarım kalıbıdır.

Bir yapı ile bir sınıf arasında çalışma zamanında hiçbir fark yoktur ve onu koymak istediğim "bilgi gizleme" nin gerçek gerçek programlama avantajının ne olduğunu anlamak çok kafa karıştırıcıdır.

Bunun için aşağı oylanacağım, ama yine de, C ++ derleyicileri bu dili yazmak çok zor bir canavar gibi geliyor.


2
Bilginin gizlenmesi önemlidir, çünkü değişmesi muhtemel olan uygulamaya özgü detayları API'nin erişilebilir bölümlerinden (API'nin "UI'si) gizlemenize izin verir, böylece programda değişiklik yapmak kolaylaşır ve daha az acı verici hale gelir.
Anto

1
API'nin kullanıcı arayüzü ... hayır, ciddiyim, satın almıyorum.
jokoon

3
Bu fark C ++ 'ın en isyancı kısmı değil, hatta yakın değil. Tek fark varsayılan erişim değiştiricisidir (yapılar için genel, sınıflar için özel). C ++ korkunç, canavarca bir dil, fakat kesinlikle bu bölümde değil.
SK-mantık

sk-mantık: peki, korkuların oradan başladığını söyleyebilirim.
jokoon

2
Bilgi gizleme iyidir; Bunun her yerinde tartışmalar bulabilirsiniz. Bunun hakkında düşünebildiğim tek önemli yazılım kitabı, Brooks'un "Efsanevi Adam Ayı" dı ve daha sonra kitaptaki en büyük hata olduğunu düşündü. Avantajları anlamıyorsanız, yaptığınız kararları vermeye gerçekten yetkin değilsiniz.
David Thornley

3

Her dilin bir hatası olsa da, onları bir kez tanıdığınızda hiçbiri sıkıntı yaratmaz. Bu çift hariç:

Wordy API'lerle birleştirilmiş karmaşık sözdizimi

Bu, özellikle Objective-C gibi bir dil için geçerlidir. Sadece sözdizimi ezici bir şekilde karmaşık değildir, fakat API gibi işlev isimleri kullanır:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

Hepiniz açık ve belirsiz olduğum için değilim, ama bu çok saçma. Ne zaman xcode ile oturup, bir n00b gibi hissediyorum ve bu gerçekten sinir bozucu.


Objective-C sözdizimi ezici bir şekilde karmaşık mı? C ++ 'ı görmedin mi? Ve gerçek yöntem adı tableView:cellForRowAtIndexPath:, bence çok açıklayıcı.
sağa

Dokunmayı yazmayı öğrenin.
11:11 finnw

2
  1. C imzalı karakterler - matematikçilerin küçük küçük koleksiyonlar yapmasına izin vermek için icat edilmiş bir istif
  2. Anlamsal içerik taşımak için durum kullanma - yine konuşmaya ihtiyacı olmayan ve formülleri için hiçbir zaman yeterli alana sahip olmayan matematikçiler için
  3. Letin / Plain ataması vs. Temel lehçelerde atamanın belirlenmesi - burada matematikçi olmuyor diye düşünüyorum.

İmzalı karakter yorumlarınıza göre kayboldum, açıklayabilir misiniz?
Winston Ewert

1
İnsanoğluna (imzasız) işaret kavramı ve derleyiciye imzasız karakterleri varsayılan olarak kullanmasını söyleme zorunluluğu kesinlikle bir matematikçi için deliliktir, çünkü ikinci! veya italiktir.
Ekkehard.Horner

5
Sorun, C'nin "char" (yani bir metin dizesinin parçası) ve "bayt" (yani (u)int_least8_t) kavramını karıştırmasıdır . İmza, küçük tamsayılar için mükemmel bir anlam ifade eder, ancak karakterler için hiçbir anlam ifade etmez.
dan04,

@ dan04: Katılıyorum, keşke küçük tamsayılar (imzalı ve imzasız), bayt ve karakter için farklı türleri olsaydı. Yeni doğmuş kişilere ham hafızayı manipüle etmek char*için C-String gibi kullanmak zorunda kaldıklarını açıkladığınızda, gerçekten kafaları karışır.
Matthieu M.

C # ayrı olan bu hakkın var sbyte, byteve chartürleri.
dan04, 06.06.2011
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.