Haruskah saya meletakkan baris baru sebelum atau setelah operator biner? [Tutup]

11

Saat Anda menggunakan Python atau Javascript, Anda harus selalu meletakkan operator biner di akhir baris sebelumnya, untuk mencegah baris baru dari penghentian kode Anda sebelum waktunya; ini membantu Anda menangkap kesalahan.

Tetapi dalam C atau C ++, ini bukan masalah, jadi saya bertanya-tanya:

Apakah ada alasan bagi saya untuk memilih versi kedua daripada yang pertama?

return lots_of_text
       + 1;

melawan

return lots_of_text +
       1;

(Misalnya, apakah salah satunya membantu mencegah jenis kesalahan lainnya? Atau salah satunya dianggap lebih mudah dibaca?)

pengguna541686
sumber
Tidak, Anda tidak boleh melakukannya dengan Python, terutama karena tidak memiliki efek yang Anda klaim miliki. Operator trailing tidak menyebabkan kelanjutan garis; backslash atau memiliki tanda kurung, kurung atau kawat gigi tidak tertutup.
@delnan: Saya (sangat hati-hati) tidak pernah mengatakan itu menyebabkan kelanjutan garis. Saya sadar Anda masih perlu menyertakan karakter pengelompokan. Saya mengatakan itu membantu mencegah kesalahan dengan garis Anda berakhir sebelum waktunya, yang tidak, dengan memberi Anda kesalahan.
user541686
Begitu, tapi itu juga tidak. Setidaknya saya belum pernah melihat itu terjadi (dan saya benar-benar mengikuti aturan PEP 8 tentang menempatkan baris baru setelah operator) dan saya tidak bisa membayangkan kode non-dibuat-buat yang berlaku dengan baris baru sebelum operator tetapi tidak setelah operator. Misalnya, kode seperti dalam cuplikan pertama Anda juga kesalahan (karena indentasi). Adakah yang tidak menambahkan lekukan saat memisahkan garis?
@delnan: Sebenarnya sangat mudah untuk secara tidak sengaja mengacaukan lekukan dengan editor teks Anda, misalnya saat mengedit massal atau melakukan pemilihan persegi panjang. Dan jika / ketika itu terjadi selama pemeliharaan, Anda tidak akan mendapatkan kesalahan dalam kasus pertama dan itu akan diam-diam menyelinap oleh Anda, tetapi Anda akan mendapatkan kesalahan yang bagus dalam kasus kedua.
user541686
4
Tidak yakin mengapa ini diturunkan. Sepertinya pertanyaan gaya penulisan kode yang masuk akal.
Stuart Marks

Jawaban:

18

Seperti yang dapat Anda lihat dari jawaban, tidak ada konsensus tentang masalah ini. Kecuali jika Anda bekerja dalam tim, gunakan apa yang membuat Anda lebih nyaman.


Saya lebih suka memasukkan baris baru sebelum operator.

Setiap kali saya harus memutus garis, saya biasanya menempatkan paling banyak satu istilah dari "level" yang sama pada sebuah baris:

Hukum gravitasi Newton dalam Python:

force = (
    gravitational_constant
    * mass_1
    * mass_2
    / (distance * distance)
)

Bandingkan ini dengan:

force = (
    gravitational_constant *
    mass_1 *
    mass_2 /
    (distance * distance)
)

Saya ingin tahu, bahwa saya "membagi oleh jarak kuadrat", saya tidak ingin tahu, bahwa "mass_2 akan dibagi", karena itu bukan bagaimana saya memikirkan ekspresi matematika.

Lebih jauh, saya biasanya ingin tahu dulu, apa yang saya lakukan (operator), sebelum saya peduli dengan apa yang saya lakukan (operan).

Atau pertimbangkan pernyataan SQL yang berbelit-belit ini:

WHERE
  a = 1
  AND b = 2
  AND c = 3
  AND ( -- or put the OR on one line together with the AND
    d = 3 
    OR e = 1)
  AND x = 5

Ini memungkinkan saya untuk melihat bagaimana kondisi individu terhubung dengan sangat mudah, hanya dengan membaca sepintas lalu dari atas ke bawah tanpa harus membaca setiap baris sampai akhir untuk menemukan operator yang bertentangan dengan:

WHERE
  a = 1 AND
  b = 2 AND
  c = 3 AND
  ( 
    d = 3 OR
    e = 1) AND
  x = 5

Saya berpikir tentang yang pertama dalam hal " Xbenar", maka saya mengubah itu dengan mengatakan: " DAN ini juga benar" yang terasa lebih alami bagi saya daripada sebaliknya. Selanjutnya, saya menemukan yang pertama jauh lebih mudah untuk diuraikan secara visual.

Atau contoh PHP:

$text = "lorem ipsum"
      . "dolor sit amet, "
      . "consectetur adipisicing elit, "
      . "sed do eiusmod tempor";

Sekali lagi, saya hanya bisa membaca skim secara vertikal untuk melihat saya hanya menyatukan teks, karena sebagian besar waktu saya merasa bahwa saya tidak benar-benar peduli apa yang ada di dalam string / kondisi.

Tentu saja, saya tidak akan menerapkan gaya ini tanpa syarat. Jika menempatkan baris baru setelah operator tampaknya lebih masuk akal bagi saya, saya akan melakukannya, tetapi saya tidak bisa memikirkan contoh saat ini.

hantu0m
sumber
Menambahkan tanda kurung yang hilang ke contoh pertama.
kevin cline
1
+1: tepat benar; matematika selalu mengeset sehingga garis kelanjutan dimulai dengan operator.
kevin cline
Memberi +1 untuk alasan yang sama dengan yang Anda jelaskan, tetapi contoh PHP Anda terlihat sangat aneh bagi saya. Bukankah seharusnya konser itu benar ., bukan .=?
Izkata
@Izkata oh ya, Anda benar tentu saja. Terima kasih. kevin: Tanda kurung itu benar;) Saya baru saja menyelaraskannya denganforce
phant0m
11

Saya hampir selalu memutus baris sebelum operator biner untuk menjelaskan kepada pembaca kode bahwa ini adalah kelanjutan dari ekspresi dan bukan pernyataan berikutnya. Ini penting jika pernyataan berikutnya biasanya diindentasi. Misalnya, pertimbangkan pernyataan if yang memiliki ekspresi kondisional yang kompleks:

if (first_part_of_condition &&
    second_part_of_condition) {
    statement_within_then_part;
}

Bagian kedua dari ekspresi kondisional mudah dikacaukan dengan pernyataan pertama dari bagian tersebut. Ini bisa sangat membingungkan jika bagian pertama dari kondisinya panjang dan && berakhir dengan benar. Bandingkan ini dengan alternatifnya:

if (first_part_of_condition
    && second_part_of_condition) {
    statement_within_then_part;
}

Ini terlihat agak aneh tetapi membuatnya cukup jelas bahwa bagian kedua dari kondisi bukanlah awal dari sebuah pernyataan.

Saya melakukan ini dalam konteks orang lain juga, tetapi pernyataan if adalah yang paling penting, karena lekukannya ambigu. Tentu saja, seseorang dapat mengubah indentasi atau penempatan brace, tetapi ini juga terlihat aneh.

tl; ujung kiri garis lebih penting untuk pemahaman bacaan cepat, sehingga menempatkan operator di ujung kiri adalah penanda yang lebih menonjol bahwa ini adalah ekspresi yang berkelanjutan, bukan pernyataan.

Stuart Marks
sumber
Pikiran yang menarik tetapi saya masih menemukan ini cukup membingungkan (terutama bila dilakukan dengan +dan -yang juga bisa dipahami sebagai operator awalan unary). Solusi yang biasa untuk membuat garis yang berkelanjutan menonjol adalah membuat indentasi lebih banyak (yaitu dengan dua tingkat).
Konrad Rudolph
"Bagian kedua dari ekspresi kondisional mudah dikacaukan dengan pernyataan pertama dari bagian itu.": Ini tidak terjadi jika Anda menyelaraskan "{" dan "}" secara vertikal (kolom yang sama) untuk membuat awal dan akhir blok menonjol lebih jelas.
Giorgio
8

Saya selalu menggunakan yang pertama. Anda ingin menjadi jelas apa yang Anda lakukan dengan itu di sana. Jika saya melihat itu dan ada dinding teks di atas bahwa saya tidak akan tahu apa yang terjadi sejauh penggunaan 1 itu.

Tanda '+' di sebelah 1 memperjelas bahwa setidaknya saya melakukan sesuatu dengan 1 yang dimaksud daripada nongkrong, "Saya semua dalam kode Anda dude ..." tanpa alasan yang jelas.

Insinyur Dunia
sumber
diperbantukan ...........
James
7

Saya merasa itu sangat membantu membaca pemahaman ketika sebuah baris menunjukkan bahwa pernyataan berlanjut di baris berikutnya dengan memiliki operator biner pada akhirnya, dan dengan demikian membuat pernyataan itu tidak lengkap. Titik koma yang hilang tidak cukup bagi saya untuk segera memahami itu.

Ini mungkin hanya masalah kebiasaan tetapi kecuali jika Anda bekerja secara eksklusif dalam bahasa yang memerlukan tanda titik koma (yang menurut saya cukup tidak realistis mengingat merebaknya skrip shell, makefile dan bahasa seperti Python) Anda mungkin tidak akan memiliki kebiasaan itu juga.

EDIT: Giorgio membuat poin yang sangat baik dalam komentar: penggunaan ini menggemakan tanda baca umum , baik dalam matematika dan bahasa alami. Kamu akan menulis

Saya tenggelam,
oleh karena itu saya berenang

Anda tidak akan menulis

Saya tenggelam
, oleh karena itu saya berenang

Konrad Rudolph
sumber
3
+1: Saya juga cenderung membaca tanda + di akhir baris sebagai koma yang memisahkan dua item dalam daftar operan. Untuk alasan ini saya lebih suka meletakkan tanda + di akhir baris seperti yang akan saya lakukan dengan koma (saya tidak akan pernah memulai garis dengan koma).
Giorgio
@Iorgio Poin ini sangat bagus sehingga saya mencurinya untuk jawaban saya. Saya harap Anda bisa memaafkan saya.
Konrad Rudolph
Silakan: Saya merasa terhormat. ;-)
Giorgio
7
Kode bukan bahasa Inggris, dan saya pikir ini analogi yang salah untuk menggunakan aturan sintaksis bahasa Inggris sebagai cara untuk membenarkan konvensi pengkodean. Saya tidak suka gaya operator trailing, tapi saya akui Konrad memiliki poin bagus tentang bahasa seperti Python.
M. Dudley
3
Dalam penyusunan huruf matematika, jeda baris selalu sebelum operator, tidak pernah setelah. Dalam contoh biasa, operator "oleh karena itu". Dalam prosa bahasa Inggris, koma pada dasarnya adalah tanda nafas.
kevin cline