En sık kullandığınız bir programlama dilinde hangi sözdizimi öğesinden en çok nefret ediyorsunuz? [kapalı]


27

Bir programlama dilini ne kadar sevdiğiniz önemli değil, her zaman için olabildiğince hoş olmayan birkaç ayrıntı vardır.

Bu soruda, özellikle sözdizimi unsurlarına odaklanmak istiyorum . Sık kullandığınız bir programlama dilinde (belki de en sevdiğiniz programlama dili veya belki de işte kullanmaya zorlandığınız dil), hangi sözdizimi öğesini en okunaksız, net olmayan, uygunsuz veya nahoş buluyorsunuz?


@Nathan Taylor, bu soru için değil, başka bir soru için .
finnw

Bu soru değiştirildi mi? Çünkü cevap verdiğimde, “sözdizimi unsurları” üzerine odaklanmamıştı ... Şimdi cevabımı değiştirmek zorunda kalacağım.
Talvi Watia

@Talvi: Hayır, en başından beri sözdizimi hakkındaydı.
Timwi

@Timwi garip, o zaman 'farklı bir soru olduğunu düşünerek bir soruya cevap verme' durumu olmalı.
Talvi Watia 21:10

Oy kullanıp bunun yararlı bir soru olduğunu düşünebilirseniz veya aşağıda yararlı cevapları varsa, lütfen oy verin. StackExchange sitelerinin iyi bir topluluk oluşturmak için oy kullanması gerekir. Günde 30 oy verebilirsin, boşa harcama. Özellikle yüksek itibar ve oy sayımı düşük olan kullanıcılar lütfen şunu okurlar: meta.programmers.stackexchange.com/questions/393/…
Maniero

Yanıtlar:


39

JavaScript'te noktalı virgül ekleme.

Gerçekten sık sık ısırılmamıştım, ama kafamın dönmesini sağlayan olağanüstü derecede kötü bir fikir.


İşte kurallar (ECMA-262 Bölüm 7.9’dan)

  1. Program, resmi dilbilgisi tarafından izin verilmeyen bir belirteç içerdiğinde, (a) bu noktada bir çizgi kesilmesi veya (b) beklenmeyen bir belirtecin bir kapanış parantezi olması durumunda noktalı virgül eklenir.
  2. Bir dosyanın sonuna gelindiğinde, program başka türlü çözümlenemiyorsa, noktalı virgül eklenir.
  3. "Kısıtlı üretim" ile karşılaşıldığında ve gramerin "[burada LineTerminator yok]" ekini içerdiği bir yerde bir satır sonlandırıcı içerdiğinde, bir noktalı virgül eklenir.

Örnek:

return 1; // returns 1

return
1; // returns undefined

2
JavaScript: Dünyanın En Çok Yanlış Anlaşılan Programlama Dili ~ Douglas Crockford
pramodc84

Evet, çoğu JavaScript'in "serbest biçimli bir dil" olmasını bekliyor, ancak değil.
Andreas Rejbrand

13
JavaScript'in HTML oluşturmak için tasarlandığının farkına vardığınızda, kodunuzun sözdizimsel olarak geçerli olmadığı zamanlarda kodunuzun "gerçekte ne anlama geldiğini" yorumlamaya çalışmak için uzun bir geçmişi vardır. (Bazen Robustness Prensibi'ne bakın - bilgisayar tarihindeki en büyük felaket.)
Mason Wheeler

7
Bana göre bu tür hatalar, programcının özensiz olduğu ve normalde yarı-kolonu dışlamak için bir sözdizimi hatasına neden olacak en resmi "katı" dillerle çalışmadığı bir kod kokusudur.
Talvi Watia

7
Wohoo, nihayet Sağlamlık İlkesi'ni de düşünen bir başkası, HTML’yi olduğu gibi karışık bir hale getiren bir felakettir.
Roman Starkov

39

C # özelliklerinin olmaması nedeniyle Java-bean sözdizimi

/**
 * Name of user
 */
private String name;

/**
 * Gets name of user
 * @return Name of user
 */
public String getName() {
    return this.name;
}

/**
 * Sets name of user. 
 * @param name
 */
public void setName(final String name) {
    this.name = name;
}

GAH !!!

Bununla ilgili sorunlarım

  • Çok fazla kod - Belgelenmiş bir alana, belgelenmiş bir alıcı yöntemine ve belgelenmiş bir belirleyici yöntemine sahip olun. Bu son derece temel örnekte, tek bir özellik için 20 kod satırı bulunur
  • Clutterlar yöntem listeleri : - "Bana üzerinde bu yöntemi, eli bulsun getX, getY, getZ, getAnotherAnnoyingField, getWhyIHateJavaBeans, getThisIsVerbose, getGAH, ... ah o var hashCode.
  • Birden fazla alanın dokümantasyonu zayıf, eski veya eksik dokümantasyona neden oluyor - Hangi kodun yapıldığını anlamaya çalışırken can sıkıcı
  • Yani can sıkıcı bir 3. parti bu kolayca yapmak için bir eklenti ile gelmek zorunda kaldı - Spoon , Shark , diğerleri arasında.

9
Bir kez daha kod çok ayrıntılı olduğunda, otomatik oluşturma araçlarına ihtiyaç duyuyor, bir şeyler yanlış. Ben NetBeans'lıyım, ancak otomatik olarak alıcı ve alıcı belirleme yeteneği de var. Fakat Javadoc eşzamanlı düşüyor, hala ayrıntılı, hala javadoc, vb.
TheLQ

11
Her şey için alıcılara ihtiyacınız varsa, müşteri kodunda bir sorun var demektir.
finnw

7
Alıcıların ve ayarlayıcıların bulunması kapsüllemeyi keser. Alan yanı olabilir olmak public. Üyeler özel olmalı ve müşteri kodundan alıcılarla ve ayarlayıcılarla değil , daha yüksek seviye mantığı olan sınıf tarafından manipüle edilmelidir .
greyfade

6
@greyfade: Herkese açıksa, ayar kodunun ne yaptığını kolayca değiştiremezsiniz (alanı dışarıdan ayarlayan tüm kodu değiştirmeniz gerekecektir).
Bart van Heukelom

3
@SHiNKiROU: Java temiz görünüyor? Bunu daha önce hiç duymamıştım! Java ile olan temel yakınlığım, görünüşte basit olan şeyin zihinsel olarak yok saymam gereken düzinelerce kod satırı gerektirmesidir.
konfigüratör,

33

Boşluk Duyarlılığı.

Python bu konuda beni rahatsız ediyor. Sana yine düzgün girinti, istemem, ama, böcek beni ben gerektiğini sahip üzere. Sunumun sözdiziminin bir parçası olması beni rahatsız ediyor.


8
sevmeyi öğreneceksin
user10008 18:11

2
sözdizimi olan sunum
Winston Ewert

32

switchİfade (C, C ++, C #, Java, vs.)

İşte neden son derece uygunsuz bulduğuma bir örnek:

switch (someVariable)
{
    case 1:
        int i = something();
        doSomething(i);
        break;

    case 2:
        int i = somethingElse();
        doSomethingElse(i);
        break;
}

Bu derleme yapmaz, çünkü değişken iaynı kapsamda yeniden ifade edilir. Bu küçük bir ayrıntı gibi gözüküyor, ama beni sık sık ısırıyor. Küçültmek için küme parantezleri ekleyebilirim, ancak küme parantezleri sözdiziminin zorunlu bir parçası olsaydı ve fazladan fazladan bir girinti seviyesi yoksa güzel olurdu. Ayrıca fazladan yazmaktan da nefret ediyorum break. Bu çok daha iyi olurdu:

switch (someVariable)
case 1
{
    int i = something();
    doSomething(i);
}
case 2
{
    int i = somethingElse();
    doSomethingElse(i);
}
default
{
    ...
}

Bu daha iyi bir şey if/ elsezincir gibi görünmesini sağlar , çünkü anlamsal olarak da benzer. Bir nedeniyle C # En azından hala, ancak aynı şey olmaz switchaçıklamada vaka etiketlerin sırası önemli değil, ama bir in if/ elseöyle.


1
Ne yazık ki, gelişmiş sözdiziminiz, bu dillerin çoğunda anahtarın en büyük özelliği olan tartışmasız olanı ortadan kaldırıyor: Düşüş. C'deki "Duff'un Aygıtı", bu "yanlış özelliğin" değerine mükemmel bir örnektir. Tercümanlarda ve benzer programlarda geçişi kullanmak, C benzeri dillerde de yaygındır.
greyfade

7
Hayır, bununla bitmez. Sadece goto, C # 'da olduğu gibi, daha açık (bir ya da benzerini kullanarak) yapılmasını gerektirir .
Timwi

8
@greyfade: C'deki duff cihazını kullanan herhangi bir kodun korkunç bir ölümle ölmesi gerekiyor. Derleyiciler bu tür şeyler hakkında sizden daha iyi kararlar alır.
Billy ONeal

4
@greyfade: Delphi basitçe durumda birden indeksleri izin vererek çoklu değer soruna alır: case Foo of 1,3: Result := 'odd'; 2,4: Result := 'even' end;.
Frank Shearar

3
@jkerian: Şimdi break, varsayılan olduğunu ve sadece belirtilmesi gereken yeni çözümler olduğunu hayal edin . Yorum yapmak için hatırlamaya gerek yok! :)
Timwi

27

VB.NET'te Dizi Bildirimleri

VB.NET'te sabit dizileri başlatırken , C / C ++, PHP veya Java gibi öğelerin sayısını değil , dizinin üst sınırını belirlediğinizi daima unutmayı başarırım . VB6'nın yanı sıra (oraya gitmeyeceğiz ...), bu şekilde yapan başka bir dil düşünemiyorum:

Dim myArray(20) as Integer  '# Creates an array with 21 elements,
                            '# indexed from 0 to 20

Sanırım bütün BASIC dilleri bunu yapıyor ... Orjinal BASIC ve QBasic’in yaptığını biliyorum.
Michael K

OMG gerçekten korkunç .... +1
mikera

25

VB6 - Ayrı Değişken Beyanı ve Atama

Çoğu dil bir değişken tanımlamanıza ve bunu bir kod satırına atamanıza izin verir; VB6, diğer taraftan, sizi iki kullanmaya zorlar.

Dim i as Integer
i = 0

Dim derpderp as Collection
Set derpderp = new Collection

İki komutu bir satıra koymak için iki nokta üst üste kullanabilirsiniz, ancak bu durum gerçek kodda hızlı bir şekilde karışık hale gelir.

Dim i as Integer: i = 0
Dim derpderp as Collection: Set derpderp = new Collection

7
VB6'yı en sık kullandığınız dil olarak kullanmak zorunda kaldığınız için +1.
Walter

9
Her gün kullanırım.
systempuntoout

Pascal'ın benzer bir sözdizimi yok mu? Her zaman kötü olduğunu düşündüm.
greyfade

1
Özel bir durum var: Eğer varsa Dim Hurp As New Collectioneriştiğiniz takdirde, Hurpo atıfta zaman Nothing, sihirli erişimi önce başlatılır. Açıkça ayarlayıp Nothingtekrar dokunursanız, yeniden dirilir ... gasp!
Jeffrey Hantin

1
Derp için +1 milyon. Derp de derp de derdi.
MVCylon

24

CSS'de yorum yapma

//PHP ve Javascript gibi diğer birçok dilde olduğu gibi kod satırlarını yorumlamaz. Her ne kadar /* this is commented out */eser, ben kullanmayı tercih //.

Bu bir sıkıntı, çünkü unuttuğum zamanın yarısı CSS'yi düzenliyorum ve daha sonra geri dönüp hatayı düzeltmek zorunda kalıyorum.


Bu gün ve yaşta ham CSS'nin nesne kodu olarak değerlendirileceğini düşünürdünüz.
Tom Hawtin -

// CSS'i yorumlamak için gayet iyi çalışıyor. Onu her zaman yaparım. Tek yaptığım çöp yazmak. ancak, telafi edilemez çizgiyi atlayarak işe yarıyor gibi görünüyor.
MVCylon

1
@MVCylon Bir çizgiyi yorumlamak için // kullanırsanız, aşağıdaki satırdan sonra gelen herhangi bir şey de atlanır. {bu belirli stil içinde} Başka bir deyişle, başarısız olur, çünkü bu satırlar atlanmamalıdır.
Talvi Watia

20

PHP - argümanların tutarlı bir şekilde sıralanması

PHP, bir dizi veya dizgide düşünebileceğiniz her işlemi hemen hemen yapmak için çok sayıda kullanışlı fonksiyona sahiptir. Bu işlemlerden birçoğu a ikisini de kullanarak gerektiren $needleve bir $haystack, ancak farklı işlevleri farklı sıralarda götürün. Hangi işlev hangi argümanları gerektirir, ne kadar sıklıkla karşılaşsam da beynimin absorbe etmeyi reddettiği gerçeklerden biri!

İn_array ve strstr işlevlerini alın :

// Check whether $needle occurs in array $haystack
bool in_array (mixed $needle, array $haystack [, bool $strict])

// Check whether $needle is a substring of $haystack
string strstr (string $haystack, mixed $needle [, bool $before_needle=false])

Yeterince tuhaf, PHP içindekilerle tutarlı gibi gözüküyor $haystack, $needle, dizi işlevlerinin tersine giderken tüm dize işlevlerinin kullandığı görülüyor , ancak bu PHP'de yeni birisinin alışması biraz zaman alabilir. İyi bir var ExpressionEngine üzerinde sonrası daha ayrıntılı olarak bu özel cilvesi, hem de bir söz PHP hata listesinde tartışma PHP ekibinden çok kısa bir yanıt özellikleri!

helly@php.net Öyleyse
iyi bir IDE kullanın.

2
Siparişi hatırlamak daha kolay $needle, $haystackçünkü samanlıkta iğne bulmanın yolunu hatırlatıyor .
kiamlaluno

3
Protip: dizi işlevlerinde iğne önce gelir. string fonksiyonlarında, önce samanlık gelir.
GS

17
İsmini seviyorum strstr. Çok güzel anlamsız.
konfigüratör,

5
Sadece PHP'nin bugtracker'ındaki bağlantılı girişi okuyun. Cidden, wtf? oO Imho tutarlılığı herhangi bir API için geçerli bir konudur ve sadece "iyi bir IDE kullan sonra" yanıtını vermek sadece geçerli bir cevap değildir. En azından devler tarafından daha az iltihaplı ifade edilmiş olabilirdi.
Baelnorn

2
Açıkçası, bu konuda beni çıldırtan şey, bunun bir işlev olmaması gerektiğidir! Sadece bir yöntem olmalı: $ haystack-> find ($ needle). Yapılan anlaşma.
rieper

19

piton

self Örnek yöntem tanımlarındaki parametre


Bir sınıf yönteminde, genellikle cls olarak adlandırılır ve kendini kullanmak konvansiyona aykırıdır.

Eğer düşünürseniz, aslında mantıklı. Diğer dillerde özel bir yöntem bildirmekle aynıdır, self parametresi pythonda açıkça belirtilmiştir, burada diğer dillerde de geçerlidir. Örtük olmasını istiyorsanız, yöntem bildiriminden önce @classmethod dekoratörünü ekleyin. Bkz docs.python.org/library/functions.html#classmethod . Bunun nasıl çalıştığının ayrıntılarını öğrenmek, diğer dillerde nasıl yapıldığına dair bazı bilgiler verir.
Evan Plaice

4
Nedenlerini ve neden orada bırakıldığını anlıyorum neopythonic.blogspot.com/2008/10/… ama yine de hoşuma
gitmedi

@Evan Plaice: 'self parametresi python'da diğer dillerde açık olduğu yerlerde açıktır' Bu hikayenin sadece bir kısmı. Diğer kısım ise haftalık olarak python yazılmasıdır. Birlikte korkunç, unutmak selfkolay olur ve zaman harcar .
maaartinus

@maaartinus Daha sonra, örnek yöntemlerine bir classmethod dekoratör ekleyin. 'Zayıf yazılan' ile hiçbir ilgisi yoktur. Sadece statik yöntemler / fonksiyonlar ('öz' parametre yok) ve örnek yöntemler ('öz' içerir) arasındaki ilişkiyi açıklığa kavuşturur. Bir örnek yöntemi, başvuruda bulunmadığınız sürece, ana sınıfının farkında değildir. Diğer dillerde, ana hatlarıyla belirttiğim ayırt edici özellik, sadece sözdizimsel şekerin arkasına gizlenmiş. Her şeyi başarabilmek için bir seçeneğim olsaydı, önce Python'da OOP öğrenmeye başlardım.
Evan Plaice,

18

Java

Dönemi. Tam dur. Hikayenin sonu.

Nereden başlamalı? Oh, nereden başlayacağımı biliyorum: Java delicesine karmaşık, çirkin ve aptal ve doğuştan kırılmış jenerikler. Daha da anlatmalı mıyım? :( Tamam, o zaman: silmeyi yazın .

Daha sonra deterministik olmayan bir kaynak yönetimi var. Kewl ayak avcısı!

Sırada ne var? Oh evet: Java'nın aptal regexleri benim en rahatsız edici, bir şey sığır etidir. Yeterli ters eğik çizgi olmamasından kaç kez hortumlandığımı sayamıyorum. Bu, bu binyılın hiçbir Unicode özelliğine erişememekten daha kötüdür - ki bu tam bir boğadır. On yıl dolmuş yıllar !!! Tamamen işe yaramaz. Çöp.

Sonra karakter sınıfı kısayollarının ASCII dışı üzerinde çalışmadığı bir hata var. Ne kraliyet acısı! Ve kullanmayı düşünmeyin bile \p{javaWhiteSpace}; Birçok yaygın Unicode boşluk kodu koduyla doğru olanı yapmaz.

Bir \p{javaJavaIdentifierStart}mülk olduğunu biliyor muydun ? Ne düşünüyorlardı ki? Bu kadar akıllı gözetmenlerin zorlaştığına sevindim.

CANON_EQ bayrağını kullanmayı denediniz mi? Bunu biliyor musunuz gerçekten yapar ve ne değil mi? “Unicode dava” denen şey nasıl? Bir sürü normal kılıf işi hiç işe yaramıyor.

Ardından bakım yapılabilir regex'leri yazmakta zorlanıyorlar. Java hala çok satırlı karakter dizileri yazmayı çözemedi, bu yüzden böyle çılgınca şeyler yazıyorsunuz:

    "(?= ^ [A-Z] [A-Za-z0-9\\-] + $)      \n"
  + "(?! ^ .*                             \n"
  + "    (?: ^     \\d+      $            \n"
  + "      | ^ [A-Z] - [A-Z] $            \n"
  + "      | Invitrogen                   \n"
  + "      | Clontech                     \n"
  + "      | L-L-X-X                      \n"
  + "      | Sarstedt                     \n"
  + "      | Roche                        \n"
  + "      | Beckman                      \n"
  + "      | Bayer                        \n"
  + "    )      # end alternatives        \n"
  + ")          # end negated lookahead   \n" 

Bütün bu yeni hatlar hangileri? Oh, sadece Java aptallığı. Perl yorumlarını kullandılar , satır sonuna kadar giden Java yorumlarını ( aptallar! ). Öyleyse onları \noraya koymazsan , kalıplarının kalanını kesersin. Duh ve çift duh!

Java'da regex'leri kullanmayın: bir şeyleri parçalamak istediğinizde biteceksiniz, hepsi çok acı verici ve bozuk. İnsanların buna katlandığına inanamıyorum. Bazıları yapmaz .

O zaman Java'nın aptal saçma sapan kodlamaları hakkında konuşmaya başlayabiliriz. Birincisi, Java'nın charchar'ları Unicode olsa bile, varsayılan platform kodlamasının her zaman bazı 8-bit kodlamalar olduğu gerçeği var. O zaman kodlama hatası konusunda bir istisna yaratmadılar. Bir bok almayı garanti ediyorsun. Veya buna ne dersiniz:

OutputStreamWriter(OutputStream out) 
          Creates an OutputStreamWriter that uses the default character encoding.
OutputStreamWriter(OutputStream out, Charset cs) 
          Creates an OutputStreamWriter that uses the given charset.
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 
          Creates an OutputStreamWriter that uses the given charset encoder.
OutputStreamWriter(OutputStream out, String charsetName) 
          Creates an OutputStreamWriter that uses the named charset.

Fark ne? Kodlama hatasınız varsa bunlardan sadece birinin istisna oluşturacağını biliyor muydunuz ? Gerisi sadece onları susturur.

Öyleyse Java karakterlerinin aptallığı bir karakteri tutmak için yeterli değil! Ne halt ediyorlar? Bu yüzden onlara charchars derim. Doğru çalışmasını beklerseniz, bunun gibi bir kod yazmanız gerekir:

private static void say_physical(String s) { 
    System.out.print("U+");
    for (int i = 0; i < s.length(); i++) {
        System.out.printf("%X", s.codePointAt(i));
        if (s.codePointAt(i) > Character.MAX_VALUE) { i++; }  // UG!
        if (i+1 < s.length()) { System.out.printf("."); }
    }
}

Ve kim hiç bunu yapmayı düşünüyor? Kimsenin yanında.

Kaç karakter var "\uD83D\uDCA9"? Bir yada iki? Onları nasıl saydığına bağlı. Regex motoru elbette mantıksal karakterlerle uğraşır, böylece bir desen ^.$başarılı olur ve bir desen ^..$başarısız olur. Bu delilik burada gösterilmiştir:

String { U+61, "\u0061", "a" }  =~ /^.$/ => matched.
String { U+61, "\u0061", "a" }  =~ /^..$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" }  =~ /^.$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" }  =~ /^..$/ => matched.
String { U+DF, "\u00DF", "ß" }  =~ /^.$/ => matched.
String { U+DF, "\u00DF", "ß" }  =~ /^..$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" }  =~ /^.$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" }  =~ /^..$/ => matched.
String { U+3C3, "\u03C3", "σ" }  =~ /^.$/ => matched.
String { U+3C3, "\u03C3", "σ" }  =~ /^..$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" }  =~ /^.$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" }  =~ /^..$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" }  =~ /^.$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" }  =~ /^..$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" }  =~ /^.$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" }  =~ /^..$/ => matched.

Bu aptallık, çünkü tamamen makul bir yazı yazamazsınız \u1F4A9, ya da elbette bunu yapamayacağınız bir uyarı almıyorsunuz. Sadece yanlış olanı yapıyor.

Stoooopid.

Biz varken, tüm \uXXXXgösterim doğuştan beyin ölümüdür. Java önişlemcisi ( evet, beni duydunuz ) Java'dan önce alır, bu nedenle mükemmel makul şeyler yazmanız yasaktır "\u0022", çünkü Java bunu gördüğü zaman önişlemcisi çevirdiği için """kaybedersiniz. Oh, bekle değil bu bir regex bu olsa da! Böylece "\\u0022"gayet iyi kullanabilirsiniz .

Riiiiiiiight!

Java'da isatty(0)arama yapmanın bir yolu olmadığını biliyor muydunuz ? Böyle düşünceler düşünmenize bile izin verilmiyor. Senin için iyi olmaz.

Ve sonra bütün sınıf patlaması yok oluyor.

Ya da aynı kaynak dosyadaki Java kaynak dosyanızın kodlamasını belirtmenin bir yolu olmadığı için kaybetmezsiniz. Bir kez daha bilmek istiyorum: NE BÜYÜK İNDİRENLER NELERDİR?

Deliliği durdur! İnsanların bu çöplere katlandığına inanamıyorum. Bu tam bir şaka. Çirkin Java deliliğinin sapanlarından ve oklarından muzdarip olmak yerine bir Walmart selamlayıcısı olmayı tercih ederim. Her şey kırıldı ve onlar sadece bunu düzeltemez, onlar olmaz bunu düzeltmek.

Bu, kendilerini bir printf()işleve sahip olmayı yasa dışı kılan bir dille gururlandıran kurnaz askerler tarafından aynı . Gee, bu kesinlikle iyi çalıştı, ama olmadı !?

Sırf uyuşuk gözler. Kaltak tokatlamak onlar için çok kibar. Ben montajcı programlamak isteseydim, yapardım. Bu kurtarılabilir bir dil değil. Kral Çıplak.

Ondan nefret ediyoruz. Sonsuza dek nefret ediyoruz . Bırak öl öl öl !


Haha, iyi biri, java'ya dokunmam çünkü anlattığın gibi çok cilalı değil. \ UD83D'ye gelince ... Bunun daha iyi bir yol olduğunu söylemeliyim ki, bunun yerine karakter dizileri UTF-16 değil, UTF-32 değilsin. UTF-16-ness'i kabul ederseniz, regex doğru olanı yapar; Bu sikikleri .gength arama.
Roman Starkov

4
-1. Regexp Yorumlar ve Unicode kaçar hariç, bahsettiğim şeylerden hiçbiri sözdizimi unsuru değildir.
Jörg W Mittag 21:10

3
@ Jörg, sentaks ister misin? Tamam iyi: Java, tanımlayıcılara ESC ve NUL dahil kontrol karakterleri koymanıza izin verir. WTH düşünüyorlardı ???
Kasım’da

4
tchrist: Vay canına! Eğer bir Java programını bir daha ^H
yazarsam

1
Şimdi, daha iyi hissediyor musun?

16

İşlev işaretçi bildirimi sözdizimini C ve C ++ ile:

(int)(*f)(int, int);

fPointee iki ints sürebilir ve bir geri dönmek adlı bir işlev işaretçisi bildirir int.

Böyle bir sözdizimini çok tercih ederim:

f: (int, int) => int

Eğer bir işlev işaretçisi bildirmek istediğini farz edelim gkimin pointee iki alabilir ints ve bir fonksiyon intve intkarşı intve bir dönüş int.

C veya C ++ gösterimi ile bunu şöyle ilan edersiniz:

(int)(*g)(int, int, int(int, int));

Yukarıda belirtilen gösterimle aynı şey şöyle açıklanabilir:

g: (int, int, (int, int) => int) => int

İkincisi çok daha sezgisel IMO.


Bir yana: OOC adı verilen programlama dili bu sözdizimini düzeltir (ve C ve C ++ 'daki diğer bazı sözdizimsel sorunları). Ana sayfasını buradan inceleyin .


Kabul ediyorum, bazı "düz C" / "C ++" desteklemiyor ya da farklı sözdizimi ile desteklemiyor. Özel bir sözdizimi, bir programlama dili özelliğinin ne zaman desteklendiğini göstermeye yardımcı olur. Bu yüzden C # "temsilci" sözdizimini ekledi.
umlcat

Temsilciler sadece sözdizimsel şeker değildir, çünkü aynı zamanda nesneyi de depolarlar (C ++ üye işlev işaretçilerinin aksine, normal işlev işaretçilerinden bile daha kötü sözdizimi olan)
Tamás Szelei

14

Java'da ayrıntı bilgisi.

yani:

public static final int 

6
Nazaran? (15 karakter)
TheLQ

7
const intÖrneğin : ile karşılaştırıldığında .
OscarRyz

11
"genel statik final int x = 4;" Haskell'deki "x = 4" ile karşılaştırıldığında.
Jared Updike

24
Bu ayrıntısızlık değil. Yazmayı deneyin a+(b*c)/d*e+f/g^20kullanarak BigIntegerJava. Bu dil neden operatörün aşırı yüklenmesine izin vermiyor?
MAK

4
@Michael: Bu maliyetle kendilerinden korunmaları gereken programcılar, hiç programlama yapmadan kendilerini en iyi şekilde koruyabilir (ve herkes için acıyı azaltabilir): D.
MAK

12

\ we \ wouldnt \ fix \ our \ ayrıştırıcı ad alanı sözdizimi PHP

Sözdizimi sadece çirkin değil, yeni geliştiriciler dizelerdeki ad alanları hakkında düşünmek zorunda kaldıklarında kafa karışıklığına neden olur. (PHP, çift tırnaklı dizgilerdeki ters eğik çizgileri kaçış dizileri olarak enterpolasyona \you\should\never\do\thatsokar.


Evet, biri daha iyisini yapmanın bir yolunu düşünüyordu: ama PHP her operatörün farklı olması gerektiğinde ısrar ediyor. Yanlış kullanım sorununun burada ne olduğunu merak ediyorum.
Alan Pearce

Anlaşmak. PHP ad alanları gerektiriyor, ancak bu sözdizimi onu
mahvetti

9

Kıvrımlı ayraçların bir if / while / for ifadesinden sonra isteğe bağlı olabileceği gerçeğini küçümsüyorum.

Özellikle de kodunu gördüğümde,

if (...)
    for(...)
        ... One line of stuff ...

Lütfen diş tellerini takın ve onunla bitirin.


6
Hmm .. buna bağlı. Yalnızca bir koşulu denetleyen ve bir hata kodu döndüren (veya bir istisna atarken) "Ifs İptal Et" için, ayraçları görmemeyi tercih ederim.
Billy ONeal

4
Kendinizi aşırı çok düzeyli davalarla sınırlı tuttuğunuzda aynı fikirdeyim, ancak ifadeniz battaniyedir. Basit, tek ifadeli ifs ve loop'lar için kısa formlara sahip olma yeteneğinde büyük fayda var.
Timwi

2
Kuralım: yalnızca bir ifade birden fazla alt öğe gerektiriyorsa veya böyle bir ifade içeriyorsa , parantez içine alınmalıdır. Böylece for (...) while (...) if (...) { x(); y(); }, for (...) { while (...) { if (...) { x(); y(); } } }tabii ki, uygun girinti olarak yeniden yazılabilir .
Jon Purdy

6
Ben tam tersiyim - tamamen gereksiz oldukları zaman diş telleri koymakta ısrar eden insanları hor görüyorum. Sadece programlamayı öğren.
Jerry Coffin

3
Parantezleri tek tek if ifadelerinde bile seviyorum. Bir programın akışını daha iyi takip etmemi sağlıyor.
Ricardo Santos,

9

VBScript Mantıksal Operatörleri Yok

Neredeyse her mantıklı dilin aksine, VBScript mantıksal operatörler yerine bitsel operatörler kullanır. Uygulamada bunun anlamı nedir? Eric Lippert'in işaret ettiği gibi :

If Blah = True Then Print "True!" Else Print "False!"

ve

If Blah Then Print "True!" Else Print "False!"

VBScript'te aynı DEĞİL!

Daha da kötüsü olsa da, aşağıdaki deyimi böylece VBScript hiçbir kısa devre değerlendirme bu vasıta olduğunu çökmesine programı ise Blah, ISNothing

If (Not Blah Is Nothing) And (Blah.Frob = 123) Then
...

Bu doğru, VBScript , ilk yanlış olsa bile AND karşılaştırmasının her iki bölümünü de değerlendirecek ! Sadece batağını içeri al ...


3
İçinde bir böcek avladığınıza If x Then ... If Not x Then ... End If ... End Ifve x'in 2 olduğunu anlayana kadar, gerçekten VB / VBScript'te programlanmadınız.
Konfigüratör

7

EDIT: Yorumlardaki tartışmaların ardından kendimi daha iyi açıklamak için bu cevabı güncellemeye karar verdim.

İşlev işaretçilerinin C'ye bakma şeklinden gerçekten nefret ediyorum. Genellikle, herhangi bir değişken bildirimi bir tuple gibi görünür: type varname; Öte yandan, işlev işaretçisi bildirimleri, işlev adından önce * işaretli bir işlev bildirimi gibi görünür. Bunu bir işaretçi türünün açıklaması olarak kabul edebilirim, ancak C'de bu, o tür bir değişkenin hem türünü hem de adını bildirir. Bu bana göre tutarsız görünüyor çünkü tür bildirimleri aksi halde değişken bildirimlerden farklıdır. struct myStruct{int X; int Y;}sadece bir tür tanımlar, adında bir değişken tanımlamaz myStruct. Aynı şekilde , fonksiyon bildirimlerinde tip bildirimlerinin ve değişken bildirimlerin tek bir atomik ifadede gruplandırılması için bir neden göremiyorum ve type varname;yapıdan sapmayı da takdir etmiyorum .

Birileri bunun bazı spiral kurallarla tutarlı olduğuna ve bunun olabileceğine işaret etti, ancak iyi bir sözdiziminin işareti, kendini açıklayıcı ve içsel mantığının açık olduğudur. Spiral kuralı hiçbir şekilde açık değildir.


1
Bu, dilin geri kalanıyla uyumludur, bu nedenle belki de yakınınız genel olarak C beyannamelerinin sözdizimi ile ilgilidir. Go'da kullanılan sözdizimini mi tercih edersiniz ?
finnw

Hangi şekilde tutarlı? Genellikle geçerli: type varname; Ve bir yapı gibi yeni bir bileşik tür yarattığımızda, ilk önce beyan, belki bir typedef ile gelir ve daha sonra bu tip bir değişken yaratırız. Bir işlev işaretçisi bildirdiğimizde, int (* foo) (int arg1, int arg2), sonra bir işleve iletilen bir argüman türü olarak kullanılır: void newFoo (int (* foo) (int arg1, int art2) )) .... ve bir değişken olarak: foo = a_compatible_func; Önce bir işlev bildiriminin, ardından bir sonraki değişken bildiriminin daha tutarlı olacağını düşünüyorum: typedef int (* foo) (int, int) MyFoo; MyFoo myfoo;
EpsilonVector

Bu yüzden aldın typedef.
zneak

4
@EpsilonVector: İşlev göstergesinin sözdiziminin kötü olduğu konusunda hemfikirdirim, ancak okunmasını kolaylaştıran basit bir kural vardır. Saat yönünde sarmal kuralı (belki de gördünüz mü?): C-faq.com/decl/spiral.anderson.html
greyfade

1
EpsilonVector: Değişken adından başka bir işaretçi değişken bildiriminden ne beklediğinizden emin değilim .

6

VBScript'te noktalı virgül - veya yokluğu

Bütün günümü, her satırın sonunda noktalı virgül bekleyen dillerde çalışarak geçiriyorum. VBScript'te satırın sonuna bir tane ekleyin ve kodunuz artık çalışmaz.


4
Bunu oylama, özellikle noktalı virgülleri sevdiğim için değil, ancak VB'nin uzun çizgilerle teşvik etmesinden nefret ettiğimden dolayı, satır çizgilerini bu kadar rahatsız edici hale getirerek.
Shog9

6

Giriş / çıkış değişkenleri. Ben tamamen argümanlar içindeyim (iyi olduğum şey), dışarı çıkan argümanlar da iyidir, ancak bu iki durumu iletmesi gereken bir argüman beni kızdırır.

Burada hedeflediğim şey, bir parametreden girdi alan ve daha sonra bu girişin üzerine bir çıktı yazan fonksiyonlardır. Güncellemek için bir nesneyi referansa göre iletmek sorun değil. Ancak, çoğunlukla ilkel türler için, bir nesneyi almak, kullanmak, sonra tamamen değiştirmek, benim için doğru değil. Argümanın anlamını bir inout aracılığıyla değiştirmemelisiniz .


Aklında hangi dilin var? Eğer C # ise, her zaman açık olduğu için can sıkıcı olduğu konusunda hemfikir olurdum (C ++ 'dan farklı olarak) Ayrıca, argümanları giriş / çıkış olarak bildirmek zorunda olduğunuz herhangi bir ana dili bilmiyorum.
finnw

@finnw Sana bir dil görmedim vardı söylemek iniçin inya argümanlar, ben sadece onlar hakkında konuşuyorum. Ayrıca, benim görüşüme göre, hiçbir şey bir içeri / dışarı argümanını affedemez ve onları açık yapmak acıyı hafifletmez. İşleve yardımcı olacak bir değere sahip yerel bir değişkeni başlatmak zorunda değil ve aynı değişkene sahip olmak için hiçbir neden olmamalıdır, daha sonra aniden işlev buraya koymaya karar vermişse bunu içerir. Bu ikisi farklı olmalı. Her zaman.
zneak

Üzgünüm orada çok açık değildim. "Tüm argümanların dolaylı olarak + dışarıda olduğu herhangi bir dili bilmiyorum" demek istedim, yani bu özelliği kullanmak zorunda değilsiniz, ancak meşru kullanım durumları var (örneğin struct, yeni değerin değere bağlı olduğu yerde güncelleme Aynı başka bir alanın struct.)
finnw

@finnw classBir işlev tarafından değiştirilen referans ( C # 'daki nesnelerin örnekleri gibi ) benim için iyidir. Sabit olmayan yapılardan hoşlanmam dışında struct, refanahtar kelimeyi güncellemek için anahtar kelimelerle geçmek de sorun değil. Gerçekten nefret ettiğim şey girdi ile çıktı üzerine yazılmasıdır . Aklıma gelen en iyi örnek Berkeley soketinin acceptişlevidir: socklen_t*Girişte, struct sockaddr*geçtiğinizin boyutunu içermesi gereken bir argüman gerekir ; ve çıktıda, kendisine yazılmış bayt sayısını içerecektir. Bu suçlu olmalı.
zneak

Bunun kötü olduğunu kabul ediyorum (IIRC bazı Win32 I / O işlevleri aynı şeyi yapıyor), ancak bu özelliğin kötüye kullanılmasıdır (işlev çağrısı, yalnızca değişkenin anlamını değiştirmez, yalnızca değerinin değil) kendisi kötü.
finnw

6

C ve C ++ ile dizi bildirimleri.

Genelde, değişken bildirimi biçimindedir type variable_name. Bu bildirimleri soldan sağa kolayca okuyabilirsiniz. Ama int foo[size]ilk önce fooint olarak ilan ettiği gibi görünüyor , ve sonra daha fazla okuyorsunuz ve bu fooların "tamsayı dizisi" türünü görüyorsunuz. int[size] fooçok daha iyi okur.

Programcılar benzer bir nedenle böyle işaretçileri beyan zaman ben de nefret: int *foo. Nedense çözemedim, bu tipik bir şekilde yazılmış.


1
İşaretçi bildirimleri: böyle yazılır çünkü ' ' türüne değil değişken adına bağlanır. Öyleyse int* a, b;* ilan etmeza ve bişaretçi olarak; sadece a. Bu nedenle, onu yazmak daha iyidir int *a, b;(ya da iki beyanname olarak yazmak daha iyidir).
Steve Melnikoff

İyi bir nokta. Çok kötü *, türe bağlı değil.
Jacob

2
Ve bu fonksiyon işaretçilerine hiçbir şey söylememek ... void(int) *f;? Hayır:void (*f)(int);
Kendine not et -

Modern C ++ 'da işaretçilere ve dizilere çok az ihtiyaç vardır.
fredoverflow

2
@Steve Melnikoff: Bu cevabı + 1'ledim, ancak int* a, b;bahsettiğiniz sorunun çok daha korkunç olduğunu düşünüyorum .
j_random_hacker

5

Java’da gereksiz parametreleştirme:

HashMap<String,HashMap<String,String>> foo = new HashMap<String, HashMap<String, String>>();

Derleyicinin başka hangi tip parametrelerinin olabileceğini düşünüyorsunuz foo ?


4
Umarım Java'nın (sınırlı) türdeki çıkarımlarından haberdarsınızdır? HashMap<String,HashMap<String,String>> foo = Maps.newHashMap();
finnw

1
Java 7:HashMap<String,HashMap<String,String>> foo = new HashMap<>();
Bart van Heukelom 18:10

5
İstediği herhangi bir tipe sahip olabilir, tipler yine de silinir ...
konfigüratör

Tür çıkarım eksikliği, yani?
missingfaktor

What other type parameterization does the compiler think foo could have?- Sebebi ne olursa olsun ham tip - sanki aklı başında birisi çiğ ve parametreli çeşitlerle bile karışabiliyormuş gibi.
maaartinus

5

İnsanlar zaten =vs. hakkında şikayette bulunduğundan ==, daha kötü bir alternatifi belirteyim. PL / I de vardı :=ve =, ama bir şey "Açıkçası" bir atama iken, bu kullandığınız paçayı izin verecek =bunu yapmak için. Kullanılması :=Bir şey zorlamak izin derleyici aksi bir karşılaştırma olarak yorumlar bir durumda bir atama olması.

Ne yazık ki, derleyici her zaman beklediğiniz gibi şeyler üzerinde karar vermedi. Sadece bir açık örnek düşünün:

A = B = 0;

Şimdi, en "sıradan" dilleri tanıyan çoğu insan için, bunun anlamı açıktır - hem A hem de B'ye 0 atayın. PL / I, biraz ... farklı olsa da. Sadece dilin (delice) tasarımcıları tarafından bilinen nedenlerden ötürü, birincisi =bir ödev =olarak yorumlanır , ikincisi bir karşılaştırma olarak yorumlanır. Bu nedenle, bu, B'yi 0 ile karşılaştırır ve daha sonra A ile karşılaştırmanın sonucunu atar ("false" nin 0 ile sonuçlandığı C-tarzı kuralını izleyerek 1'de "true" olur).

Yani, eğer B 0 ise, o zaman A 1 olur. Aksi takdirde, A 0 olur. Başka bir deyişle, A ve B'ye aynı değeri atamak yerine, bu aslında A'nın B ile aynı değere sahip olmamasını sağlar .

Alt satır: C / C ++ / PHP tarzı başlangıçta bir ağrı gibi görünse de, alternatif çok daha kötü 1 .

1 Teknik olarak, başka bir alternatif daha var: =Her zaman karşılaştırma ve ödevin her zaman gerekli olduğu anlamına gelen Pascal stili :=. Bunu bir süre kullandıktan sonra, (en azından benim için), ödevini karşılaştırmaktan daha yaygın olduğu açıktır, ki bu ikisini netleştirmek için fazladan "eşya" isteyecekseniz, ödevleri kesinlikle temiz ve basit tutmalısınız. Karşılaştırmalarda fazladan "grunge" yapılmasını gerektirir, bunun tersi de geçerlidir.


1
==Eşitlik ve :=görev için bile kullanmayı teklif ediyorum . Bu şekilde yazmanız gereken daha çok şey var, ancak yalnızlıktan =kaçınmak, böcekleri önlemeye yardımcı olur.
maaartinus

@ maartinus: en azından bana mutlak en kötü ihtimal gibi geliyor, ama hayat böyle ...
Jerry Coffin

3

Perl

  1. Keşke Perl yazmama izin verse if($x < 10) do_something();. Şu anda, bunu ya do_something() if($x < 10);da olarak yazmak zorundasın if($x < 10) { do_something(); }.

9
do_something() if ($x < 10);o kadar da kötü değil.
zneak

Bu değildir ve çoğu durumda if(..) ...önyüklemekten daha temizdir , çünkü tüm ifadeleri sağa sıraya sokabilirsiniz. Ama gerçekten söylemek istediğim zamanlar var if($x < 10) do_something();ve bu da Perl'nin izin vermeyeceği bir talihsizlik.
Gaurav

7
Yazıp if ($x<10) do_something(); and_call_me(); sonra neden hiç aramadığınızı merak edene kadar talihsiz bir durum. C ve ailesinin bu tür bir hatayı önlemek için diş tellerine ihtiyacı olmasını diliyorum.
AShelly

2
@AShelly: ya da neden her zaman bir çağrı alıyorsunuz, aslında.
zneak

1
@ zneak S hariç else. (Keşke EXPR1 if COND else EXPR2Python'da olduğu gibi)
Ming-Tang

3

reinterpret_cast<unsigned long>c ++ 'da. Bu işlem yabancı API'lerle başa çıkmada ve sayısal kesinliği sağlamada kullanışlıdır, neden yazması çok acı verici olmalı?


17
Size gerektirmeyen bir kod yazmak için çaba göstermeniz gerektiğini size hatırlatmak çirkindir. :)
greyfade

Bana göre bu iyi bir teorik bilgisayar bilimi türünün bir argümanıdır, ama benim deneyimlerime göre, kaçınmak için çok yararlı (Ancak, deneyimlerimin çoğu düz eski C, bu yüzden muhtemelen bir önyargım var).
AShelly

5
Bu gerçekten teorik bir CS argümanı değil: reinterpret_castC ++ 'da kullanmak çok güçlü bir kod kokusu. Zamanın% 99'u, kullanmak üzere olduğunuzda, olasılıklar, ihtiyaç duymamanız gerek - muhtemelen yanlış bir şeyler yaptınız. Zamanın% 1'i, C ile etkileşime giriyorsunuz, reinterpret_castaksi takdirde yapamadığında bir şeyin çalışmasını sağlamak için tip sistemini bozuyor. Bu genellikle kötü bir şey.
greyfade

3

İçin ... lütfen JavaScript yapı ve foreach PHP'de yapı dizileri üzerinde döngü zaman. Her ikisi de hataları yazmayı doğru kodlardan daha kolaylaştırır.


3
Vay, bu saçmalık. “Doğru koddan daha”. Çekip gitmek.
Jonathan Sterling

Güvenli bir şekilde kullanmak için fazladan kod yazmak zorunda kalırsam, kitabımda yanlış kullanımı daha kolaydır. For ... in, prototipteki nesneler üzerinde yineleme yapmadığınızdan emin olmak için ekstra kontroller gerektirir ve foreach daha sonra referansları temizlemenizi veya dizideki son değerin üzerine yazma riskini almanızı gerektirir.
Joeri Sebrechts

değişen referanslara sahip foreach (& operatörü) ünlü bir hatadır ...
umlcat 15.03.2011

1
Kafam karıştı, javascript'te "for..in" yapısının bozulduğunun yaygın bir bilgi olduğunu düşündüm ... neden bu rahatsız edici?
lvilnis

2

İşaretçilerin dizileri veya C / C ++ ile işaretçiler dizileri. Hala bunlar hakkında kafam karıştı.


3
Yazıyı geriye doğru okuyun. int[]*tamsayı dizisine bir göstericidir ve tamsayılara int*[]bir işaretçi dizisidir. İle çalışır constçok s: int* constoysa tamsayılar için sürekli bir işaretçidir const int*ve int const*sabit tamsayılar işaretçileri (ya da tam sayı sabitler).
zneak

@zneak: "Sağdan sola" çalışmıyor, belirtilen "saat yönünde sarmal" / " tersyüz " kuralına bakın.

Veya, sadece typedef kullanın ve karışıklık olmaz.
Billy ONeal

Modern C ++ 'da işaretçilere ve dizilere çok az ihtiyaç vardır.
fredoverflow

4
tchrist: Doğru değil. , 10 inçlik bir dizinin işaretçisine işaret int (*p)[10];eder p. Öyleyse sizeof (int) == 4, 40 ile p++ilerleyecektir p.
j_random_hacker


1

Javascript / Java etc, karşılaştırmaya eşittir, örneğin, eğer (a == 1)

(A = 1) ise kaç kez yazarım?

Bir insan olarak bunu mükemmel okudum. Ama kahrolası tercüman / derleyici der ki, "hey, a'ya 1 atayım, sonra a'nın 1'e eşit olup olmadığını kontrol edin ve evet olduğuna inanır mısın!

Beni duvara sürükledi.

(a == 1) çok daha az okunabilirse ve tercüman / derleyici ne demek istediğimi bilmeli; diğer birçok küçük dil (VB) yüzlerce yıldır başarıyla çalışmaktadır.


Ne if (a = true)demek istiyorsun?
Tom Hawtin - tackline

2
Atama sadece bir değer döndürmemelidir. Bazen yararlıdır, ancak çoğu durumda sadece boyundaki bir ağrıdır.
konfigüratör,

Javascript'te JSLint bunu sizin için yakalayacaktır.
Zachary K,

Sorun şu ki, şartlarda atama faydalı olabilir. <tt> while (element = list-> next ()) </tt> oldukça okunaklı buluyorum. Bu yüzden kaldırılmasını istediğimden emin değilim.
İnka,

3
@ Tom: Bu, booleanları anlamadığınız anlamına gelir. Eğer demek istiyorsan if (a == true), sadece yaz if (a). Eğer demek istiyorsan a = true, ififade gereksiz.
dan04,


0

structPointer->memberC / C ++ ile. Başkasının kodunu okumak için iyi olabilir, ama hoşuma gitmedi. Biri yerine iki karakter ... ne kadar yer kaybı!


2
Ne yazık ki, .işaretçi olmayan bir nesnenin üyeleri için geçerli olandan ayırt edilmesi gerekir . Belirsiz sözdizimi kötü, mmmkay?
greyfade

2
@greyfade: Yep! Derleyici olamaz çünkü muhtemelen bir işaretçi-to-yapı türünü kullanarak anlarsınız ve örtük dereference uygulamak için onun tür sistemi kurallarını kullanabilirsiniz. Hayır, bu çılgın konuşma! (Ve yine de bir şekilde yanlış anladığınızda size bir hata mesajı verebilir.) Sözdizimi hakkında belirsiz bir şey yoktur. Sadece C her zamanki gibi bir saçmalık karışıklığı olmak. Delphi, kurallara aykırı kurallar uygulamaktadır, eğer gerçekten işaretçiler gerektiren karanlık köşelerde çalışıyorsanız, kesinlikle bir ayrıştırıcıyı karıştırmadan yapılabilir ...
Mason Wheeler

5
@Mason: vakalar gibi ne hakkında shared_ptr, nerede ->içerdiği tipini erişir ve .özelliklerini erişir shared_ptrkendisi? Üzgünüm, ama burada tamamen aynı fikirde değilim.
Billy ONeal

2
daha kötü olabilirdi. Herhangi bir şeyin-> üyelerine erişmek için kullanmak zorunda olduğunuz PHP olabilir .
Carson Myers,

1
@maaartinus: Açıkça anlaşılmayan işlem sırasına çok fazla dayanan herhangi bir kod, yazacağım kod değildir.
Billy ONeal,

0

Parantez içinde Scala çok satırlı kod

Örneğin:

class Foo(
         val bar: String,
         val baz: Int,
         val bing: String,
         val bong: Boolean
 ) extends Model {
   // body here
 }

Aslında ondan aldığın şey müthiş. Sizin için yapıcı ile alıcı ve ayarlayıcıları oluşturur. Ama kesinlikle çirkin ve kod girintisi ile ilgili tüm zihinsel modelleri kırıyor ve temelde bir tarafta Java ile diğer tarafta Lisp ile bir tür tuhaf sandviç içindeymişim gibi hissetmeme neden oluyor. (Oh, bekle ... bu Scala'nın noktası.)


Kafam karıştı - parantez içindeki kısım mı ( val barve benzeri) mi yoksa kaşlı ayraçlar içindeki kısım extends Modelmı (sonraki kısım )? (Bu kodda parantez yok)
Billy ONeal 18:10

3
Parantez içindeki kısım. Ben ingiliz'im. Onları parantez olarak adlandırıyoruz, kahretsin, çünkü bu durumda parantez içinde bir rol üstlenmiyorlar.
Tom Morris,

2
Bu şekilde girintiliyse o kadar da kötü görünmüyor: pastebin.com/h9qC8XGg
missingfaktor

Bu yapıcı parametre listelerini yatay yazmayı daha çok okunabilir buluyorum, özellikle de sadece birkaç parametrem olduğunda.
MJP

Bana bir yöntem gibi görünüyor. Simula gibi. Eski güzel okul
Tom Hawtin -
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.