Mengapa pernyataan "jika lain" hampir tidak pernah dalam format tabel?

73
if   i>0 : return sqrt(i)  
elif i==0: return 0  
else     : return 1j * sqrt(-i)

VS

if i>0:  
   return sqrt(i)  
elif i==0:  
   return 0  
else:  
   return 1j * sqrt(-i)  

Dengan contoh-contoh di atas, saya tidak mengerti mengapa saya hampir tidak pernah melihat gaya pertama dalam basis kode. Bagi saya, Anda mengubah kode menjadi format tabular yang menunjukkan dengan jelas apa yang Anda inginkan. Kolom pertama sebenarnya dapat diabaikan. Kolom kedua mengidentifikasi kondisi dan kolom ketiga memberi Anda output yang Anda inginkan. Tampaknya, setidaknya bagi saya, mudah dan mudah dibaca. Namun saya selalu melihat situasi case / switch sederhana ini muncul dalam format indentasi tab yang diperluas. Mengapa demikian? Apakah orang menemukan format kedua lebih mudah dibaca?

Satu-satunya kasus di mana ini bisa bermasalah adalah jika kode berubah dan semakin lama. Dalam hal ini, saya pikir sangat masuk akal untuk memperbaiki kode ke dalam format yang panjang, berlekuk. Apakah semua orang melakukannya dengan cara kedua hanya karena itu selalu dilakukan? Menjadi pendukung iblis, saya kira alasan lain mungkin karena orang menemukan dua format berbeda tergantung pada kompleksitas pernyataan if / else membingungkan? Wawasan apa pun akan dihargai.

horta
sumber
91
Karena orang menemukan opsi ke-2 lebih mudah dibaca?
GrandmasterB
65
Kasus penggunaan cabang yang saling eksklusif yang semuanya mengembalikan nilai dari jenis yang sama tidak sering muncul dalam bahasa imperatif dibandingkan dengan cabang yang mungkin tidak mengembalikan nilai, mungkin menjangkau beberapa baris dan mungkin memiliki efek samping. Jika Anda melihat bahasa pemrograman fungsional Anda akan melihat kode yang lebih mirip dengan contoh pertama Anda.
Doval
47
@ Horta "Satu-satunya kasus di mana ini bisa bermasalah adalah fi kode berubah dan menjadi lebih lama." - Anda TIDAK PERNAH berasumsi bahwa sepotong kode tidak akan berubah. Refactoring kode mengambil sebagian besar siklus hidup perangkat lunak.
Charles Addis
7
@ Horta: Tidak ada hubungannya dengan saya. Itu kodenya. Dalam konteks basis kode yang saya baca, saya ingin melihat apakah pernyataan (dan konstruksi bahasa lainnya) secara konsisten diformat, tanpa ada tepi kasus. Bukannya saya belajar membaca kode dengan cara tertentu, saya bisa membaca baik-baik saja, tetapi lebih mudah dibaca jika semuanya sama. Sekali lagi, tidak sama dengan saya, sama dengan sisa kode.
GManNickG
44
Juga, sebagian besar debugger berbasis garis. Tidak dapat menempatkan breakpoint pada pernyataan yang ada di dalam ifjika itu pada baris yang sama.
isanae

Jawaban:

93

Salah satu alasannya mungkin karena Anda tidak menggunakan bahasa yang populer.

Beberapa contoh tandingan:

Haskell dengan penjaga dan pola:

sign x |  x >  0        =   1
       |  x == 0        =   0
       |  x <  0        =  -1

take  0     _           =  []
take  _     []          =  []
take  n     (x:xs)      =  x : take (n-1) xs

Erlang dengan pola:

insert(X,Set) ->
    case lists:member(X,Set) of
        true  -> Set;
        false -> [X|Set]
    end.

Emacs lisp:

(pcase (get-return-code x)
  (`success       (message "Done!"))
  (`would-block   (message "Sorry, can't do it now"))
  (`read-only     (message "The shmliblick is read-only"))
  (`access-denied (message "You do not have the needed rights"))
  (code           (message "Unknown return code %S" code)))

Secara umum saya melihat format tabel cukup populer dengan bahasa fungsional (dan pada umumnya berbasis ekspresi), sementara memecah baris paling populer di orang lain (kebanyakan berdasarkan pernyataan).

viraptor
sumber
10
Saya membenarkan ini dan secara umum setuju, tetapi merasa berkewajiban untuk menunjukkan bahwa 1. Semua ini adalah pengembalian sepele 2. Haskeller gemar pengidentifikasi pendek yang lucu selain kesederhanaan bahasa itu sendiri dan 3. Bahasa fungsional cenderung berbasis ekspresi , dan bahkan bahasa imperatif memiliki standar berbeda untuk ekspresi daripada pernyataan. Jika OP menulis ulang contoh asli sebagai aplikasi fungsi dia mungkin mendapatkan saran yang berbeda ...
Jared Smith
3
@JaredSmith Terima kasih atas pemisahan berbasis ekspresi / pernyataan - Saya pikir ini mungkin lebih pas daripada fungsional / imperatif. Lagi-lagi ruby ​​hampir berdasarkan ekspresi dan tidak sering menggunakan konvensi itu. (pengecualian untuk semuanya) Mengenai poin 1 dan 2, saya menemukan 50% + kode Haskell asli menjadi "pengembalian sepele" yang hanya bagian dari sesuatu yang lebih besar - hanya bagaimana kode itu ditulis - tidak hanya dalam contoh di sini. Misalnya hampir setengah dari fungsi di sini adalah hanya satu / dua liner. (beberapa baris menggunakan tata letak tabel)
viraptor
Iya. Saya bukan seorang Haskeller tetapi melakukan beberapa ocaml dan menemukan bahwa pencocokan pola cenderung jauh lebih ringkas daripada switch yang setara secara logis, dan fungsi polimorfik mencakup banyak hal yang sama. Saya membayangkan kelas tipe Haskell akan memperluas cakupan itu lebih jauh.
Jared Smith
Saya pikir itu adalah sintaks kasus pola yang mempromosikan itu. Karena lebih ringkas dan biasanya lebih dekat ke sakelar pendek, lebih mudah untuk dinyatakan sebagai satu-liner. Saya sering melakukan ini dengan pernyataan switch-case pendek juga untuk alasan yang sama. if-elsePernyataan literal biasanya masih tersebar di beberapa baris ketika tidak secara efektif terner sederhana.
Isiah Meadows
@viraptor Secara teknis 50% lainnya - dari kode haskell adalah "non-trivial returns" karena semua fungsi haskell murni secara fungsional dan tidak dapat memiliki efek samping. Bahkan fungsi yang membaca dari dan mencetak ke baris perintah hanyalah pernyataan pengembalian yang panjang.
Pharap
134

Ini lebih mudah dibaca. Beberapa alasan mengapa:

  • Hampir setiap bahasa menggunakan sintaks ini (tidak semua, sebagian besar - contoh Anda tampaknya Python)
  • isanae menunjukkan dalam komentar bahwa sebagian besar debuggers berbasis garis (bukan berdasarkan pernyataan)
  • Itu mulai terlihat lebih buruk jika Anda harus menyematkan titik koma atau kawat gigi
  • Bunyinya dari atas ke bawah lebih lancar
  • Itu tampak sangat tidak dapat dibaca jika Anda memiliki apa pun selain pernyataan pengembalian sepele
    • Sintaks yang bermakna indentasi apa pun hilang ketika Anda skim kode sebagai kode kondisional tidak lagi dipisahkan secara visual (dari Dan Neely )
    • Ini akan sangat buruk jika Anda terus menambal / menambahkan item ke dalam pernyataan 1-baris jika
  • Ini hanya dapat dibaca jika semua cek Anda memiliki panjang yang sama
  • Ini berarti Anda tidak dapat memformat pernyataan yang rumit jika menjadi pernyataan multiline, mereka harus menjadi oneliner
  • Saya jauh lebih mungkin untuk melihat bug / aliran logika ketika membaca secara vertikal baris demi baris, tidak mencoba mengurai beberapa baris bersamaan
  • Otak kita membaca teks yang lebih sempit dan lebih tinggi JAUH lebih cepat daripada teks horizontal yang panjang

Begitu Anda mencoba melakukan semua ini, Anda akhirnya akan menulis ulang menjadi pernyataan multiline. Yang berarti Anda hanya membuang-buang waktu!

Orang juga pasti menambahkan sesuatu seperti:

if i>0:  
   print('foobar')
   return sqrt(i)  
elif i==0:  
   return 0  
else:  
   return 1j * sqrt(-i)  

Tidak perlu terlalu sering melakukan ini sebelum Anda memutuskan format ini jauh lebih baik daripada alternatif Anda. Ah, tapi kamu bisa inline semuanya dalam satu baris! enderland mati di dalam .

Atau ini:

if   i>0 : return sqrt(i)  
elif i==0 and bar==0: return 0  
else     : return 1j * sqrt(-i)

Yang benar-benar menjengkelkan. Tidak ada yang suka memformat hal-hal seperti ini.

Dan terakhir, Anda akan memulai perang suci masalah "berapa banyak ruang untuk tab". Apa yang merender dengan sempurna di layar Anda sebagai format tabel mungkin tidak dapat diubah sesuai dengan pengaturan saya.

Keterbacaan tidak harus bergantung pada pengaturan IDE.

enderland
sumber
14
@ Horta karena Anda harus mengonversinya jika Anda memformatnya dengan cara pertama Anda? Saya semua tentang meminimalkan pekerjaan untuk enderland masa depan. Membuat tabel whitespace yang cantik dan menghitung spasi dan tab untuk memperbarui format visual ketika saya mungkin menambahkan beberapa logika ke cek jika tidak menyenangkan sama sekali (mengabaikan implikasi keterbacaan).
enderland
14
@ Horta Dia tidak selalu mengatakan dia tidak akan memperbaikinya, dia mengatakan dia harus memperbaikinya, dan itu banyak waktu yang dihabiskan untuk memformat membosankan, daripada pada pemrograman.
Servy
11
@ Horta: IMHO cara Anda sering kurang dapat dibaca, dan jelas jauh lebih mengganggu format. Juga, itu hanya dapat digunakan ketika "seandainya" adalah satu garis kecil, yang jarang terjadi. Terakhir, entah bagaimana itu tidak baik, IMHO, untuk membawa dua jenis format "jika" karena ini.
dagnelies
9
@horta Anda tampaknya diberkati dengan bekerja pada sistem di mana persyaratan, sistem, API, dan kebutuhan pengguna tidak pernah berubah. Anda jiwa yang beruntung.
enderland
11
Saya akan menambahkan: setiap perubahan kecil dalam satu kondisi mungkin memerlukan memformat ulang yang lain untuk mencocokkan :posisi -> melakukan perbedaan dalam CVS tiba-tiba menjadi lebih sulit untuk memahami apa yang sebenarnya berubah. Ini juga berlaku untuk kondisi vs tubuh. Memiliki mereka pada garis yang terpisah berarti bahwa jika Anda mengubah hanya satu dari mereka diffs dengan jelas menunjukkan bahwa hanya kondisinya yang berubah, bukan tubuh.
Bakuriu
55

Saya sangat percaya pada 'kode dibaca berkali-kali, ditulis sedikit - jadi keterbacaan sangat penting.'

Satu hal penting yang membantu saya ketika saya membaca kode orang lain adalah mengikuti pola 'normal' yang dilatih oleh mata saya. Saya dapat membaca bentuk indentasi dengan paling mudah karena saya telah melihatnya berkali-kali sehingga hampir otomatis mendaftar (dengan sedikit upaya kognitif dari saya). Itu bukan karena itu 'lebih cantik' - itu karena itu mengikuti konvensi yang saya terbiasa. Konvensi mengalahkan 'lebih baik' ...

Seni Swri
sumber
3
Relevan: thecodelesscode.com/case/94
Kevin
11
Ini menjelaskan mengapa orang konservatif. Itu tidak menjelaskan mengapa orang memilih untuk menulis kode mereka dengan cara tertentu untuk memulai.
Jørgen Fogh
8
Pertanyaannya adalah 'mengapa saya sering melihat ini', bukan dari mana gaya ini berasal. Kedua pertanyaan itu menarik; Saya mencoba menjawab yang saya pikir sedang ditanyakan.
Seni Swri
16

Seiring dengan kelemahan lain yang telah disebutkan, tata letak tabular meningkatkan peluang konflik penggabungan kontrol versi yang membutuhkan intervensi manual.

Ketika satu blok kode yang diubah secara tabel perlu diluruskan kembali, sistem kontrol versi akan memperlakukan setiap baris tersebut sebagai telah dimodifikasi:

diff --git a/foo.rb b/foo.rb
index 40f7833..694d8fe 100644
--- a/foo.rb
+++ b/foo.rb
@@ -1,8 +1,8 @@
 class Foo

   def initialize(options)
-    @cached_metadata = options[:metadata]
-    @logger          = options[:logger]
+    @metadata = options[:metadata]
+    @logger   = options[:logger]
   end

 end

Sekarang anggaplah bahwa dalam waktu yang berarti, di cabang lain, seorang programmer telah menambahkan baris baru ke blok kode yang disejajarkan:

diff --git a/foo.rb b/foo.rb
index 40f7833..86648cb 100644
--- a/foo.rb
+++ b/foo.rb
@@ -3,6 +3,7 @@ class Foo
   def initialize(options)
     @cached_metadata = options[:metadata]
     @logger          = options[:logger]
+    @kittens         = options[:kittens]
   end

 end

Menggabungkan cabang itu akan gagal:

wayne@mercury:/tmp/foo$ git merge add_kittens
Auto-merging foo.rb
CONFLICT (content): Merge conflict in foo.rb
Automatic merge failed; fix conflicts and then commit the result.

Jika kode yang dimodifikasi tidak menggunakan perataan tabular, gabungan akan berhasil secara otomatis.

(Jawaban ini "dijiplak" dari artikel saya sendiri yang mengecilkan kelurusan tabel dalam kode).

Wayne Conrad
sumber
1
Menarik, tetapi bukankah ini gagal menggabungkan alat? Secara khusus git dalam hal ini? Ini adalah titik pertemuan menuju konvensi yang merupakan cara mudah untuk pergi. Bagi saya, ini adalah sesuatu yang dapat diperbaiki (dari sisi alat).
horta
7
@horta Untuk alat gabungan untuk memodifikasi spasi putih dengan cara yang hampir tidak selalu memecahkan kode, ia harus memahami dengan cara apa ia dapat memodifikasi spasi putih tanpa mengubah arti kode. Ini juga harus memahami keselarasan tabular tertentu yang digunakan. Itu tidak hanya bergantung pada bahasa (Python!), Tetapi mungkin membutuhkan alat untuk memahami kode sampai tingkat tertentu. Di sisi lain, penggabungan berbasis garis dapat dilakukan tanpa AI, dan cukup sering bahkan tidak memecahkan kode.
Wayne Conrad
Gotcha. Jadi seperti yang disebutkan di bagian lain dalam komentar, sampai kita memiliki IDE atau format input pemrograman yang menggabungkan tabel langsung ke dalam format, masalah tooling akan selalu ada hanya membuat hidup lebih sulit bagi kita yang lebih suka tabel.
horta
1
@ Horta Benar. Sebagian besar keberatan saya terhadap penyelarasan tabular dalam kode bisa hilang dengan alat yang cukup canggih.
Wayne Conrad
8

Format tabel bisa sangat bagus jika semuanya selalu sesuai dengan lebar yang diberikan. Namun, jika sesuatu melebihi lebar yang diberikan, maka sering perlu untuk memiliki bagian dari tabel yang tidak dijajari dengan sisanya, atau menyesuaikan tata letak semua hal lain di meja agar sesuai dengan barang yang panjang. .

Jika file sumber diedit menggunakan program yang dirancang untuk bekerja dengan data format tabular dan dapat menangani item yang terlalu panjang dengan menggunakan ukuran font yang lebih kecil, membaginya menjadi dua baris dalam sel yang sama, dll. Maka mungkin masuk akal untuk menggunakan tabel format lebih sering, tetapi kebanyakan kompiler menginginkan file sumber yang bebas dari jenis markup yang perlu disimpan oleh editor tersebut untuk mempertahankan format. Menggunakan baris dengan jumlah indentasi yang bervariasi tetapi tidak ada tata letak lain yang tidak sebaik format tabel dalam kasus terbaik, tetapi tidak menyebabkan masalah yang hampir sama banyak dalam kasus terburuk.

supercat
sumber
Benar. Saya perhatikan editor teks yang saya gunakan (vim) memiliki dukungan mengerikan untuk pemformatan tabel atau bahkan teks lebar. Saya belum melihat editor teks lain melakukan lebih baik.
horta
6

Ada pernyataan 'beralih' yang menyediakan hal semacam ini untuk kasus-kasus khusus, tapi saya kira bukan itu yang Anda tanyakan.

Saya telah melihat jika pernyataan dalam format tabel, tetapi harus ada sejumlah besar persyaratan untuk membuatnya berharga. 3 jika pernyataan paling baik ditampilkan dalam format tradisional, tetapi jika Anda memiliki 20, maka jauh lebih mudah untuk menampilkannya dalam blok besar yang diformat untuk membuatnya lebih jelas.

Dan ada intinya: kejelasan. Jika membuatnya lebih mudah untuk dilihat (dan contoh pertama Anda tidak mudah untuk melihat di mana: pembatas) maka format itu sesuai dengan situasi. Kalau tidak, tetap dengan apa yang orang harapkan, karena itu selalu lebih mudah untuk dikenali.

gbjbaanb
sumber
1
OP tampaknya menggunakan Python, jadi tidak switch.
Jared Smith
2
"3 jika pernyataan terbaik ditampilkan dalam format tradisional, tetapi jika Anda memiliki 20" ... maka Anda memiliki masalah yang lebih besar untuk dipikirkan! :)
Grimm The Opiner
@GrimmTheOpiner Jika Anda menulis parser bahasa atau pengait AST, itu adalah hal yang sangat mungkin untuk dihadapi. Sebagai contoh, saya pernah berkontribusi pada parser JavaScript di mana saya membagi fungsi dengan 15-20 kasus, satu untuk setiap jenis ekspresi. Saya membagi sebagian besar kasus ke fungsi mereka sendiri (untuk meningkatkan kinerja terkemuka), tetapi lama switchadalah suatu keharusan.
Isiah Meadows
@JaredSmith: Rupanya switchjahat, tetapi instantiating kamus kemudian melakukan pencarian untuk melakukan percabangan sepele itu tidak jahat ...
Mark K Cowan
1
@MarkKCowan oh saya menangkap sarkasme tetapi saya pikir Anda menggunakannya untuk mengejek saya. kurangnya konteks di internet dan yang lainnya.
Jared Smith
1

Jika ekspresi Anda benar-benar semudah itu, kebanyakan bahasa pemrograman menawarkan?: Branching operator:

return  ( i > 0  ) ? sqrt( i)
      : ( i == 0 ) ? 0
        /* else */ : 1j * sqrt( -i )

Ini adalah format tabel pendek yang dapat dibaca. Tetapi bagian yang penting adalah: Saya melihat sekilas apa tindakan "utama" itu. Ini adalah pernyataan pengembalian! Dan nilainya ditentukan oleh kondisi tertentu.

Jika di sisi lain Anda memiliki cabang yang mengeksekusi kode yang berbeda, saya merasa jauh lebih mudah dibaca untuk indentasi blok ini. Karena sekarang ada berbagai tindakan "besar" tergantung pada pernyataan if. Dalam satu kasus kita melempar, dalam satu kasus kita masuk dan kembali atau hanya kembali. Ada aliran program yang berbeda tergantung pada logika, sehingga blok kode merangkum cabang-cabang yang berbeda dan membuatnya lebih menonjol bagi pengembang (mis. Fungsi membaca cepat untuk memahami aliran program)

if ( i > 0 )
{
    throw new InvalidInputException(...);
}
else if ( i == 0 )
{
    return 0;
}
else
{
    log( "Calculating sqrt" );
    return sqrt( -i );
}
Falco
sumber
7
Sebenarnya, saya menemukan "format tabel pendek yang dapat dibaca" Anda cukup mimpi buruk untuk dibaca, sementara format yang diusulkan oleh OP baik-baik saja.
Matteo Italia
@MatteoItalia bagaimana dengan versi yang diedit ini?
Falco
5
Maaf, masih lebih buruk; Saya pikir itu berasal dari fakta bahwa ?dan :lebih sulit dikenali daripada if/ elsekata kunci dan / atau karena "noise" yang ditambahkan dari simbol.
Matteo Italia
@MatteoItalia: Saya memiliki case dengan lebih dari seratus nilai berbeda. Nilai tabel memungkinkan untuk memeriksa kesalahan. Dengan multi-line, itu tidak mungkin.
gnasher729
1
@ gnasher729 - Untuk 100 "nilai" yang berbeda Secara umum saya merasa jauh lebih baik untuk mendeklarasikan struktur data dari setiap "item" dan daftar semuanya sebagai tabel dalam inisialisasi untuk array dari struktur data ini. (Tentu saja batasan bahasa mungkin berlaku di sini). Jika item apa pun membutuhkan aspek "komputasi", struktur item dapat berisi pointer atau referensi ke fungsi untuk melakukan tindakan yang diperlukan. Untuk aplikasi Mei ini dapat sangat menyederhanakan kode dan membuat pemeliharaan lebih mudah.
Michael Karas
1

Seperti yang sudah dikatakan enderland, Anda berasumsi bahwa Anda hanya akan memiliki satu "kembali" sebagai tindakan, dan bahwa Anda dapat menandai "kembali" itu di akhir kondisi. Saya ingin memberikan beberapa detail tambahan mengapa ini tidak akan berhasil.

Saya tidak tahu apa bahasa pilihan Anda, tapi saya sudah lama mengkode dalam bahasa C. Ada sejumlah standar pengkodean di sekitar yang bertujuan untuk menghindari beberapa kesalahan pengkodean standar dengan melarang konstruksi kode yang rentan terhadap kesalahan, baik dalam pengkodean awal atau selama pemeliharaan kemudian. Saya paling akrab dengan MISRA-C, tetapi ada yang lain, dan umumnya mereka semua memiliki aturan yang sama karena mereka menangani masalah yang sama dalam bahasa yang sama.

Satu kesalahan populer yang sering ditangani oleh standar pengkodean adalah gotcha kecil ini: -

if (x == 10)
    do_something();
    do_something_else();

Ini tidak melakukan apa yang Anda pikirkan. Sejauh menyangkut C, jika x adalah 10 maka Anda menelepon do_something(), tetapi kemudian do_something_else()dipanggil terlepas dari nilai x . Hanya tindakan yang segera mengikuti pernyataan "jika" yang bersyarat. Ini mungkin apa yang dimaksudkan oleh pembuat kode, dalam hal ini ada kemungkinan jebakan bagi pengelola; atau mungkin bukan yang dimaksud oleh pembuat kode, dalam hal ini ada bug. Ini pertanyaan wawancara populer.

Solusi dalam standar pengkodean adalah untuk mengamanatkan kawat gigi di sekitar semua tindakan bersyarat, bahkan jika mereka satu baris. Sekarang kita dapatkan

if (x == 10)
{
    do_something();
    do_something_else();
}

atau

if (x == 10)
{
    do_something();
}
do_something_else();

dan sekarang ini berfungsi dengan benar dan jelas untuk pengelola.

Anda akan melihat bahwa ini sepenuhnya tidak kompatibel dengan format gaya tabel Anda.

Beberapa bahasa lain (misalnya Python) melihat masalah ini dan memutuskan bahwa karena coders menggunakan spasi putih untuk membuat tata letak menjadi jelas, itu akan menjadi ide yang baik untuk menggunakan spasi putih alih-alih kawat gigi. Jadi dengan Python,

if x == 10:
    do_something()
    do_something_else()

membuat panggilan ke keduanya do_something()dan do_something_else()tergantung pada x == 10, sedangkan

if x == 10:
    do_something()
do_something_else()

berarti hanya do_something()kondisional pada x, dan do_something_else()selalu dipanggil.

Ini adalah konsep yang valid, dan Anda akan menemukan beberapa bahasa menggunakannya. (Saya pertama kali melihatnya di Occam2, jauh ketika.) Sekali lagi, Anda dapat dengan mudah melihat bahwa format gaya tabel Anda tidak kompatibel dengan bahasa.

Graham
sumber
1
Saya kira kamu melewatkan poin itu. Masalah yang Anda bicarakan adalah mimpi buruk non-standar C khusus aneh yang menyebabkan masalah yang Anda bicarakan. Jika coding dalam C, saya tidak akan merekomendasikan menggunakan metode simple if jika dengan format tabel yang saya sarankan. Sebaliknya, karena Anda menggunakan C, Anda akan menggunakan kawat gigi semua pada satu baris. Kawat gigi sebenarnya akan membuat format tabel lebih jelas karena mereka bertindak sebagai pembatas.
horta
Juga, pernyataan pengembalian dalam kasus ini hanyalah sebuah contoh. Secara umum, itu mungkin kode bau itu sendiri. Saya hanya mengacu pada format pernyataan sederhana, tidak harus dengan pernyataan pengembalian sama sekali.
horta
2
Maksud saya adalah ini membuat format tabel menjadi lebih kikuk. Kebetulan, itu bukan C-spesifik - itu dibagikan oleh semua bahasa yang berasal dari C, jadi C ++, C #, Java dan JavaScript semua memungkinkan gotcha yang sama.
Graham
1
Saya tidak keberatan bahwa itu adalah pernyataan pengembalian - Saya mengerti maksud Anda adalah untuk menunjukkan pernyataan sederhana. Tapi itu menjadi lebih rumit. Dan tentu saja segera setelah pernyataan menjadi tidak sederhana, maka Anda perlu mengubah format karena format tabel tidak mungkin dipertahankan. Kecuali Anda melakukan kebingungan kode, baris-baris kode yang panjang merupakan bau tersendiri. (Batas awalnya adalah 80 karakter, hari ini lebih biasanya sekitar 130 karakter, tetapi prinsip umum masih menyatakan bahwa Anda tidak perlu menggulir untuk melihat akhir dari garis.)
Graham
1

Tata letak tabel dapat berguna dalam beberapa kasus terbatas, tetapi ada beberapa kali berguna jika.

Dalam kasus sederhana?: Mungkin merupakan pilihan yang lebih baik. Dalam kasus sedang, sakelar seringkali lebih cocok (jika bahasa Anda memilikinya). Dalam kasus rumit, Anda mungkin menemukan bahwa tabel panggilan lebih cocok.

Ada banyak kali ketika kode refactoring yang saya atur ulang menjadi tabular untuk membuatnya jelas. Jarang sekali saya membiarkannya seperti itu karena dalam kebanyakan kasus ada cara yang lebih baik untuk menyelesaikan masalah begitu Anda memahaminya. Kadang-kadang praktik pengkodean atau standar tata letak melarangnya, dalam hal ini komentar berguna.

Ada beberapa pertanyaan tentang ?:. Ya itu adalah operator ternary (atau yang saya suka anggap sebagai nilai jika). pada blush on pertama contoh ini sedikit rumit untuk?: (dan berlebihan?: tidak membantu keterbacaan tetapi menyakitkan), tetapi dengan beberapa pemikiran Contohnya dapat diatur ulang seperti di bawah ini, Tapi saya pikir dalam hal ini saklar adalah yang paling mudah dibaca larutan.

if i==0: return 0
return i>0?sqrt(i):(1j*sqrt(-i))
Hildred
sumber
1
Anda mungkin harus memperjelas apa "?:" Untuk yang belum tahu (misalnya, dengan contoh, mungkin terkait dengan pertanyaan).
Peter Mortensen
Saya berasumsi itu adalah operator ternary. Saya merasa seperti dijauhi karena alasan yang baik bahwa operator ternary cenderung mengatur ulang standar jika, melakukan hal-hal, melakukan format hal-hal lain yang dilihat orang setiap hari dan karenanya dapat dibaca dengan mudah.
horta
@PeterMortensen: Jika yang belum tahu tidak tahu apa artinya ini, mereka harus menjauh dari kode sampai mereka mengajukan pertanyaan yang jelas dan belajar.
gnasher729
@horta Ternary adalah if ? do stuff : do other stuff. Pesanan yang sama dengan if / else.
Navin
1
@Navin Ah, mungkin itu hanya kegagalan bahasa yang paling saya gunakan (python). stackoverflow.com/questions/394809/…
horta
-3

Saya tidak melihat ada yang salah dengan format tabel. Preferensi pribadi, tetapi saya akan menggunakan ternary seperti ini:

return i>0  ? sqrt(i)       :
       i==0 ? 0             :
              1j * sqrt(-i)

Tidak perlu diulang returnsetiap kali :)

Navin
sumber
1
Seperti yang disebutkan dalam beberapa komentar, pernyataan pengembalian tidak ideal atau titik posting, hanya sepotong kode yang saya temukan online dan diformat beberapa cara.
horta
Ternaries Python do_something() if condition() else do_something_else()tidak condition() ? do_something() : do_something_else().
Isiah Meadows
@IsiahMeadows OP tidak pernah menyebut Python.
Navin