Apa pro dan kontra dari bahasa yang menggunakan ruang putih vs. {} untuk menunjukkan ruang lingkup? [Tutup]

17

Tampaknya ada konflik tentang apakah lebih baik menggunakan spasi putih atau token seperti tanda kurung untuk menunjukkan ruang lingkup. Saya telah melihat banyak solusi pujian python untuk masalah indentasi yang tidak konsisten, tetapi banyak yang tidak setuju:

Bahasa apa pun yang memiliki spasi putih sebagai token harus mati.

diposting kemudian pada jawaban yang sama:

Saya semacam anti-spasi putih-sebagai-token, sampai saya benar-benar mencobanya. Mungkin membantu bahwa tata ruang putih pribadi saya cukup cocok dengan apa yang semua orang gunakan di python-land. Mungkin karena saya agak minimalis, tetapi jika Anda ingin membuat indentasi, mengapa repot dengan {} s?

Saya dapat melihat beberapa argumen yang jelas untuk setiap sisi:

menggunakan spasi putih:

  • membantu mengurangi lekukan yang tidak konsisten dalam kode
  • membersihkan layar dengan mengganti token yang terlihat dengan spasi untuk melayani tujuan yang sama

menggunakan token:

  • jauh lebih mudah untuk memotong dan menempelkan kode ke tingkat yang berbeda (Anda tidak harus memperbaiki lekukan)
  • lebih konsisten. Beberapa editor teks menampilkan spasi putih secara berbeda.
  • lebih populer saat ini.

Apakah ada poin yang saya lewatkan? Yang mana yang Anda sukai? Adakah kata-kata bijak setelah bekerja dengan satu atau yang lain untuk waktu yang lama?


PS. Saya benci ketika bahasa tidak menggunakan token yang sama untuk setiap struktur kontrol. VB benar-benar menjengkelkan dengan pernyataan End Ifdan End While, sebagian besar bahasa lain hanya menggunakan {} untuk semuanya. Tapi mungkin itu topik untuk pertanyaan yang berbeda ...

Gordon Gustafson
sumber
2
Saya tidak akan mengatakan itu "lebih mudah untuk memotong dan menempel". Itu hanya sedikit lebih mudah.
Kugel
1
Selama Anda menyimpan blok kode kecil dan terorganisir, token sebenarnya tidak menjadi masalah ... omong-omong, cintai tag 'perang suci', lol
Scott
"Beberapa editor teks menampilkan spasi putih secara berbeda.": ?? "lebih populer saat ini.": Popularitas seringkali tidak terkait dengan kualitas ide.
Giorgio
Saya suka sintaksis spasi putih, dan saya suka coding dalam CoffeeScript dan Haskell (ya saya tahu itu sulit). Saya telah mengkodekan banyak dalam JavaScript dan C, dan saya tidak bisa kembali ke}. Namun, ekspresi Lisp ketika diganti dengan kotak div adalah yang terbaik
:)
Saya pikir itu membuat lebih sulit untuk menemukan kesalahan jika Anda harus bergantung pada spasi putih saja. Sebagai contoh: stackoverflow.com/questions/21205836/... Satu-satunya perbedaan antara kode OP dan jawabannya adalah ruang ekstra. Memiliki} untuk membatasi kode mana di dalam for loop dan mana yang tidak jauh lebih jelas.
AncientElevator9

Jawaban:

15

Saya pikir banyak dari kita programmer (termasuk saya sendiri) memiliki kecenderungan untuk "membuat logika" setiap keputusan. Itu bagus, tetapi tidak setiap pertanyaan memiliki jawaban yang logis. Sebagai contoh, saya ragu bahwa koki memposting pertanyaan tentang chefoverflow (jika ada hal seperti itu) meminta pro dan kontra dari pai apel vs pai ceri. Ini adalah pertanyaan yang Anda sukai lebih baik.

Dengan mengingat hal itu, saya pikir jawaban paling sederhana adalah dengan mengatakan "Beberapa orang menyukai kawat gigi, beberapa orang menyukai spasi putih" dan membiarkannya begitu saja.

Jason Baker
sumber
6
Kebetulan: cooking.stackexchange.com
Jon Purdy
Juga, sesuatu yang pro untuk beberapa bisa menjadi penipu bagi yang lain.
Larry Coleman
Poin luar biasa. Secara pribadi saya pikir mereka bekerja bersama, dan selama sope jelas, saya tidak akan mengeluh (banyak).
Michael K
8
Saya tidak setuju dengan analogi Anda. Ada beberapa alasan obyektif untuk percaya bahwa sintaksis yang bergantung pada ruang putih menghambat produktivitas programmer, bahkan pada programmer yang menyukainya. Ini seperti mengatakan bahwa orang tidak menyukai rasa sianida - semua orang hanya "logis" ketika mereka mengatakan itu beracun. Tidak. Tidak peduli seberapa besar kamu menyukainya, itu masih akan membunuhmu.
Timwi
4
PS Kata yang sebenarnya Anda cari dirasionalisasi . Juga, setiap orang memiliki kecenderungan untuk merasionalisasi, bukan hanya programmer.
Timwi
11

Dengan risiko terdengar seperti seorang fanboy mengucapkan, saya pikir semua orang yang mengklaim bahwa spasi putih "membantu mengurangi lekukan tidak konsisten dalam kode" tidak pernah menggunakan Visual Studio. Dengan satu perintah (saya pikir pintasan defaultnya adalah Ctrl + K, D), semua lekukannya konsisten secara instan¹. Lebih jauh lagi, ketika menempelkan kode, lekukan diperbaiki secara instan tanpa harus melakukan apa pun, dan hal yang sama berlaku ketika menulis kode baru atau ketika membungkus sesuatu di dalam ifatau di blok lain (format ulang terjadi saat }diketik). Lebih jauh lagi, menekan Enter setelah pernyataan yang lengkap selalu menempatkan kursor pada level indentasi yang benar untuk pernyataan berikutnya, bahkan jika pernyataan sebelumnya diindentasi lebih jauh karena suatuifatau serupa, membuatnya sangat sulit untuk secara tidak sengaja berpikir bahwa suatu pernyataan masih berada di bawah ifketika itu tidak.

Poin yang saya coba sampaikan bukanlah Visual Studio itu hebat. Poin yang saya coba sampaikan adalah bahwa IDE dapat mengotomatiskan perbaikan indentasi (dan masalah pemformatan lainnya), tetapi hanya jika arti dari program tidak bergantung pada pemformatannya. Ini memberi programmer kesempatan yang lebih besar untuk fokus pada tugas pemrograman yang sebenarnya. Sintaksis seperti Python adalah kontraproduktif: tidak mungkin untuk menulis IDE yang dapat "memperbaiki" lekukan kode Python karena lekukan itu sendiri menentukan beberapa semantik.


¹ (Saya tahu ada kasus khusus yang VS menolak untuk memformat ulang, yaitu array literal yang menjangkau beberapa baris, tapi itu intinya.)

Timwi
sumber
8
Lekukan Python tidak perlu diperbaiki karena tidak rusak (tanpa seseorang memperhatikan!). Mustahil untuk menulis Purify (program yang membantu mendeteksi kebocoran memori) untuk C #, tidak berarti manajemen memori C ++ lebih unggul.
dbkk
2
@Dean: Mengapa begitu banyak orang berpikir mereka membutuhkan Resharper untuk semuanya? Apa yang Anda gambarkan sudah ada di Visual Studio tanpa Resharper.
Timwi
2
@ dbkk: Lekukan Anda rusak segera setelah Anda menambahkan ifbaris di mana saja. Anda kemudian harus melanjutkan untuk memperbaiki indentasi secara manual.
Timwi
2
Anda mungkin belum pernah bekerja di tim yang lekukannya malas, tidak konsisten, dll. Dan memperbaikinya tidak disarankan karena membuat kode jadi tidak mungkin.
Kevin
2
@ Kevin: Benar, saya belum, dan terus terang, saya tidak mau. Saya berkeras memperbaiki semuanya dalam sekali jalan, yang menyebabkan hanya satu diff yang tidak dapat dibaca yang hanya memengaruhi spasi kosong dan memperbaiki semua diff di masa depan. Hal lain akan menjadi kontraproduktif dan berbahaya bagi proyek.
Timwi
3

Secara pribadi saya menemukan saya perlu baris kosong yang diperkenalkan dengan memiliki token pada baris itu sendiri untuk membuat pikiran saya menyadari bahwa kode tersebut berada dalam ruang lingkup lain.

Aku benci ketika orang python pergi:

if something
    do something
    do somethingelse

    cleanup
else
    do the other thing

sementara di tanah token saya benci ketika orang menyalin dan menempel dan tidak membersihkan lekukan ,

if something
{
I have been too lazy
      {
            to clean up
            }
what I pasted
}

atau jangan gunakan jalur terpisah untuk token .

if something {
    I find this confusing
}
else {
especially when combined with the previous 
do something
}

Saya bisa membaca ketiganya, tetapi mereka tidak seperti yang saya harapkan dan saya harus berusaha keras untuk menguraikannya dan seperti yang dikatakan Joel ketika hal-hal tidak berfungsi seperti yang Anda harapkan membuat Anda frustrasi.

Dominique McDonnell
sumber
3

Pro: Tidak ada perang suci penempatan indentasi / penahan keriting di dunia Python sejauh yang saya tahu. Membuat keputusan ini atas nama pengembang mungkin telah menyelamatkan sedikit rasa sakit.

Con: Fungsi anonim terbatas pada satu baris. Kedengarannya ok, tapi saya sering menemukan diri saya menulis multi-line lambdadalam Skema (kebanyakan untuk memberi makan ke mapatau applydi satu tempat, jadi tidak masuk akal untuk menyatakan secara terpisah).

Inaimathi
sumber
Ekspresi multi baris didukung dalam Python - cukup cantumkan \ di akhir baris.
dbkk
8
Agar adil, kurangnya lambda multiline adalah keterbatasan Python, bukan spasi putih pada umumnya. Dalam bahasa saya-ruang-dibatasi, jika Anda memperkenalkan lambda dan blok lekukan berikut, blok digunakan sebagai badan lambda.
Catatan untuk diri sendiri - pikirkan nama
@Catatan - Ok, ya, adil. Python adalah satu-satunya bahasa dengan spasi terbatas yang saya miliki. @ dbkk jadi Anda mengatakan itu lambda n: a = n \\na.sort() \\na[0:3] tidak akan mengembalikan kesalahan sintaks? Trik `\` memungkinkan Anda menyebarkan lambda baris tunggal Anda di beberapa baris, tetapi Anda masih belum mendapatkan lebih dari satu baris aktual .
Inaimathi
Haskell, CoffeeScript menggunakan spasi putih tetapi tidak memiliki batasan lambda baris tunggal.
aoeu256
3

{} menambahkan redundansi. Terlalu banyak redudansi buruk, terlalu sedikit buruk. Dan memasukkannya secara manual itu buruk, khususnya. jika sulit untuk menggunakannya.

Jadi di saat IDE yang buruk / tidak ada, gaya spasi putih bisa sedikit lebih baik. Tetapi dengan IDE yang kuat, kawat gigi lebih baik.

pengguna470365
sumber
1
Anda membuat poin bagus tentang redundansi, saya pikir. Saya telah merenungkan parser-recovery untuk kompiler untuk sementara waktu (mengikuti upaya Clang yang sangat menarik untuk mengeluarkan Fix-Its untuk kodenya) dan yang benar-benar membantu di sini adalah bahwa ada redundansi. Oleh karena itu, saya pikir tidak ada redundansi, yang hebat di dunia yang sempurna, sebenarnya berbahaya untuk pemrograman dunia nyata. Ketika sumber informasi yang redundan biasanya tidak setuju, maka kemungkinan kesalahan ketik dibuat; tanpa redundansi, kesalahan potensial ini tidak terdeteksi! Yang sedang berkata, saya lebih suka tidak ada kawat gigi;)
Matthieu M.
"Noise" adalah kata yang digunakan Erik Meijer dalam video Haskell-nya.
user16764
Bagaimana jika Anda menghapus blok dan Anda lupa untuk menghapus} atau menghapus {secara tidak sengaja ketika melakukan yang sebaliknya? Redundansi bertentangan dengan IMO KERING.
aoeu256
2

Masalah yang saya temukan dengan bahasa spasi adalah dengan ekspresi kondisional multi-halaman. Menambahkan baris di tengah halaman dua, dan keluar dengan satu spasi di tengah semua kekacauan, dapat secara drastis mengubah logika kode Anda. Dan bahkan jika kode seseorang "benar", mencoba membacanya membuat permainan menebak yang mengerikan. Yang "jika" ini untuk 'yang lain'? Saya dapat menghitung kawat gigi lebih mudah daripada saya dapat menghitung karakter kosong yang tidak terlihat. Dan mesin posting di situs ini terus menghancurkan mereka menjadi satu ruang.

IMHO "{{{{{" is more reliable than "     ".
Andy Canfield
sumber
9
Jika Anda menggunakan ekspresi kondisional multi-halaman Anda memiliki masalah lain. Tapi jangan lakukan itu. Bahkan, bahkan dengan kurung kurawal, kode menjadi berantakan tidak terbaca. Ini sebenarnya manfaat lain dari lekukan spasi putih: itu mencegah Anda dari menulis kode mengerikan seperti itu.
Konrad Rudolph
1
Serius, beberapa halaman bersyarat panjang?
Winston Ewert
2

Saya tidak berpikir itu benar-benar lawan .
Pythoneers sering mengkritik kawat gigi pemrogram seolah-olah mereka akan dengan mudah melanggar lekukan karena mereka bisa.
Bahkan saya selalu menggunakan indentasi konsisten 100% bahkan sebelum mengetahui tentang Python dan pelingkupan indentasinya.

Faktanya adalah bahwa bahasa kawat gigi juga dapat memaksakan lekukan yang benar dalam kompiler dan kami akan memiliki yang terbaik dari kedua dunia. Lihat? tidak versus sama sekali.

Pythoneers berpendapat bahwa kawat gigi tidak berguna ketika lekukan adalah bagian dari sintaksis, tetapi tidak, kawat gigi meningkatkan keterbacaan. Saya mencoba pemrograman Python dan ini adalah bahasa yang sangat menarik bagi saya, tetapi apakah Anda sudah mencoba memiliki if-elifrantai lebih dari 2 atau 3 level indentasi? mereka tidak terlihat begitu rapi lagi.

PS: Saya menulis kawat gigi tetapi dengan cara yang lebih umum, maksud saya token pembatas. Brace pembuka bisa dianggap berlebihan, tetapi bahasa bisa seperti ini (sebenarnya saya yakin ada bahasa yang persis seperti ini tetapi saya tidak mengenalnya dengan baik):

if condition:
    statement
    other_statement()
end

PS2: 2019, 4 tahun setelah jawaban ini. Saya belajar Python dan benar-benar terbiasa dengan lekukan semantiknya dan tidak merasa sulit untuk membaca sama sekali. Terutama dengan bantuan IDE modern yang menggambar garis vertikal untuk membantu mengidentifikasi blok indentasi.

Petruza
sumber
Saya suka sintaksis karena itu kompromi yang baik dan menghindari kawat gigi. Tapi mahal untuk pernyataan satu baris, di mana misalnya dalam C kita dapat meninggalkan kawat gigi sepenuhnya :(
Jo So
bukannya bersarang jika ... elif Anda dapat mencoba menggunakan kamus, dan / atau, lanjutkan, kembali, fungsi bersarang ...
aoeu256
@ aoeu256 sama sekali bukan inti dari pertanyaan dan jawaban saya juga.
Petruza