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)
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.
Ketika akhir file tercapai, jika program tidak dapat diuraikan sebaliknya, maka titik koma dimasukkan.
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.
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.
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.
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.
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
+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!
// 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!
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.
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: '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:
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:
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.
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)
"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.
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 ...
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.
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.
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.
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?
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.
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
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(); }.
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?
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.
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.
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).
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.
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
1
Verbosity di kelas anonim Java. Mudah-mudahan akan segera diperbaiki.
structPointer->memberdalam C / C ++. Mungkin baik untuk membaca kode orang lain, tetapi saya tidak suka itu. Dua karakter, bukannya satu ... buang-buang ruang!
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.
Jawaban:
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)
Contoh:
sumber
Sintaks Java-bean karena kurangnya properti C #
GAH !!!
Masalah yang saya miliki dengan ini
getX
,getY
,getZ
,getAnotherAnnoyingField
,getWhyIHateJavaBeans
,getThisIsVerbose
,getGAH
... ah ada itu,hashCode
.sumber
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.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.
sumber
The
switch
pernyataan (dalam C, C ++, C #, Java, dll)Berikut adalah contoh mengapa saya merasa sangat tidak nyaman:
Ini tidak dapat dikompilasi karena variabelnya
i
dideklar 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 ekstrabreak
. Ini akan jauh lebih baik: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 suatuswitch
pernyataan urutan label kasus tidak masalah, tetapi dalamif
/else
itu.sumber
goto
atau serupa), seperti yang sudah terjadi di C #.case Foo of 1,3: Result := 'odd'; 2,4: Result := 'even' end;
.break
adalah default dan hanya fallthrough yang perlu ditentukan. Tidak perlu lagi mengingat untuk berkomentar! :)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:
sumber
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.
Anda dapat menggunakan titik dua untuk menempatkan dua perintah pada satu baris, tetapi dengan cepat berubah berantakan dalam kode aktual.
sumber
Dim Hurp As New Collection
, jika Anda mengaksesHurp
saat mengacuNothing
, itu akan secara ajaib diinisialisasi sebelum akses. Jika Anda secara eksplisit mengaturnyaNothing
dan menyentuhnya lagi, itu akan dibangkitkan ... terkesiap!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.
sumber
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
$needle
dan 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 :
Lucunya, PHP tampaknya konsisten secara internal dengan urutan ini di mana semua fungsi string tampaknya digunakan
$haystack, $needle
sementara 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!sumber
$needle
,$haystack
karena mengingatkan cara mengatakan menemukan jarum di tumpukan jerami .strstr
. Begitu indah tanpa arti.Python
self
parameter dalam definisi metode instansumber
self
terjadi dengan mudah dan menghabiskan waktu.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:
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
\n
di 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:
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:
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: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
\uXXXX
notasi 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 !
sumber
^H
) :)Sintaks deklarasi fungsi penunjuk dalam C dan C ++:
Itu menyatakan pointer fungsi bernama
f
yang pointee dapat mengambil duaint
s dan mengembalikan sebuahint
.Saya lebih suka sintaksis seperti ini:
Katakanlah Anda ingin mendeklarasikan pointer fungsi
g
yang pointee-nya dapat mengambil duaint
s dan sebuah fungsi dariint
danint
keint
, dan mengembalikan sebuahint
.Dengan notasi C atau C ++, Anda akan mendeklarasikannya sebagai:
Dengan notasi yang diusulkan di atas, hal yang sama dapat dinyatakan sebagai:
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 .
sumber
Verbositas di Jawa.
yaitu:
sumber
const int
misalnya.a+(b*c)/d*e+f/g^20
menggunakanBigInteger
di Jawa. Mengapa bahasa ini tidak membolehkan operator kelebihan beban?\ 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\that
di string dikutip ganda bukannya string tunggal dikutip akan menyebabkan baris baru, tab dan bencana.)sumber
Saya benci fakta bahwa kurung kurawal dapat opsional setelah pernyataan if / while / for.
Terutama ketika saya melihat kode seperti,
Harap masukkan kawat gigi dan selesaikan.
sumber
for (...) while (...) if (...) { x(); y(); }
lebih baik ditulis ulangfor (...) { while (...) { if (...) { x(); y(); } } }
, dengan lekukan yang tepat, tentu saja.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 :
dan
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
Blah
yaituNothing
Itu benar, VBScript akan mengevaluasi kedua bagian perbandingan DAN, bahkan jika yang pertama salah! Biarkan saja meresap ...
sumber
If x Then ... If Not x Then ... End If ... End If
dan mengetahui bahwa x adalah 2, Anda belum benar-benar memprogram dalam VB / VBScript.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 bernamamyStruct
. 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 daritype 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.
sumber
typedef
.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.
sumber
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.
sumber
in
untukin
argumen 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.struct
mana nilai baru tergantung pada nilai dari bidang lain yang samastruct
.)class
objek dalam C #) yang dimodifikasi oleh suatu fungsi tidak masalah bagi saya. Selain itu saya tidak suka struct non-konstan, melewatistruct
denganref
kata kunci untuk memperbarui tidak apa-apa, juga. Yang benar-benar saya benci adalah ketika input ditimpa dengan output. Contoh terbaik yang dapat saya pikirkan adalahaccept
fungsi soket Berkeley : ia membutuhkansocklen_t*
argumen yang, pada input, harus berisi ukuran yangstruct sockaddr*
Anda lewati; dan pada output, akan berisi jumlah byte yang telah ditulis untuknya. Ini harus kriminal.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. Tetapiint foo[size]
pada awalnya terlihat seperti menyatakanfoo
sebagai int, dan kemudian Anda membaca lebih lanjut dan melihat bahwa jenis "array of integer".int[size] foo
membaca 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.sumber
int* a, b;
juga * tidak menyatakana
danb
sebagai pointer; hanyaa
itu. Karenanya lebih baik untuk menuliskannyaint *a, b;
(atau bahkan lebih baik menuliskannya sebagai dua deklarasi).*
sekali tidak mengikat ke jenis.void(int) *f;
? Tidak:void (*f)(int);
int* a, b;
masalah yang Anda sebutkan jauh lebih mengerikan.Parameterisasi berlebihan di Jawa:
Parameterisasi tipe apa lagi yang dipikirkan oleh kompiler
foo
?sumber
HashMap<String,HashMap<String,String>> foo = Maps.newHashMap();
HashMap<String,HashMap<String,String>> foo = new HashMap<>();
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.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:
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.sumber
==
untuk kesetaraan dan:=
untuk tugas. Dengan cara ini Anda harus mengetik lebih banyak lagi, tetapi menghindari kesepian akan=
membantu menghindari bug.Perl
if($x < 10) do_something();
. Saat ini, Anda harus menuliskannya sebagaido_something() if($x < 10);
atau sebagaiif($x < 10) { do_something(); }
.sumber
do_something() if ($x < 10);
tidak terlalu buruk.if(..) ...
mem-boot, karena Anda bisa mendapatkan semua ekspresi untuk berbaris di sebelah kanan. Tapi ada saatnya saya benar-benar ingin mengatakannyaif($x < 10) do_something();
, dan sangat disayangkan Perl tidak membiarkan saya.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.else
. (Saya berharap iniEXPR1 if COND else EXPR2
seperti yang dimiliki Python)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?sumber
reinterpret_cast
dalam 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_cast
memecah sistem tipe untuk membuat sesuatu berfungsi ketika tidak bisa. Itu biasanya hal yang buruk.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.
sumber
Pointer array atau array pointer di C / C ++. Saya masih bingung tentang ini.
sumber
int[]*
adalah pointer ke array bilangan bulat, danint*[]
merupakan array pointer ke bilangan bulat. Bekerja dengan baik denganconst
s juga:int* const
adalah pointer konstan untuk bilangan bulat, sedangkanconst int*
danint const*
pointer ke integer konstan (atau konstanta integer).int (*p)[10];
menyatakanp
sebagai pointer ke array 10 int. Jikasizeof (int) == 4
, makap++
akan naikp
pada 40.Fakta bahwa Python bergantung pada pemformatan teks.
sumber
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.
sumber
if (a = true)
seharusnya berarti?if (a == true)
, tulis sajaif (a)
. Jika Anda maksudkana = true
, makaif
pernyataan itu berlebihan.Verbosity di kelas anonim Java. Mudah-mudahan akan segera diperbaiki.
sumber
structPointer->member
dalam C / C ++. Mungkin baik untuk membaca kode orang lain, tetapi saya tidak suka itu. Dua karakter, bukannya satu ... buang-buang ruang!sumber
.
, yang berlaku untuk anggota objek non-pointer. Sintaks ambigu buruk, mmmkay?shared_ptr
, di mana->
mengakses tipe yang terkandung dan.
mengakses propertishared_ptr
itu sendiri? Maaf, tapi saya sangat tidak setuju di sini.->
untuk mengakses anggota apa pun .Scala kode multi-line dalam kurung
Contohnya:
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.)
sumber
val bar
dan seterusnya) atau bagian dalam kurung kurawal (bagian berikutextends Model
)? (Tidak ada tanda kurung dalam kode itu)