Pemutusan saluran sebelum / sesudah operator [ditutup]

29

Sementara konvensi kode Java Sun menyarankan untuk menempatkan line break di hadapan operator, banyak pedoman lain tidak setuju dengannya. Saya tidak melihat pro dan kontra yang jelas, jadi apakah ada keuntungan menggunakan salah satu gaya ini di atas yang lain?

String longVarName = a + b + c + d +
          e + f;

vs.

String longVarName = a + b + c + d
          + e + f;
Nutel
sumber
Bisakah Anda memposting contoh kode sederhana yang menunjukkan kedua konvensi?
Michael
Pertama saya akan mencoba untuk menghindari situasi dengan menggunakan sesuatu seperti ini: unduh.oracle.com/javase/1.4.2/docs/api/java/lang/…
Ayub
Tautan rusak.
Florian F

Jawaban:

14

Saya akan meninggalkannya di satu baris dan lebih suka berpikir tentang keterbacaan dalam hal nama variabel yang mengungkapkan niat (dan fungsi).

Setelah menjadi berantakan saatnya untuk refactor :

  • ganti nama vars
  • memperkenalkan vars / fungsi baru

Contoh

subtotal = price * (100 + tax_ratio) / 100`

vs.

tax = price * tax_ratio / 100
subtotal = price + tax
Kamil Tomšík
sumber
2
Rumus di sebelah kiri salah. Itu harus salah price * (100 + tax_ratio) / 100atau adil price * (1 + tax_ratio), tergantung pada apakah tax_ratiodalam persen atau fraksional.
Rufflewind
4
Ini tidak menjawab pertanyaan. Harus ada undang-undang yang menentang jenis balasan ini.
Edward D'Souza
@ EdwardD'Souza aku merasakan hal yang sama. Tetapi mengapa jawabannya diterima?
Rudy Vissers
@RudyVissers jawabannya memecahkan masalah di tingkat yang lebih dalam. Ini memecahkan masalah perlu line break di tempat pertama. Dari perspektif itu, OP dapat menganggapnya sebagai jawaban untuk masalahnya, tetapi masih tidak sesuai dari perspektif ini sebagai wiki komunitas.
Edward D'Souza
hei, saya tidak ada di sini lagi tetapi ini sangat sederhana - jika Anda berada dalam situasi seperti itu, Anda mungkin melakukan kesalahan dan Anda sebaiknya berpikir tentang refactoring kode - atau jika tidak, setelah 15 tahun pemrograman I hanya tidak peduli tentang hal-hal seperti itu lagi, apa yang saya peduli adalah kejelasan kode, kesederhanaan & membuatnya mudah bagi orang lain untuk membantu saya
Kamil Tomšík
36

Saya bisa membayangkan keterbacaan menjadi argumen

result = longidentifier +
   short -
   alittlelonger -
   c;

melawan

result = longidentifier
   + short
   - alittlelonger
   - c;

Dalam contoh kedua, operator berbaris dengan baik dan Anda dapat dengan mudah melihat dengan tanda mana variabel dimasukkan ke dalam persamaan. Saya pikir ini juga masuk akal untuk operator biner, tetapi dengan menguatkan dll, Anda harus melakukan apa pun yang lebih jelas.

Otto Allmendinger
sumber
4
Untuk situasi di mana operator penting (seperti ekspresi matematika dan semacamnya) saya akan memilih nomor dua, karena, seperti yang Anda katakan, itu jauh lebih mudah dibaca. Tetapi untuk string saya akan memilih opsi pertama, karena operator "tidak berarti". Mereka tidak melakukan apa pun selain menyatukan string, dan karena string adalah bagian yang penting, maka saya lebih suka opsi pertama.
Niklas H
Kedua kasus itu pantas. Kedua kasing lebih baik daripada meletakkannya pada satu baris yang sangat panjang! Preferensi saya adalah menggunakan braket pembuka di awal (meskipun tidak diperlukan) dan kemudian mengatur semuanya di bawah itu. Itu membuatnya jauh lebih jelas.
cepat,
35

Saya biasanya mengikuti pedoman gaya yang paling umum digunakan atau alat standar pengkodean tertentu. Keuntungan menggunakan gaya yang umum digunakan membawa manfaat ketika Anda membaca kode orang lain atau terlibat dalam proyek sumber terbuka di mana pedoman gaya ditetapkan.

Gaya paling umum yang saya lihat adalah gaya kedua dalam pertanyaan. Lihat di bawah untuk daftar mereka:

Panduan Gaya Google :

Ketika garis terputus di operator yang tidak ditugaskan, jeda datang sebelum simbol.

Konvensi Sun Coding :

Beristirahat di depan operator

Checkstyle Operator Wrap cek 's nilai default adalah nl:

Operator harus berada di jalur baru

langit-langit
sumber
2
Diperbarui jawaban saya demi kejelasan + konvensi pengkodean Sun.
ceilfors
google.github.io/styleguide/javaguide.html (tautan dalam jawaban rusak)
Martin Pfeffer
10

Dalam kode saya cenderung memberi istirahat setelah operator:

foo = some_long_expression() +
      some_other_long_expression();

Di sini, operator yang menggantung di ujung garis merupakan petunjuk besar bagi pembaca bahwa kode terus berlanjut. Dalam bahasa yang tidak memiliki terminator pernyataan, bahwa operator menggantung dapat berfungsi sebagai petunjuk yang cukup untuk kompiler / juru bahasa bahwa kode terus berlanjut (jika tidak saya harus menggunakan beberapa konstruksi garis kelanjutan yang jelek).

Ketika mendokumentasikan ungkapan itu (jika perlu dokumentasi), saya cenderung meletakkan istirahat di depan operator.

David Hammen
sumber
Paling tidak beberapa bahasa (misalnya Python) tidak menggunakan operator biner sebagai petunjuk bahwa garis itu berlanjut tetapi membutuhkan lebih banyak. Perhatikan bahwa baris baru di dalam parens biasanya tidak dihitung, jadi Anda tidak perlu karakter kelanjutan garis eksplisit (dan rawan kesalahan).
3

Selama Anda tetap konsisten, maka ketahuilah bahwa tidak ada keuntungan nyata. Ini sangat penting ketika mempertimbangkan penggabungan kode dan ruang putih.

Martijn Verburg
sumber
3

Saya percaya garis harus dimulai dengan simbol tertinggi di pohon parse dari pernyataan yang ingin Anda hancurkan. Ini menyoroti operator yang paling penting dalam ekspresi. Ini adalah alasan yang sama mengapa Anda meletakkan yang lain di awal baris dan bukan di akhir baris sebelumnya.

Pada contoh berikut, memindai margin kiri, Anda melihat struktur pernyataan sebagai OR dari 3 ekspresi.

if (ch>='A' && ch<='Z'
    || ch>='a' && ch<='z'
    || ch>='0' && ch<='9')
{...}

Di bawah, || operator kurang disorot. Itu kurang jelas itu adalah || ekspresi. Apalagi jika garis-garis itu panjangnya berbeda.

if (ch>='A' && ch<='Z' ||
    ch>='a' && ch<='z' ||
    ch>='0' && ch<='9')
{...}

Dan hanya untuk referensi, ini sangat salah. The || operator tidak disorot sama sekali.

if ( ch>='A' && ch<='Z' || ch>='a'
     && ch<='z' || ch>='0' && ch<='9')
{...}

Saya bahkan suka meletakkan koma di awal baris, meskipun saya jarang melihatnya. Saya menahan diri dari melakukan hal itu pada kode bersama.

var note:Object =
    { key: key
    , type: 'P'
    , text: someLongProcedureCallGettingTheUserInitials()
       + ": " + getTheTextThatWasTyped()
    };
Florian F
sumber
2

Untuk persamaan aritmatika yang panjang, saya biasanya melakukan satu dari dua hal.

tinggalkan semuanya dalam satu baris:

foo = bar + baz - fizz + buzz + alpha - beta;

Saya biasanya melakukan ini untuk persamaan yang hanya berisi penambahan dan pengurangan, saya merasa sangat mudah untuk membuat kesalahan ketik dengan perkalian dan pembagian yang secara serius dapat mengacaukan ruang lingkup operator.

format kedua yang saya gunakan adalah operator progresif:

foo = bar;
foo += baz;
foo -= fizz;
foo += buzz;
foo /= alpha - beta;
foo *= spiff;

Saya tidak melihat alasan untuk mempersingkat menjadi satu baris, kecuali jika itu dapat dibuktikan untuk meningkatkan kinerja secara nyata. Selain itu, tidak ada ambiguitas tentang apa yang terjadi di mana, dan ada sedikit kesempatan untuk salah menempatkan tanda kurung untuk /dan *operator.

zzzzBov
sumber
2

Menempatkan karakter gabungan (atau operator apa pun) di awal saluran akan meningkatkan keterbacaan. Kami memindai kode dengan berfokus pada awal setiap baris. Ketika sebuah garis dimulai dengan sebuah operator, pembaca dapat mengatakan bahwa garis tersebut merupakan kelanjutan dari pernyataan sebelumnya dengan memindai satu karakter itu.

Ekspresi matematika yang panjang selalu mengeset sehingga setiap baris baru dimulai dengan operator. Tidak ada alasan bahwa kode tidak boleh mengikuti konvensi ini.

kevin cline
sumber
0

Biarkan ekspresi pada satu baris, dan jika itu menjadi terlalu panjang, maka pisahkan menjadi ekspresi yang lebih kecil:

days = ((year * months_per_year) + month) * days_per_month + day

menjadi:

months = year * months_per_year + month
days = months * days_per_month + day

Jika ini tidak mungkin, maka saya merasa lebih mudah untuk istirahat sebelum operator, dan memiliki operator mulai langsung di bawah tugas sebelumnya (meletakkannya di bawah variabel membuat saya harus berpikir dan memulai kembali, yang menjengkelkan mengingat bahwa tujuannya adalah adalah untuk mempermudah membaca):

random = years * months_per_year 
         + month * days_per_month 
         + day * hours_per_day 
         + hour * minutes_per_hour 
         + minute * seconds_per_minute 
         + second
Joel
sumber
1
Jawaban ini tidak menambahkan sesuatu yang baru pada apa yang telah dikatakan.
Martijn Pieters