Elemen sintaks apa yang paling Anda benci dalam bahasa pemrograman yang sering Anda gunakan? [Tutup]


27

Tidak peduli seberapa besar Anda menyukai bahasa pemrograman, selalu ada beberapa detail di dalamnya yang tidak sebaik mereka.

Dalam pertanyaan ini, saya ingin secara khusus fokus pada elemen sintaks. Dalam bahasa pemrograman yang sering Anda gunakan (mungkin bahasa pemrograman favorit Anda, atau mungkin yang terpaksa Anda gunakan di tempat kerja), elemen sintaksis apa yang menurut Anda paling tidak dapat dibaca, tidak jelas, tidak nyaman, atau tidak menyenangkan?


@Nathan Taylor, bukan untuk pertanyaan ini, tetapi untuk pertanyaan lain .
finnw

Apakah pertanyaan ini dimodifikasi? Karena ketika saya menjawab, itu tidak fokus pada "elemen sintaks" ... Saya harus mengubah jawaban saya sekarang.
Talvi Watia

@ Talvi: Tidak, ini tentang sintaks sejak awal.
Timwi

@Timwi aneh, itu pasti kasus 'menjawab pertanyaan berpikir itu berbeda' saat itu.
Talvi Watia

Jika Anda dapat memilih dan berpikir ini adalah pertanyaan yang berguna atau memiliki jawaban yang berguna di bawah ini, silakan pilih Situs StackExchange membutuhkan suara untuk membangun komunitas yang baik. Anda dapat memberikan 30 suara per hari, jangan sia-siakan. Khusus pengguna dengan reputasi tinggi dan penghitungan suara rendah diberikan, harap baca ini: meta.programmers.stackexchange.com/questions/393/…
Maniero

Jawaban:


39

Penyisipan titik koma dalam JavaScript.

Saya belum pernah benar-benar digigit olehnya, tapi itu adalah ide yang sangat buruk sehingga membuat kepala saya berputar.


Inilah aturannya (dari ECMA-262 Bagian 7.9)

  1. Ketika program mengandung token yang tidak diizinkan oleh tata bahasa formal, maka titik koma dimasukkan jika (a) ada garis putus pada titik itu, atau (b) token yang tidak terduga adalah penjepit penutup.
  2. Ketika akhir file tercapai, jika program tidak dapat diuraikan sebaliknya, maka titik koma dimasukkan.
  3. Ketika "produksi terbatas" ditemukan dan berisi terminator garis di tempat di mana tata bahasa berisi anotasi "[tidak ada LineTerminator di sini]", maka tanda titik koma dimasukkan.

Contoh:

return 1; // returns 1

return
1; // returns undefined

2
JavaScript: Bahasa Pemrograman yang Paling Banyak Disalahpahami Dunia ~ Douglas Crockford
pramodc84

Ya, banyak yang berharap JavaScript menjadi "bahasa bentuk bebas", tetapi tidak.
Andreas Rejbrand

13
Masuk akal setelah Anda menyadari bahwa JavaScript dirancang untuk membuat HTML, yang juga memiliki sejarah panjang dalam mencoba mengartikan apa yang "benar-benar berarti" kode Anda ketika itu tidak valid secara sintaksis. (Lihat Prinsip Robustness kadang-kadang - bencana terbesar dalam sejarah komputasi.)
Mason Wheeler

7
Jenis kesalahan ini, bagi saya adalah bau kode yang programmernya ceroboh dan tidak pernah bekerja dengan sebagian besar bahasa "ketat" formal yang biasanya akan menyebabkan kesalahan sintaksis untuk membiarkan semi-colon keluar.
Talvi Watia

7
Wohoo, akhirnya orang lain yang juga menganggap Prinsip Robustness adalah bencana yang membuat HTML berantakan sama sekali.
Roman Starkov

39

Sintaks Java-bean karena kurangnya properti C #

/**
 * 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 !!!

Masalah yang saya miliki dengan ini

  • Terlalu banyak kode - Memiliki bidang yang didokumentasikan, metode pengambil yang didokumentasikan, dan metode setter yang didokumentasikan. Contoh yang sangat mendasar ini memiliki 20 baris kode untuk satu properti
  • Clutter metode daftar - "Biarkan saya menemukan metode itu, tangan di: getX, getY, getZ, getAnotherAnnoyingField, getWhyIHateJavaBeans, getThisIsVerbose, getGAH... ah ada itu, hashCode.
  • Beberapa bidang dokumentasi menyebabkan dokumentasi yang buruk, ketinggalan zaman, atau hilang - Mengganggu ketika mencoba memahami kode apa yang dikerjakan
  • Jadi pihak ketiga yang menjengkelkan harus datang dengan plugin untuk melakukan ini dengan mudah - Sendok , Hiu , antara lain.

9
Sekali lagi ketika kode sangat bertulang sehingga membutuhkan alat penghasil otomatis, ada sesuatu yang salah. Saya seorang NetBeans, tetapi juga memiliki kemampuan untuk secara otomatis menghasilkan getter dan setter. Tapi Javadoc jatuh dari syn, itu masih verbose, itu masih berantakan javadoc, dll
TheLQ

11
Jika Anda membutuhkan getter untuk semuanya, maka ada sesuatu yang salah dengan kode klien .
finnw

7
Memiliki getter dan setters merusak enkapsulasi. Lapangan mungkin juga menjadi public. Anggota harus bersifat pribadi dan harus dimanipulasi dengan bijaksana oleh kelas dengan logika tingkat yang lebih tinggi, bukan dengan getter dan setter dari kode klien.
greyfade

6
@greyfade: Jika bersifat publik, Anda tidak dapat dengan mudah mengubah apa yang dilakukan kode pengaturan (Anda harus mengubah semua kode yang mengatur bidang dari luar).
Bart van Heukelom

3
@SHiNKiROU: Java terlihat bersih? Saya belum pernah mendengar itu sebelumnya! Keluhan utama saya dengan Java adalah kenyataan bahwa hal yang tampaknya sederhana membutuhkan puluhan baris kode yang perlu saya abaikan secara mental.
konfigurator

33

Sensitivitas Ruang Putih.

Python mengganggu saya dalam hal ini. Maksudku, bagaimanapun aku indentasi dengan benar, tapi itu menggangguku sehingga aku harus melakukannya . Membuat bagian presentasi dari sintaks membuat saya kesal.


8
Anda akan belajar menyukainya
user10008

2
sintaksis adalah presentasi
Winston Ewert

32

The switchpernyataan (dalam C, C ++, C #, Java, dll)

Berikut adalah contoh mengapa saya merasa sangat tidak nyaman:

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

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

Ini tidak dapat dikompilasi karena variabelnya idideklar ulang dalam cakupan yang sama. Ini sepertinya detail kecil, tapi itu sering menggigit saya. Saya dapat menambahkan kurung keriting untuk mengurangi itu, tetapi akan lebih baik jika kurung keriting menjadi bagian wajib dari sintaks, dan tidak ada tingkat lekukan ekstra yang berlebihan. Saya juga sangat benci harus menulis ekstra break. Ini akan jauh lebih baik:

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

Ini membuatnya lebih seperti rantai if/ else, yang merupakan hal yang baik karena secara semantik juga mirip. Setidaknya dalam C # itu masih tidak akan menjadi hal yang sama namun, karena dalam suatu switchpernyataan urutan label kasus tidak masalah, tetapi dalam if/ elseitu.


1
Sayangnya, sintaksis Anda yang disempurnakan menghilangkan apa yang, bisa dibilang, merupakan fitur terbesar switch di sebagian besar bahasa ini: Fall-through. "Perangkat Duff" dalam C adalah contoh sempurna dari nilai "fitur-salah" tertentu ini. Hal serupa juga terjadi dalam bahasa seperti C untuk menggunakan fall-through dalam interpreter dan program serupa.
greyfade

7
Tidak, itu tidak menghilangkannya. Ini hanya mengharuskan dibuat lebih eksplisit (menggunakan gotoatau serupa), seperti yang sudah terjadi di C #.
Timwi

8
@ Greyfade: Setiap kode yang menggunakan perangkat Duff di C harus mati dengan mengerikan. Compiler membuat keputusan yang lebih baik tentang hal-hal semacam ini daripada Anda.
Billy ONeal

4
@greyfade: Delphi mendapat sekitar masalah nilai beberapa hanya memungkinkan beberapa indeks dalam hal: case Foo of 1,3: Result := 'odd'; 2,4: Result := 'even' end;.
Frank Shearar

3
@jkerian: Sekarang bayangkan breakadalah default dan hanya fallthrough yang perlu ditentukan. Tidak perlu lagi mengingat untuk berkomentar! :)
Timwi

27

Deklarasi Array di VB.NET

Saya selalu lupa bahwa ketika menginisialisasi array tetap di VB.NET, Anda menentukan batas atas array dan bukan jumlah elemen seperti di C / C ++, PHP, atau Java. Selain VB6 (kami tidak akan pergi ke sana ...), saya tidak bisa memikirkan bahasa lain yang melakukannya dengan cara ini:

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

Saya pikir semua bahasa BASIC melakukan ini ... Saya tahu bahwa BASIC asli dan QBasic lakukan.
Michael K

OMG itu benar-benar menghebohkan .... +1
mikera

25

VB6 - Deklarasi dan Penugasan Variabel Terpisah

Sebagian besar bahasa memungkinkan Anda mendeklarasikan variabel dan menetapkannya dalam satu baris kode; VB6, di sisi lain, memaksa Anda untuk menggunakan dua.

Dim i as Integer
i = 0

Dim derpderp as Collection
Set derpderp = new Collection

Anda dapat menggunakan titik dua untuk menempatkan dua perintah pada satu baris, tetapi dengan cepat berubah berantakan dalam kode aktual.

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

7
+1 karena harus menggunakan VB6 sebagai bahasa yang paling sering Anda gunakan.
Walter

9
Saya menggunakannya setiap hari..sob.
systempuntoout

Tidakkah Pascal memiliki sintaks yang serupa? Saya selalu berpikir itu jahat.
greyfade

1
Ada kasus khusus: jika Anda Dim Hurp As New Collection, jika Anda mengakses Hurpsaat mengacu Nothing, itu akan secara ajaib diinisialisasi sebelum akses. Jika Anda secara eksplisit mengaturnya Nothingdan menyentuhnya lagi, itu akan dibangkitkan ... terkesiap!
Jeffrey Hantin

1
+1 juta untuk Derp. Derp de derp de tiddly tum de derp.
MVCylon

24

Mengomentari dalam CSS

//tidak berkomentar baris kode seperti itu dalam banyak bahasa lain, seperti PHP dan Javascript. Meskipun /* this is commented out */berfungsi, saya lebih suka menggunakan //.

Ini merepotkan, karena separuh waktu saya lupa saya mengedit CSS dan kemudian harus kembali dan memperbaiki kesalahan.


Anda akan berpikir pada hari ini bahwa CSS mentah akan dianggap sebagai kode objek.
Tom Hawtin - tackline

// berfungsi dengan baik untuk berkomentar CSS. Saya selalu melakukannya. Yang saya lakukan hanyalah mengetik sampah. tetapi tampaknya berhasil dengan melompati garis yang tidak dapat dihapus.
MVCylon

1
@MVCylon Jika Anda menggunakan // untuk mengomentari baris, apa pun setelah baris berikut juga dilewati. {Dalam gaya khusus itu} Dengan kata lain, itu GAGAL karena garis-garis itu tidak boleh dilewati.
Talvi Watia

20

PHP - urutan argumen yang konsisten

PHP memiliki sejumlah fungsi praktis untuk melakukan hampir semua operasi yang dapat Anda pikirkan pada array atau string. Banyak dari operasi ini membutuhkan penggunaan a $needledan a $haystack, tetapi fungsi yang berbeda membawanya dalam urutan yang berbeda. Fungsi mana yang membutuhkan argumen mana yang merupakan salah satu fakta yang tidak diserap otak saya, tidak peduli seberapa sering saya menemukan mereka!

Ambil fungsi in_array dan strstr :

// 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])

Lucunya, PHP tampaknya konsisten secara internal dengan urutan ini di mana semua fungsi string tampaknya digunakan $haystack, $needlesementara fungsi array adalah sebaliknya, tetapi ini bisa memakan waktu untuk membiasakan seseorang yang baru mengenal PHP. Ada posting bagus tentang ExpressionEngine yang membicarakan tentang kekhasan khusus ini secara lebih rinci, serta diskusi tentang daftar bug PHP , yang menampilkan respons yang sangat singkat dari tim PHP!

helly@php.net
Gunakan IDE yang layak.

2
Lebih mudah mengingat urutannya $needle, $haystackkarena mengingatkan cara mengatakan menemukan jarum di tumpukan jerami .
kiamlaluno

3
Protip: dalam fungsi array, jarum lebih dulu. dalam fungsi string, tumpukan jerami lebih dulu.
GSto

17
Saya suka namanya strstr. Begitu indah tanpa arti.
konfigurator

5
Cukup baca entri yang tertaut di bugtracker PHP. Serius, wtf? oO Imho konsistensi adalah masalah yang valid untuk API apa pun dan hanya merespons dengan "gunakan IDE yang layak" bukan jawaban yang valid. Setidaknya itu bisa dikatakan tidak terlalu meradang oleh para devs.
Baelnorn

2
Jujur, yang membuatku gila tentang ini adalah bahwa itu seharusnya tidak menjadi fungsi sama sekali! Seharusnya hanya metode: $ haystack-> find ($ needle). Dilakukan kesepakatan.
riwalk

19

Python

self parameter dalam definisi metode instan


Dalam metode kelas, biasanya bernama cls dan menggunakan self bertentangan dengan konvensi.

Sebenarnya masuk akal jika Anda memikirkannya. Itu sama dengan mendeklarasikan metode pribadi dalam bahasa lain, parameter mandiri hanya eksplisit dalam python yang tersirat dalam bahasa lain. Jika Anda menginginkannya secara implisit tambahkan dekorator @classmethod sebelum deklarasi metode. Lihat docs.python.org/library/functions.html#classmethod . Mempelajari detail bagaimana ini bekerja akan memberi Anda wawasan tentang bagaimana hal itu dilakukan dalam bahasa lain secara implisit.
Evan Plaice

4
Saya mengerti alasannya dan mengapa dibiarkan di sana neopythonic.blogspot.com/2008/10/… tapi saya masih tidak menyukainya
Goran Pero

@Evan Plaice: 'parameter diri hanya eksplisit dalam python di mana itu tersirat dalam bahasa lain' Itu hanya satu bagian dari cerita. Bagian lainnya adalah python diketik setiap minggu. Bersama-sama itu mengerikan, lupa selfterjadi dengan mudah dan menghabiskan waktu.
maaartinus

@maaartinus Kemudian tambahkan dekorator metodemetode ke metode instan Anda. Tidak ada hubungannya dengan 'mengetik dengan lemah'. Itu hanya membuat hubungan antara metode / fungsi statis (tidak ada parameter 'diri') dan metode contoh (termasuk 'diri') jelas. Metode instance tidak mengetahui kelas induknya kecuali jika Anda memberikan referensi untuk melakukannya. Dalam bahasa lain ciri khas yang saya uraikan hanya tersembunyi di balik gula sintaksis. Jika saya punya pilihan untuk melakukan semuanya, saya akan mulai belajar OOP dengan Python terlebih dahulu.
Evan Plaice

18

Jawa

Periode. Titik. Akhir dari cerita.

Mulai dari mana? Oh, saya tahu harus mulai dari mana: Java generik yang sangat rumit dan jelek serta bodoh dan secara inheren rusak . Perlu saya katakan lebih? :( Oke, kalau begitu: ketik erasure .

Lalu ada manajemen sumber daya non-deterministik. Feetcher Kewl!

Apa selanjutnya? Oh yeah: regex bodoh Jawa adalah daging sapi yang paling menjengkelkan dan menggelisahkan saya. Saya tidak bisa menghitung berapa kali saya disemprot dengan tidak memiliki cukup banyak serangan balasan. Ini bahkan lebih buruk daripada tidak memiliki akses ke properti Unicode dari milenium ini - yang benar-benar sempurna. Sepuluh tahun berlalu !!! Benar-benar tidak berguna. Buang itu.

Lalu ada bug yang tidak berfungsi pada pintasan kelas karakter pada non-ASCII. Apa yang menyakitkan kerajaan! Dan bahkan tidak mempertimbangkan untuk menggunakan \p{javaWhiteSpace}; itu tidak melakukan hal yang benar dengan beberapa titik kode spasi putih Unicode yang sangat umum.

Tahukah Anda ada \p{javaJavaIdentifierStart}properti? Apa yang mereka pikirkan? Senang sekali mereka mendapat peepers cerdas seperti itu pada hard disk.

Pernah mencoba menggunakan bendera CANON_EQ? Apakah Anda tahu itu memang benar , dan apa yang tidak dilakukannya? Bagaimana dengan yang disebut "Unicode case"? Sekelompok hal casing normal tidak berfungsi sama sekali.

Kemudian mereka membuat sulit untuk menulis regex yang bisa dipertahankan. Java masih belum menemukan cara menulis string multiline, jadi Anda akhirnya menulis hal-hal gila seperti ini:

    "(?= ^ [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" 

Apa semua baris baru itu? Oh, kebodohan Jawa saja. Mereka menggunakan komentar Perl, bukan komentar Java ( idiot! ) Yang masuk sampai akhir baris. Jadi jika Anda tidak meletakkannya \ndi sana, potonglah seluruh pola Anda. Duh dan duh ganda!

Jangan menggunakan regex di Jawa: Anda hanya akan ingin menghancurkan sesuatu, itu semua sangat menyakitkan dan rusak. Saya tidak percaya orang-orang tahan dengan ini. Beberapa tidak .

Kemudian kita dapat mulai berbicara tentang omong kosong bodoh Jawa dengan penyandian. Pertama, ada fakta bahwa pengkodean platform default selalu beberapa pengkodean 8-bit timpang meskipun charkar Java adalah Unicode. Lalu ada bagaimana mereka tidak memunculkan pengecualian pada kesalahan pengkodean. Anda dijamin akan mendapatkan omong kosong. Atau bagaimana dengan ini:

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.

Apa bedanya? Tahukah Anda bahwa hanya satu di antaranya yang akan memunculkan pengecualian jika Anda memiliki kesalahan penyandian? Sisanya hanya memberangus mereka.

Lalu ada kebodohan karakter Jawa tidak cukup untuk memegang karakter! Apa yang mereka pikirkan? Itu sebabnya saya menyebut mereka charchars. Anda harus menulis kode seperti ini jika Anda mengharapkannya berfungsi dengan benar:

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("."); }
    }
}

Dan siapa yang pernah berpikir untuk melakukan itu? Di sebelah siapa pun.

Ada berapa karakter "\uD83D\uDCA9"? Satu atau dua? Tergantung pada bagaimana Anda menghitungnya. Mesin regex tentu saja berurusan dengan karakter logis, sehingga suatu pola ^.$akan berhasil dan suatu pola ^..$akan gagal. Kegilaan ini ditunjukkan di sini:

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.

Kebodohan itu adalah semua karena Anda tidak dapat menulis yang masuk akal \u1F4A9, juga tidak ada peringatan bahwa Anda tidak dapat melakukannya. Itu hanya melakukan hal yang salah.

Stoooopid.

Sementara kita melakukannya, seluruh \uXXXXnotasi secara bawaan mati otak. Java preprocessor ( ya, Anda dengar saya ) melakukannya sebelum Java melakukannya, jadi Anda dilarang menulis hal-hal yang masuk akal seperti "\u0022", karena pada saat Java melihat itu, preprocessornya telah mengubahnya menjadi """, jadi Anda kalah. Oh, tunggu, tidak jika itu dalam regex! Jadi Anda bisa menggunakan dengan "\\u0022"baik.

Riiiiiiiight!

Apakah Anda tahu tidak ada cara di Jawa untuk melakukan isatty(0)panggilan? Anda bahkan tidak diizinkan berpikir seperti itu. Itu tidak baik untukmu.

Dan kemudian ada seluruh kekejian classpath.

Atau fakta bahwa tidak ada cara untuk menentukan pengkodean file sumber Java Anda di file sumber yang sama sehingga Anda tidak kehilangan itu? Sekali lagi saya ingin tahu: APA NERAKA MEREKA BERPIKIR‽‽‽

Hentikan kegilaan! Saya tidak percaya orang-orang tahan dengan sampah ini. Ini benar-benar lelucon. Saya lebih suka menjadi penyapa Walmart daripada menderita umban dan panah kegilaan Jawa yang keterlaluan. Itu semua rusak, dan mereka tidak hanya tidak bisa memperbaikinya, mereka juga tidak akan memperbaikinya.

Ini oleh orang-orang foxy-anggur yang sama yang membanggakan diri pada bahasa yang membuatnya ilegal untuk memiliki printf()fungsi. Astaga, itu benar - benar bekerja dengan baik, kan !?

Numbskull belaka. Menampar jalang terlalu baik untuk mereka. Jika saya ingin memprogram assembler, saya akan melakukannya. Ini bukan bahasa yang bisa diselamatkan. Kaisar tidak punya pakaian.

Kami membencinya. Kami membencinya selamanya . Biarkan mati, mati, mati !


Haha, bagus, saya tidak menyentuh java karena terlalu kasar seperti yang Anda gambarkan. Adapun \ uD83D ... baik saya kira cara yang lebih baik untuk mengatakan ini adalah bahwa Anda lebih suka string bukan UTF-16 tetapi UTF-32 sebagai gantinya. Jika Anda menerima UTF-16-ness maka regex melakukan hal yang benar; itu adalah panggilan. Panjang yang mengacaukan.
Roman Starkov

4
-1. Dengan pengecualian komentar regexp dan Unicode lolos, tidak satu pun dari hal-hal yang Anda sebutkan adalah elemen sintaksis.
Jörg W Mittag

3
@ Jorg, Anda ingin sintaks? Oke, Java memungkinkan Anda untuk menempatkan karakter kontrol, termasuk ESC dan NUL, dalam pengidentifikasi. APA yang mereka pikirkan ???
tchrist

4
@tchrist: Wow! Jika saya pernah menulis program Java lagi, semua variabel saya akan memiliki nama yang terdiri dari berbagai karakter backspace ( ^H) :)
j_random_hacker

1
@tchrist, merasa lebih baik sekarang?

16

Sintaks deklarasi fungsi penunjuk dalam C dan C ++:

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

Itu menyatakan pointer fungsi bernama fyang pointee dapat mengambil dua ints dan mengembalikan sebuah int.

Saya lebih suka sintaksis seperti ini:

f: (int, int) => int

Katakanlah Anda ingin mendeklarasikan pointer fungsi gyang pointee-nya dapat mengambil dua ints dan sebuah fungsi dari intdan intke int, dan mengembalikan sebuah int.

Dengan notasi C atau C ++, Anda akan mendeklarasikannya sebagai:

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

Dengan notasi yang diusulkan di atas, hal yang sama dapat dinyatakan sebagai:

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

Belakangan IMO jauh lebih intuitif.


Selain itu: Bahasa pemrograman yang disebut OOC memperbaiki sintaks ini (dan berbagai masalah sintaksis lainnya dalam C dan C ++). Lihat beranda di sini .


Setuju, beberapa "plain C" / "C ++" tidak mendukungnya, atau mendukungnya dengan sintaks yang berbeda. Sintaks khusus, membantu menunjukkan kapan fitur bahasa pemrograman didukung. Itu sebabnya C # menambahkan sintaks "delegate".
umlcat

Delegasi bukan hanya gula sintaksis karena mereka juga menyimpan objek (bertentangan dengan pointer fungsi anggota C ++, yang memiliki sintaks lebih buruk daripada pointer fungsi biasa)
Tamás Szelei

14

Verbositas di Jawa.

yaitu:

public static final int 

6
Dibandingkan dengan? (15 chars)
TheLQ

7
Dibandingkan dengan: const intmisalnya.
OscarRyz

11
"int akhir public static x = 4;" dibandingkan dengan "x = 4" di Haskell.
Jared Updike

24
Itu bukan kata kerja. Coba tulis a+(b*c)/d*e+f/g^20menggunakan BigIntegerdi Jawa. Mengapa bahasa ini tidak membolehkan operator kelebihan beban?
MAK

4
@Michael: programmer yang perlu dilindungi dari diri mereka sendiri dengan biaya ini dapat melindungi diri mereka sendiri (dan mengurangi rasa sakit bagi orang lain) dengan tidak memprogram sama sekali: D.
MAK

12

\ we \ wouldnt \ memperbaiki \ sintaks namespace parser kami di PHP

Sintaksnya tidak hanya jelek, itu menyebabkan kebingungan ketika pengembang yang lebih baru harus berpikir tentang ruang nama dalam string. (PHP interpolates backslashes dalam string dikutip ganda sebagai escape sequence. Mencoba untuk mewakili namespace seperti \you\should\never\do\thatdi string dikutip ganda bukannya string tunggal dikutip akan menyebabkan baris baru, tab dan bencana.)


Ya, seseorang memikirkan cara yang lebih baik :: untuk melakukan ini, tetapi PHP bersikeras bahwa setiap operator harus berbeda. Saya ingin tahu apa masalah penyalahgunaan di sini.
Alan Pearce

Setuju. PHP membutuhkan ruang nama, tetapi sintaksisnya gagal
umlcat

9

Saya benci fakta bahwa kurung kurawal dapat opsional setelah pernyataan if / while / for.

Terutama ketika saya melihat kode seperti,

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

Harap masukkan kawat gigi dan selesaikan.


6
Hmm .. ini tergantung. Untuk "Abort Ifs" yang hanya memeriksa suatu kondisi dan mengembalikan kode kesalahan (atau melempar pengecualian), saya lebih suka tidak melihat kawat gigi.
Billy ONeal

4
Saya setuju jika Anda membatasi diri pada kasus multi-level yang ekstrem, tetapi pernyataan Anda terlalu kosong. Ada kegunaan besar dalam kemampuan untuk memiliki bentuk pendek untuk ifs dan loop pernyataan sederhana, tunggal.
Timwi

2
Aturan saya: hanya jika suatu pernyataan memerlukan banyak substasi atau jika memuat pernyataan seperti itu, maka pernyataan tersebut harus dibungkus dengan kawat gigi. Jadi for (...) while (...) if (...) { x(); y(); }lebih baik ditulis ulang for (...) { while (...) { if (...) { x(); y(); } } }, dengan lekukan yang tepat, tentu saja.
Jon Purdy

6
Saya justru sebaliknya - saya membenci orang yang bersikeras memasang kawat gigi ketika mereka benar-benar tidak perlu. Belajarlah memprogram.
Jerry Coffin

3
Saya sangat suka tanda kurung bahkan dalam pernyataan tunggal. Itu membuat saya mengikuti alur program dengan lebih baik.
Ricardo Santos

9

VBScript Tidak Memiliki Operator yang Logis

Tidak seperti hampir setiap bahasa yang masuk akal, VBScript menggunakan operator bitwise bukan operator logis. Apa artinya ini dalam praktik? Yah, seperti yang ditunjukkan Eric Lippert :

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

dan

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

TIDAK sama dengan VBScript!

Lebih buruk lagi, meskipun, ini berarti bahwa tidak ada hubungan arus pendek evaluasi dalam VBScript sehingga pernyataan berikut akan kecelakaan program anda jika BlahyaituNothing

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

Itu benar, VBScript akan mengevaluasi kedua bagian perbandingan DAN, bahkan jika yang pertama salah! Biarkan saja meresap ...


3
Sampai hari Anda telah berburu bug di dalam If x Then ... If Not x Then ... End If ... End Ifdan mengetahui bahwa x adalah 2, Anda belum benar-benar memprogram dalam VB / VBScript.
konfigurator

7

EDIT: Mengikuti diskusi di komentar saya memutuskan untuk memperbarui jawaban ini untuk menjelaskan diri saya lebih baik.

Aku benar-benar benci cara fungsi pointer terlihat di C. Biasanya setiap deklarasi variabel terlihat seperti tuple: type varname; Deklarasi fungsi pointer di sisi lain terlihat seperti deklarasi fungsi dengan * sebelum nama fungsi. Saya bisa menerima ini sebagai deskripsi tipe pointer, tetapi dalam C ini menyatakan tipe dan nama variabel dari tipe itu. Ini terlihat tidak konsisten bagi saya karena deklarasi tipe berbeda dari deklarasi variabel. struct myStruct{int X; int Y;}hanya mendefinisikan suatu tipe, itu tidak mendefinisikan variabel bernama myStruct. Demikian juga saya tidak melihat alasan untuk deklarasi tipe dan deklarasi variabel untuk dikelompokkan menjadi satu pernyataan atom dalam fungsi pointer, saya juga tidak menghargai penyimpangan dari type varname;struktur.

Seseorang menunjukkan bahwa itu konsisten dengan beberapa aturan spiral, dan itu mungkin terjadi, tetapi tanda dari sintaksis yang baik adalah bahwa ia cukup jelas dan logika internalnya jelas. Aturan spiral tidak jelas dengan cara apa pun.


1
Ini konsisten dengan sisa bahasa, jadi mungkin keluhan Anda tentang sintaksis deklarator C secara umum? Apakah Anda lebih suka sintaks yang digunakan di Go ?
finnw

Konsisten dengan cara apa? Biasanya begini: ketik varname; Dan ketika kita membuat tipe komposit baru, seperti struct, pertama datang deklarasi, mungkin dengan typedef, dan kemudian kita membuat variabel tipe itu. Ketika kita mendeklarasikan pointer fungsi, itu adalah int (* foo) (int arg1, int arg2), yang kemudian digunakan sebagai jenis argumen yang dilewatkan ke fungsi: void newFoo (int (* foo) (int arg1, int art2 )) .... dan sebagai variabel: foo = a_compatible_func; Saya pikir itu adalah deklarasi fungsi pertama, dan kemudian deklarasi var selanjutnya akan lebih konsisten, seperti: typedef int (* foo) (int, int) MyFoo; MyFoo myfoo;
EpsilonVector

Itu sebabnya kamu punya typedef.
zneak

4
@ EpsilonVector: Saya cenderung setuju bahwa sintaks fungsi pointer buruk, tetapi ada aturan sederhana untuk diikuti yang membuatnya lebih mudah dibaca. Aturan spiral searah jarum jam (mungkin Anda sudah melihatnya?): C-faq.com/decl/spiral.anderson.html
greyfade

1
EpsilonVector: Saya tidak yakin apa yang Anda harapkan dari deklarasi variabel pointer untuk mendeklarasikan selain nama variabel.

6

Titik koma di VBScript - atau ketiadaan

Saya menghabiskan sepanjang hari bekerja dalam bahasa yang mengharapkan titik koma di akhir setiap baris. Tambahkan satu ke akhir baris dalam VBScript dan kode Anda tidak berjalan lagi.


4
up-voting ini, bukan karena saya terutama suka titik koma, tetapi karena saya benar - benar benci cara VB mendorong garis yang sangat panjang dengan membuat linebreak jadi tidak nyaman.
Shog9

6

Argumen masuk / keluar. Saya mendukung argumen (untungnya saya), argumen yang keluar juga baik, tetapi argumen yang harus menyampaikan kedua kondisi ini membuat saya kesal.

Apa yang saya targetkan di sini adalah fungsi yang mengambil input dari suatu parameter kemudian menimpa input tersebut dengan beberapa output. Tidak apa-apa untuk melewatkan objek dengan referensi untuk memperbaruinya. Tetapi, sebagian besar untuk tipe primitif, mengambil objek, menggunakannya, lalu mengubahnya sepenuhnya, tidak tepat bagi saya. Anda seharusnya tidak mengubah arti argumen melalui inout.


Bahasa apa yang Anda pikirkan? Jika C # maka saya tidak akan setuju bahwa itu menjengkelkan karena selalu eksplisit (tidak seperti dalam C ++.) Juga saya tidak tahu bahasa apa pun di mana Anda dipaksa untuk menyatakan argumen sebagai masuk / keluar.
finnw

@finnw Saya belum pernah melihat bahasa di mana Anda harus mengatakan inuntuk inargumen juga, saya hanya berbicara tentang mereka. Juga, menurut pendapat saya, tidak ada yang bisa memaafkan argumen masuk / keluar, dan membuat mereka eksplisit tidak menghilangkan rasa sakit. Seharusnya tidak ada alasan untuk menginisialisasi variabel lokal dengan nilai yang membantu fungsi, dan memiliki variabel yang sama ini kemudian tiba-tiba berisi apa pun fungsi yang diputuskan untuk diletakkan di sana. Keduanya harus berbeda. Selalu.
zneak

Maaf saya tidak terlalu jelas di sana. Saya bermaksud mengatakan "Saya tidak tahu bahasa apa pun di mana semua argumen secara implisit masuk + keluar" yaitu Anda tidak dipaksa untuk menggunakan fitur itu, tetapi ada kasus penggunaan yang sah (misalnya memperbarui di structmana nilai baru tergantung pada nilai dari bidang lain yang sama struct.)
finnw

@finnw Objek yang dilewatkan oleh referensi (seperti contoh classobjek dalam C #) yang dimodifikasi oleh suatu fungsi tidak masalah bagi saya. Selain itu saya tidak suka struct non-konstan, melewati structdengan refkata kunci untuk memperbarui tidak apa-apa, juga. Yang benar-benar saya benci adalah ketika input ditimpa dengan output. Contoh terbaik yang dapat saya pikirkan adalah acceptfungsi soket Berkeley : ia membutuhkan socklen_t*argumen yang, pada input, harus berisi ukuran yang struct sockaddr*Anda lewati; dan pada output, akan berisi jumlah byte yang telah ditulis untuknya. Ini harus kriminal.
zneak

Saya setuju itu buruk (IIRC beberapa Win32 I / O fungsi melakukan hal yang sama) tetapi itu adalah penyalahgunaan fitur (panggilan fungsi mengubah arti dari variabel yang lewat, bukan hanya nilainya) dan itu tidak berarti fitur itu sendiri buruk.
finnw

6

Deklarasi array dalam C dan C ++.

Biasanya, deklarasi variabel adalah format type variable_name. Anda dapat dengan mudah membaca deklarasi tersebut dengan cara dari kiri ke kanan. Tetapi int foo[size]pada awalnya terlihat seperti menyatakan foosebagai int, dan kemudian Anda membaca lebih lanjut dan melihat bahwa jenis "array of integer". int[size] foomembaca jauh lebih baik.

Dan saya juga benci kalau programmer menyatakan pointer seperti ini untuk alasan yang sama: int *foo. Untuk beberapa alasan saya belum menemukan, itulah cara khasnya ditulis.


1
Deklarasi penunjuk ulang: ditulis seperti itu karena ' ' mengikat ke nama variabel, bukan tipe. Begitu int* a, b;juga * tidak menyatakan adan bsebagai pointer; hanya aitu. Karenanya lebih baik untuk menuliskannya int *a, b;(atau bahkan lebih baik menuliskannya sebagai dua deklarasi).
Steve Melnikoff

Poin bagus. Sayang *sekali tidak mengikat ke jenis.
Yakub

2
Dan ini untuk mengatakan fungsi pointer ... void(int) *f;? Tidak:void (*f)(int);
Catatan untuk memikirkan sendiri nama

Dalam C ++ modern ada sedikit kebutuhan untuk pointer dan array.
fredoverflow

2
@Steve Melnikoff: Meskipun saya memberi +1 jawaban ini, saya pikir int* a, b;masalah yang Anda sebutkan jauh lebih mengerikan.
j_random_hacker

5

Parameterisasi berlebihan di Jawa:

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

Parameterisasi tipe apa lagi yang dipikirkan oleh kompiler foo?


4
Saya harap Anda mengetahui inferensi tipe Java (terbatas)? HashMap<String,HashMap<String,String>> foo = Maps.newHashMap();
finnw

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

5
Yah itu dapat memiliki jenis apa pun yang diinginkan, jenisnya tetap terhapus ...
konfigurator

Kurangnya inferensi tipe, maksud Anda?
missingfaktor

What other type parameterization does the compiler think foo could have?- Untuk alasan apa pun itu adalah jenis mentah - seolah-olah ada orang yang waras bahkan akan mencampur jenis mentah dan parametrized.
maaartinus

5

Karena orang sudah mengeluh tentang =vs. ==, izinkan saya menunjukkan alternatif yang jauh lebih buruk. PL / Saya memiliki keduanya :=dan =, tetapi ketika ada sesuatu yang "jelas" tugas, itu akan membiarkan Anda lolos menggunakan =untuk melakukannya. Menggunakan :=membiarkan Anda memaksa sesuatu untuk menjadi tugas dalam situasi di mana kompiler akan menafsirkannya sebagai perbandingan.

Sayangnya, kompiler tidak selalu memutuskan hal-hal seperti yang Anda harapkan. Perhatikan satu contoh saja:

A = B = 0;

Sekarang, bagi kebanyakan orang yang akrab dengan sebagian besar bahasa "biasa", arti dari hal ini cukup jelas - tetapkan 0 untuk A dan B. PL / I hanya sedikit ... berbeda sekalipun. Untuk alasan yang hanya diketahui oleh perancang bahasa (gila), yang pertama =ditafsirkan sebagai tugas, tetapi yang kedua =ditafsirkan sebagai perbandingan. Oleh karena itu, ini membandingkan B ke 0, dan kemudian menetapkan hasil perbandingan itu ke A (mengikuti konvensi C-style yang menghasilkan "false" dalam 0 dan "true" dalam 1).

Jadi, jika B adalah 0, maka A menjadi 1. Jika tidak, A menjadi 0. Dengan kata lain, alih-alih menetapkan nilai yang sama ke A dan B, ini sebenarnya memastikan bahwa A tidak dapat memiliki nilai yang sama dengan B.

Intinya: meskipun gaya C / C ++ / PHP awalnya tampak seperti sakit, alternatifnya jauh lebih buruk 1 .

1 Nah, secara teknis, ada alternatif lain: gaya Pascal, di mana =selalu berarti perbandingan dan tugas selalu membutuhkan :=. Setelah menggunakan itu untuk sementara waktu, cukup jelas (setidaknya bagi saya) bahwa penugasan cukup lebih umum daripada perbandingan bahwa jika Anda akan membutuhkan "barang" tambahan untuk menyatukan keduanya, Anda harus menjaga tugas tetap bersih dan sederhana dan membutuhkan "grunge" tambahan untuk perbandingan, bukan sebaliknya.


1
Saya bahkan mengusulkan untuk menggunakan ==untuk kesetaraan dan :=untuk tugas. Dengan cara ini Anda harus mengetik lebih banyak lagi, tetapi menghindari kesepian akan =membantu menghindari bug.
maaartinus

@maartinus: setidaknya bagi saya, itu terdengar seperti kemungkinan terburuk absolut, tapi begitulah hidup ...
Jerry Coffin

3

Perl

  1. Saya berharap Perl biarkan saya menulis if($x < 10) do_something();. Saat ini, Anda harus menuliskannya sebagai do_something() if($x < 10);atau sebagai if($x < 10) { do_something(); }.

9
do_something() if ($x < 10);tidak terlalu buruk.
zneak

Tidak, dan dalam banyak kasus jauh lebih bersih daripada if(..) ...mem-boot, karena Anda bisa mendapatkan semua ekspresi untuk berbaris di sebelah kanan. Tapi ada saatnya saya benar-benar ingin mengatakannya if($x < 10) do_something();, dan sangat disayangkan Perl tidak membiarkan saya.
Gaurav

7
Sangat disayangkan sampai Anda menulis if ($x<10) do_something(); and_call_me(); dan bertanya-tanya mengapa Anda tidak pernah mendapat telepon. Saya berharap C dan keluarga akan membutuhkan kawat gigi, untuk mencegah kesalahan jenis itu.
AShelly

2
@ Ashelly: atau mengapa Anda selalu menerima telepon, sebenarnya.
zneak

1
@ zneak Kecuali no else. (Saya berharap ini EXPR1 if COND else EXPR2seperti yang dimiliki Python)
Ming-Tang

3

reinterpret_cast<unsigned long>dalam c ++. Operasi ini berguna dalam berurusan dengan API asing dan memastikan ketepatan angka, mengapa harus merepotkan dan jelek untuk dilihat?


17
Ini jelek untuk mengingatkan Anda bahwa Anda harus berusaha untuk menulis kode yang tidak memerlukannya. :)
greyfade

Bagi saya itu argumen teoretis ilmu komputer yang bagus, tetapi dalam pengalaman saya, itu terlalu berguna untuk dihindari (Namun, banyak dari pengalaman saya adalah C lama yang biasa, jadi saya mungkin memiliki bias).
AShelly

5
Ini sebenarnya bukan argumen CS teoritis: Menggunakan reinterpret_castdalam C ++ adalah bau kode yang sangat kuat. 99% dari waktu, ketika Anda akan menggunakannya, kemungkinan besar, Anda tidak perlu - Anda mungkin melakukan sesuatu yang salah. 1% lainnya, Anda berinteraksi dengan C. reinterpret_castmemecah sistem tipe untuk membuat sesuatu berfungsi ketika tidak bisa. Itu biasanya hal yang buruk.
greyfade

3

The for ... in construct in JavaScript dan foreach construct dalam PHP saat mengulang array. Keduanya membuatnya lebih mudah untuk menulis bug daripada kode yang benar.


3
Wow, itu omong kosong. "Daripada kode yang benar". Pergi.
Jonathan Sterling

Jika saya harus menulis kode tambahan untuk menggunakannya dengan aman, mereka lebih mudah digunakan salah dalam buku saya. Untuk ... in memerlukan pemeriksaan tambahan untuk memastikan Anda tidak mengulangi objek dari prototipe, dan foreach mengharuskan Anda untuk membersihkan referensi setelahnya atau berisiko menimpa nilai terakhir dalam array.
Joeri Sebrechts

pendahuluan dengan mengubah referensi (& operator) adalah bug yang terkenal ...
umlcat

1
Saya bingung, saya pikir sudah menjadi rahasia umum bahwa konstruk "for..in" dalam javascript rusak ... mengapa ini menyinggung?
lvilnis

2

Pointer array atau array pointer di C / C ++. Saya masih bingung tentang ini.


3
Baca jenis mundur. int[]*adalah pointer ke array bilangan bulat, dan int*[]merupakan array pointer ke bilangan bulat. Bekerja dengan baik dengan consts juga: int* constadalah pointer konstan untuk bilangan bulat, sedangkan const int*dan int const*pointer ke integer konstan (atau konstanta integer).
zneak

@ zneak: "Kanan ke kiri" tidak berfungsi, lihat aturan "searah jarum jam" / "luar dalam" .

Atau, cukup gunakan typedefs dan tidak ada kebingungan.
Billy ONeal

Dalam C ++ modern ada sedikit kebutuhan untuk pointer dan array.
fredoverflow

4
@tchrist: Tidak benar. int (*p)[10];menyatakan psebagai pointer ke array 10 int. Jika sizeof (int) == 4, maka p++akan naik ppada 40.
j_random_hacker


1

Javascript / Java dll, sama dengan perbandingan, misalnya jika (a == 1)

Berapa kali saya menulis jika (a = 1)?

Sebagai manusia saya membacanya dengan sempurna. Tetapi interpreter / compiler darn mengatakan, "hei saya akan menetapkan 1 ke a, lalu periksa apakah a sama dengan 1, dan apakah Anda percaya ya itu!

Membuatku naik tembok.

jika (a == 1) jauh lebih tidak dapat dibaca, dan interpreter / compiler harus tahu apa yang saya maksud; banyak bahasa lain yang lebih rendah (VB) telah berhasil melakukannya selama ratusan tahun.


Apa yang if (a = true)seharusnya berarti?
Tom Hawtin - tackline

2
Tugas tidak seharusnya mengembalikan nilai. Kadang-kadang berguna, tetapi dalam kebanyakan kasus itu hanya rasa sakit di leher.
konfigurator

di Javascript JSLint akan menangkap yang satu itu untuk Anda.
Zachary K

Masalahnya adalah, penugasan dalam kondisi bisa bermanfaat. Saya menemukan <tt> while (elemen = list-> next ()) </tt> cukup terbaca. Jadi saya tidak yakin ingin menghapusnya.
Inca

3
@ Tom: Itu berarti Anda tidak mengerti boolean. Jika Anda maksud if (a == true), tulis saja if (a). Jika Anda maksudkan a = true, maka ifpernyataan itu berlebihan.
dan04


0

structPointer->memberdalam C / C ++. Mungkin baik untuk membaca kode orang lain, tetapi saya tidak suka itu. Dua karakter, bukannya satu ... buang-buang ruang!


2
Sayangnya, harus dibedakan dari ., yang berlaku untuk anggota objek non-pointer. Sintaks ambigu buruk, mmmkay?
greyfade

2
@greyfade: Yap! Karena kompiler tidak mungkin menggunakan aturan sistem tipenya untuk mengetahui kapan Anda menggunakan tipe pointer-to-struct dan menerapkan dereference secara implisit. Tidak, itu omongan gila! (Namun itu masih bisa entah bagaimana memberi Anda pesan kesalahan ketika Anda salah.) Tidak ada yang ambigu tentang sintaks. Hanya saja C menjadi kekacauan otak, seperti biasa. Delphi tidak dereferensi tersirat baik-baik saja, jika Anda benar-benar bekerja di sudut-sudut gelap yang memerlukan pointer ke catatan, sehingga tentu saja dapat dilakukan tanpa membingungkan parser ...
Mason Wheeler

5
@ Alasan: Bagaimana dengan kasus seperti shared_ptr, di mana ->mengakses tipe yang terkandung dan .mengakses properti shared_ptritu sendiri? Maaf, tapi saya sangat tidak setuju di sini.
Billy ONeal

2
Bisa lebih buruk. Bisa jadi PHP, tempat Anda harus menggunakan ->untuk mengakses anggota apa pun .
Carson Myers

1
@maaartinus: Setiap kode yang sangat bergantung pada urutan operasi yang tidak jelas bukan kode yang akan saya tulis.
Billy ONeal

0

Scala kode multi-line dalam kurung

Contohnya:

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

Apa yang sebenarnya Anda dapatkan dari itu luar biasa. Ini menghasilkan konstruktor dan getter dan setter untuk Anda. Tapi itu benar-benar jelek dan menghancurkan semua model mental saya tentang cara indentasi kode dan pada dasarnya membuat saya merasa seperti saya berada di semacam sandwich aneh dengan Java di satu sisi dan Lisp di sisi lain. (Oh, tunggu ... itu agaknya titik Scala.)


Saya bingung - maksud Anda bagian dalam kurung ( val bardan seterusnya) atau bagian dalam kurung kurawal (bagian berikut extends Model)? (Tidak ada tanda kurung dalam kode itu)
Billy ONeal

3
Bagian dalam tanda kurung. Saya Inggris. Kami menyebut mereka sebagai kurung, sial, karena dalam situasi itu mereka tidak melayani peran kurung.
Tom Morris

2
Tidak terlihat terlalu buruk jika menjorok ke bawah dengan cara ini: pastebin.com/h9qC8XGg
missingfaktor

Saya merasa lebih mudah untuk menulis daftar parameter konstruktor ini secara horizontal, terutama ketika saya hanya memiliki beberapa parameter.
MJP

Sepertinya metode bagi saya. Seperti Simula. Sekolah tua yang bagus.
Tom Hawtin - tackline
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.