Keuntungan dan Kerugian Reformat Kode Paksa

19

Saat ini saya bekerja di tempat yang mungkin memaksa pengembang untuk menggunakan pemformat kode otomatis pada check-in kontrol versi. Saya mencari pendapat pengembang tentang kelebihan dan kekurangan dari melakukan ini ... bagaimana menurut Anda itu akan membantu atau menghambat pengembang. Kasus spesifik saya melibatkan Java / JSP, tapi saya pikir pertanyaannya bisa berlaku untuk bahasa apa pun.

Nerdfest
sumber
Memformat ulang otomatis JSP? Itu termasuk kode HTML / XML dan pemformatan ulang yang dapat dengan mudah menghancurkan / mengubah output yang dihasilkan.
edA-qa mort-ora-y

Jawaban:

23

Saya pikir sangat penting untuk melakukan ini. Inilah alasannya:

  • Itu membuat diff kontrol sumber Anda hanya menunjukkan perubahan kode aktual, dan semua kecuali menghilangkan "diff noise" karena spasi putih dan pilihan format tidak penting lainnya
  • Itu membuat semua kode lebih mirip, sehingga pengembang lebih nyaman memasangkan dan berbagi basis kode

Jika Anda melakukannya, saya akan merekomendasikan semua orang untuk memeriksa semua kode, lalu satu orang melakukan format ulang atas seluruh basis kode, lalu periksa semuanya kembali sehingga ada satu "raksasa" perubahan yang ditetapkan untuk pemformatan (yang dapat diabaikan semua orang), tetapi setelah itu, semua diff adalah diff kode nyata.

Jika Anda melakukannya sedikit demi sedikit, Anda akan mencampurkan perubahan kode nyata dengan memformat perubahan dan hal-hal yang tidak perlu akan berantakan di tanah perubahan.

Bohemian
sumber
1
Menggigit peluru pada perubahan global benar-benar cara terbaik, saya setuju; selesaikan dan tidak ada yang perlu khawatir lagi.
Patrick Hughes
... sampai Anda mengubah konvensi gaya Anda.
Nerdfest
1
@Nerdfest Kemudian Anda menerapkan konvensi baru Anda pada semua proyek Anda dalam satu komit. Itu bukan masalah besar.
gizmo
2
Alat "diff" Anda agak menyebalkan jika tidak dapat menangani perubahan spasi dengan benar.
edA-qa mort-ora-y
2
Akan selalu ada pengecualian di mana format yang sedikit berbeda cenderung lebih bersih daripada gaya yang ditentukan. Konversi otomatis dengan demikian seringkali dapat menyembunyikan maksud dari blok kode tertentu, yang secara efektif sama baiknya dengan menambahkan cacat pada kode.
edA-qa mort-ora-y
10

Saya akan melemparkan jawaban saya sendiri di sini karena orang-orang sepertinya hanya menambah keuntungan. Apa yang saya lihat sebagai kerugian adalah:

  • Menghilangkan kemampuan untuk melakukan 'lebih baik' daripada pemformat otomatis ... itu akan membatalkan pemformatan bersih Anda. Contohnya adalah deklarasi parameter berbasis kolom, daftar tambahan objek yang diskrit, dll.
  • Menciptakan resistensi terhadap perubahan konvensi gaya karena ini sekarang akan membuat perubahan diff besar menyesatkan.
  • Menghapus kemampuan untuk melakukan format 'kasus khusus' di mana format alternatif akan membuat kode lebih mudah dibaca.
  • Ini mengikat Anda dalam menggunakan IDE yang mendukung persis fitur pemformatan yang Anda perlu. Di IDE lain hilang salah satu opsi yang Anda butuhkan, itu akan menyebabkan setidaknya beberapa masalah.
  • Menjadi bermasalah berbagi repositori kode yang dapat ditulis dengan grup eksternal kecuali jika mereka menggunakan konvensi format yang sama persis dengan grup Anda (Mereka biasanya akan, tetapi tidak selalu).
  • Selalu ada pengecualian di mana format yang sedikit berbeda cenderung lebih bersih daripada gaya yang ditentukan. Konversi otomatis dengan demikian seringkali dapat menyembunyikan maksud dari blok kode tertentu, yang secara efektif sama baiknya dengan menambahkan cacat pada kode.

Sederhananya, seperangkat konvensi non-otomatis menetapkan persyaratan gaya / keterbacaan minimum, di mana konvensi otomatis menetapkan minimum dan maksimum.

Saya ingat melihat VB (versi 5 mungkin) dan menemukan salah satu hal yang paling menyebalkan tentang itu adalah bahwa ia akan memformat ulang kode saya secara paksa dan menghapus hal-hal di atas dan di luar pemformatan dasarnya.

Nerdfest
sumber
Satu konvensi pembentukan atas yang lain jarang memberi manfaat jika itu datang dengan mengorbankan konsistensi. Anda terbiasa dengannya. Ikuti saran Bohemian dan ciptakan masa tenggang untuk membantu menentukan gaya pembentukan dan kemudian bertahan dengannya. Mengubah format seharusnya tidak dianggap enteng.
JeffO
3
@ Jeff, saya tidak percaya dia menganjurkan pemformatan kode yang tidak konsisten, tetapi pemformatan kode yang konsisten yang sulit untuk diotomatisasi. Misalnya, banyak gaya pengkodean menentukan penjajaran kolom secara estetika ketika Anda memiliki beberapa baris data terkait. Ini sangat meningkatkan keterbacaan, tetapi sangat sulit untuk mengotomatisasi definisi "estetika" atau "terkait." Itulah alasan beberapa pemformat kode akan memungkinkan pemformatan manual untuk menimpa dalam keadaan tertentu.
Karl Bielefeldt
1
Jauh lebih baik untuk memiliki format yang konsisten 99,9% dari waktu dan memasang dengan sedikit aneh yang Anda pribadi tidak suka, daripada memasang dengan mismash yang tidak disiplin. Saya mungkin tergantung seberapa disiplin tim di mana keseimbangan berada. Jika Anda tetap berpegang pada norma yang ditetapkan untuk suatu bahasa, semua editor / IDE yang layak akan mampu memformat seperti itu. Jika Anda bersikeras untuk keluar dari norma, Anda akan mengalami kesulitan.
mattnz
3

Saya menemukan bahwa pemformatan kode paksa sangat bagus. Ini memungkinkan pengembang untuk melintasi seluruh kumpulan kode tanpa mata mereka terpental ke mana-mana. Juga memiliki standar ini di tempat membantu pengembang pemula menghentikan kebiasaan buruk.

Woot4Moo
sumber
3

Kerugian utama adalah kehilangan pemformatan khusus di tempat yang benar-benar penting.

Bayangkan cek kewarasan tipikal jika () yang akan gagal jika ada kondisi spesifik hadir tetapi tidak terpenuhi ...

  if(
      (user.id == TEST_ID)
    ||(
         (user.id == UserID)
       &&( 
             ( user.type == HUMAN_USER && user.name.size() >= MIN_NAME )
           ||( user.type == EMULATION && input.source != SOURCE_INTERNAL ))
       && ( user.email == NULL || emailValidator.isValid(user.email))
       && ( (user.phone == NULL) == (user.type == EMULATION) )

       // several more lines like this.)
    ){ /* handle results */ }

Ini dapat dibaca berkat indentasi yang masuk akal mengikuti struktur logis dari kondisi.

Sekarang alat otomatis Anda tidak memiliki petunjuk tentang pemisahan logis dari kondisi yang berbeda ke jalur terkait. Tidak ada alasan mengapa masing-masing rumpun 3-4 kondisi dalam satu baris dan membagi kondisi berikutnya menjadi dua. Atau itu akan membaginya, satu ekspresi perbandingan per baris. Bahkan mungkin terlihat lebih cantik di layar tetapi logikanya akan hilang.

SF.
sumber
Ini berantakan, otak positron saya baru saja meleleh. Begitu banyak inkonsistensi dengan spasi putih di sekitar (dan). Itulah sebabnya kami membutuhkan mesin untuk memformat kode. Dan Anda selalu dapat memberikan komentar satu baris sebelum / sesudah (tergantung pada konvensi Anda) untuk memaksa pengelompokan kondisi. Ini juga akan membantu untuk menjelaskan kepada pembaca aturan bisnis di balik kondisi ini - tepat di komentar satu baris ini.
Štefan Oravec
@ ŠtefanOravec: Jalankan ini melalui autoformatter dan terapkan komentar ini. Lihat apakah itu lebih mudah dibaca. Uji pengguna - selalu. Pengguna manusia dengan nama pengguna yang valid. Pengguna yang ditiru - hanya sumber eksternal. Email, jika ada, harus valid. Pengguna manusia harus memiliki nomor telepon; ditiru - tidak boleh. Lihat bagaimana komentar single-line Anda sejajar dengan kode yang diformat secara otomatis.
SF.
2

Saya telah menambahkan jawaban dengan kerugian, dan saya akan memasukkan apa yang saya anggap keuntungan besar juga.

Ketika Anda menggunakan memformat ulang kode otomatis saat melakukan, itu sebenarnya membuka kemungkinan variasi preferensi pribadi tanpa efek yang biasa terjadi pada preferensi Anda terhadap orang lain. Anda dapat memiliki kode format IDE ke standar umum saat melakukan, tetapi tampilkan kepada Anda dalam format pilihan Anda tanpa mempengaruhi orang lain.

Bagi saya ini hampir merupakan Holy Grail dari pengkodean berbasis konvensi ... Anda mendapatkan keuntungan dari format kode yang umum, tetapi masih memungkinkan preferensi pribadi didukung tanpa konflik.

Nerdfest
sumber
0

Itu tergantung pada kebutuhan Anda, tetapi beberapa kendala cukup membantu, misalnya setiap if () harus diikuti oleh kurung kurawal, karena cukup mudah untuk mendapatkan jika salah jika Anda refactoring.

Pertimbangkan hal itu:

if( x == 0 ) 
   return foo;
//do something else
return bar;

Jika sekarang Anda ingin menambahkan beberapa logging ke if jika Anda mungkin secara tidak sengaja menulis:

if( x == 0 ) 
  log.info("x was 0");
  return foo;
//do something else
return bar;

Dan tiba-tiba metode Anda selalu kembali foo .

Sunting: itu bukan pada pemformatan otomatis melainkan pengecekan gaya. Maaf jika jawaban itu di luar topik juga. :)

Thomas
sumber
Itu lebih merupakan gaya kode, bukan format. Ada alat membangun untuk itu.
@ Bohemian, Anda benar, saya salah membaca pertanyaan. Alat bangun pilihan kami adalah checkstyle btw. :)
Thomas
0

Sangat membantu untuk menyeragamkan kode di perusahaan, dan berkat itu, Anda secara umum menghasilkan struktur yang lebih mudah dipahami dan lebih mudah dirawat untuk produk Anda.

talnicolas
sumber
0

Yah, keuntungannya sama dengan formatter kode apa pun, seperti standardisasi kode, semantik antar pengembang, dll. Satu-satunya kelemahan yang mungkin saya lihat adalah kurangnya mata manusia setelah memformat, untuk menambahkan beberapa pengecualian, dll.
Jadi saya tebakan lebih baik pertimbangkan formatter IDE daripada formatter waktu check-in.

kaki biru
sumber
0

Dalam pengalaman saya, itu hal yang baik. Tanpa satu, pembandingan kode sering menunjukkan kekacauan format spasi, dan dapat menyembunyikan perubahan kode aktual. Dalam pengalaman saya, mengacaukan pemformatan seseorang bukanlah dosa yang dibuatnya, terutama dengan manfaat potensial dari konsistensi di seluruh tim.


sumber