Apakah itu ide buruk untuk menjalankan pemformat kode secara berkala pada repositori?

68

Saya sedang berpikir untuk membuat pekerjaan cron yang memeriksa kode, menjalankan pemformat kode di atasnya, dan jika ada yang berubah, melakukan perubahan dan mendorong mereka kembali.

Sebagian besar proyek yang menggunakan autoformatters menempatkan mereka di hook git, tetapi melakukannya secara otomatis setiap beberapa jam akan menghilangkan beban bagi setiap pengembang untuk menginstal hook git.

Saya masih akan mendorong semua orang untuk menulis kode yang bersih dan diformat dengan baik, dan mungkin saya dapat memiliki sistem secara otomatis melakukan ping devs ketika kode yang mereka tulis diformat ulang, sehingga mereka tahu apa yang harus dilakukan di masa depan.

orang besar
sumber
105
Ada kesalahan logis di sini. Metode ini tidak akan mendorong orang untuk menulis kode yang diformat dengan baik; melainkan akan mendorong orang untuk tidak memformat dan mengandalkan sistem sebagai gantinya! Jika kekhawatiran Anda adalah bahwa basis kode itu koheren, tidak apa-apa. Itu tujuan Anda adalah untuk melatih coders untuk menulis dengan bersih, ini adalah bug yang sangat besar.
Kilian Foth
52
Itu juga dengan mempertimbangkan efek ini akan memiliki pada fitur seperti menyalahkan - terutama jika formatter membuat banyak perubahan, jika sebagian besar baris dalam file ditandai sebagai sedang diubah oleh formatter, Anda kehilangan sebagian nilainya.
Neil P
13
Saya mengalami masalah dengan autoformatter yang tidak diperbarui dengan benar dan melanggar kode saya. Sesuatu yang perlu diingat.
isaacg
22
Jika itu penting bagi Anda, Anda bisa gagal membangun ketika kode di tidak diformat dengan benar. Itu agak keras tetapi peer review yang tepat akan lebih atau kurang melakukan hal yang sama.
Erno
18
Ini adalah ide yang bagus jika tujuan Anda adalah membuat orang membenci Anda. Ini mencapai sangat sedikit, tetapi pasti akan menyebabkan masalah yang tidak terduga.
TonyK

Jawaban:

130

Kedengarannya bagus, tapi saya lebih suka orang yang bertanggung jawab melakukan perubahan kode, bukan bot.

Selain itu, Anda ingin memastikan bahwa perubahan itu tidak merusak apa pun. Misalnya, kami memiliki aturan yang memesan properti dan metode berdasarkan abjad. Ini dapat berdampak pada fungsionalitas , misalnya dengan urutan data dan metode dalam file WSDL kontrak WCF.

Marcel
sumber
50
Juga agak merusak VCS. Anda tidak akan dapat mengetahui siapa yang menulis kalimat dengan mudah dengan menyalahkan, dan jika ada konflik, VCS Anda tidak akan dapat mengetahui perubahan alat hanya untuk gaya dan harus dibuang setiap kali.
Pierre.Sassoulas
2
Topik yang berhubungan dengan tangensial adalah menegakkan "save action" tertentu dalam IDE seperti membuat bidang final jika memungkinkan. Ini masalah karena (setidaknya di Jawa) banyak kerangka kerja mengaturnya melalui refleksi (misalnya, Spring dan Hibernate).
Kapten Man
20
@ Jeffe git blametidak hanya untuk menemukan kesalahan bug, tetapi juga untuk menemukan komit ketika sesuatu ditambahkan / dihapus, yang dapat berguna karena sejumlah alasan.
Pokechu22
2
"Kami memiliki aturan yang memerintahkan properti dan metode berdasarkan abjad" Wah, kedengarannya mengerikan! Anda harus terus-menerus berharap di seluruh file
Alexander
1
Juga untuk Jawa kombinasi pemeriksa gaya yang mencari turunan dari gaya yang disepakati (bahkan mungkin menjadikannya peringatan kompilasi), dan IDE yang dikonfigurasi untuk memformat gaya yang disepakati membuatnya sangat mudah untuk dideteksi dan diperbaiki. Penting untuk menyelesaikan kode (karena tidak ada kata yang lebih baik) ketika kode itu benar-benar mengubah fungsionalitas - bukan ketika bot memformat ulangnya.
Thorbjørn Ravn Andersen
72

Saya akan mencoba membuatnya sangat mudah bagi semua orang di tim untuk menerapkan pemformatan kode otomatis sesuai dengan standar tim Anda langsung di dalam editor atau IDE Anda , ke file kode sumber saat ini (atau bagian tertentu dari itu). Ini memberi anggota tim Anda lebih banyak kontrol tentang bagaimana dan kapan pemformatan dilakukan, biarkan mereka memeriksa kode sebelum dilakukan dalam bentuk final, dan mengujinya setelah pemformatan itu terjadi , bukan sebelumnya.

Jika semua atau sebagian besar anggota tim Anda menggunakan editor yang sama, ini seharusnya tidak terlalu sulit. Jika semua orang menggunakan yang berbeda, maka pendekatan Anda mungkin merupakan solusi terbaik kedua, selama tim mendukungnya. Namun, saya sarankan Anda memiliki langkah-langkah keamanan tambahan yang diinstal, seperti bangunan malam hari dan pengujian otomatis yang dijalankan setelah setiap modifikasi kode otomatis.

Doc Brown
sumber
7
"Seorang penata format di mana Anda 100% yakin tidak akan merusak apa pun" - Kapan Anda pernah menemukan kode yang Anda, jujur, 100% yakin tidak akan pernah rusak?
Zibbobz
2
@Zibbobz: alat apa pun yang kami gunakan untuk mengedit kode, untuk mengkompilasi dan menautkannya, dan juga VCS, dapat memiliki bug, masih yang tidak menghentikan kami mencoba mengembangkan program kerja ;-) Tapi lihat edit saya.
Doc Brown
Saya menyetujui edit - jika hanya karena satu ons ekstra hati-hati bernilai satu pon debugging. ;)
Zibbobz
@ Zibbobz Cukup sering! Perhatikan bahwa 100% yakin akan sesuatu tidak berarti ia memiliki peluang 100% untuk menjadi kenyataan.
user253751
@immibis: Anda mungkin melewatkan komentar yang merujuk pada kalimat yang saya hapus dari jawaban saya beberapa hari yang lalu.
Doc Brown
37

Ini adalah ide yang buruk, bukan hanya karena tidak mendorong orang untuk menulis kode yang layak, tetapi juga karena pemformatan ulang akan muncul sebagai perubahan kode dalam VCS Anda (Anda memang menggunakan yang saya harap), menutupi aliran historis pengembangan kode. Lebih buruk lagi, setiap tindakan pemformatan kode (memang setiap perubahan pada kode sama sekali) memiliki kemungkinan untuk memperkenalkan bug, apakah itu manual atau otomatis. Jadi pemformat Anda sekarang dapat memperkenalkan bug dalam kode Anda yang tidak akan melalui tinjauan kode, pengujian unit, pengujian integrasi, dll hingga beberapa bulan kemudian.

jwenting
sumber
10
Saya pikir jika dia berbicara tentang memiliki bot memeriksa hal-hal masuk dan keluar dari repositori, apakah VCS diberikan?
StarWeaver
11
@Tartareaver Anda akan berpikir. Tetapi saya telah bekerja di tempat-tempat di mana "repositori kode" adalah direktori terlindung yang hanya dapat diakses oleh perangkat lunak yang berjalan di bawah akun penggunanya sendiri, tidak ada kontrol versi sama sekali kecuali cadangan mingguan dari direktori di bawah nama direktori timestamped.
jwenting
14
Itu ... Aku akan pergi mengalami mimpi buruk sekarang>.>
StarWeaver
7
@StarWeaver mengapa Anda pikir saya masih ingat lingkungan itu 14 tahun kemudian;)
jwenting
28

Saya akan cenderung percaya itu adalah ide yang baik (untuk secara otomatis menjalankan pemformat kode), tetapi itu hanya pendapat saya.

Saya tidak akan menjalankannya secara berkala, tetapi jika memungkinkan sebelum kontrol versi dilakukan.

Dengan git , melakukan hook pre-commit akan berguna. Dalam banyak proyek C atau C ++ yang dibangun dengan beberapa Makefile , saya menambahkan beberapa indenttarget (yang menjalankan formatters kode yang sesuai seperti indentatau astyle) dan mengharapkan kontributor berjalan make indentsecara teratur. BTW, Anda bahkan dapat menambahkan beberapa makeaturan untuk memastikan bahwa kait git telah diinstal (atau untuk menginstalnya).

Tapi sungguh, ini lebih merupakan masalah sosial daripada masalah teknis . Anda ingin tim Anda melakukan kode yang bersih dan diformat dengan baik, dan itu adalah aturan sosial dari proyek Anda. (Tidak selalu ada jawaban teknis untuk setiap masalah sosial).

Kontrol versi sebagian besar adalah alat untuk membantu komunikasi antara pengembang manusia (termasuk diri Anda sendiri beberapa bulan dari sekarang). Perangkat lunak Anda tidak perlu VC atau format, tetapi tim Anda melakukannya.

BTW, komunitas yang berbeda dan bahasa pemrograman yang berbeda memiliki pandangan berbeda tentang pemformatan kode. Misalnya, Go hanya memiliki satu gaya pemformatan kode, tetapi C atau C ++ memiliki banyak dari mereka.

Basile Starynkevitch
sumber
Benar, tetapi itu berarti setiap pengembang perlu menginstal hook komit.
bigblind
17
Ya, tetapi itu adalah aturan sosial, dan Anda memerlukan beberapa di antaranya. Anda tidak dapat menemukan solusi teknis untuk setiap masalah sosial. Anda perlu meyakinkan orang. Juga, setiap pengembang perlu menginstal beberapa kompiler, dan sistem kontrol versi itu sendiri.
Basile Starynkevitch
Benar, jadi Anda mengatakan aturan sosial untuk menginstal git hook, lebih baik daripada sistem otomatis yang melakukannya? (pertanyaan serius, tidak dimaksudkan sebagai retoris, nada sulit untuk disampaikan di internet :))
bigblind
15
Ya, saya mengatakan itu.
Basile Starynkevitch
17

Saya pikir itu ide yang buruk. Banyak jawaban yang sudah dibahas bahwa itu memecah sejarah dengan membuatnya sulit untuk menentukan siapa yang sebenarnya menambahkan garis dan bahwa itu mendorong orang untuk hanya melakukan apa pun dan format-bot akan menanganinya.

Pendekatan yang lebih baik adalah dengan memasukkan pemeriksa format ke alat build Anda. (Di Jawa ada Checkstyle ) Kemudian, hanya izinkan orang untuk menggabungkan cabang mereka ke cabang utama jika build melewati (termasuk pemformatan).

Jika Anda mengizinkan orang untuk melakukan langsung ke cabang utama (seperti dalam Subversion misalnya) maka Anda masih perlu memastikan semua orang memiliki disiplin untuk melakukan hanya kode yang diformat (atau server hanya menerima komit setelah beberapa pemeriksaan telah dijalankan ).

Kapten Man
sumber
2
tapi pastikan pemeriksa gaya waras dan tidak memaksakan hal-hal aneh yang bertentangan dengan praktik yang diterima (dan dapat diterima) (dan ya, saya pernah melihatnya). Anda kemudian dapat juga memiliki server build memiliki build build gagal ketika pemeriksa gaya melempar kesalahan (baru).
jwenting
2
Saya telah melihat banyak kasus di mana pemformatan otomatis menghasilkan kode yang tidak dapat dibaca. Khusus untuk banyak parens penutup (masuk akal untuk meninggalkan beberapa dari mereka pada garis yang terpisah, tetapi robot tidak peduli). Contoh lain adalah pemisahan otomatis string Java panjang (mereka panjang karena mengandung query SQL, tetapi robot tidak tahu.).
18446744073709551615
@ 18446744073709551615 Saya tidak menyarankan pemformatan otomatis, saya menyarankan pemeriksaan otomatis . Aturan Anda bisa memungkinkan hal-hal itu.
Kapten Man
16

Secara umum, saya pikir itu ide yang buruk. Pada prinsipnya itu adalah ide yang valid, tetapi pada kenyataannya bisa bermasalah. Membuat pemecah kode pemecah kode Anda adalah kemungkinan yang nyata, dan hanya perlu satu kali pemformatan untuk membuat pengembang Anda merespons dengan permusuhan (mungkin dibenarkan) (mis. "Pemformat kode buruk Anda merusak build, matikan sekarang! " ).

Dalam nada yang sama dengan rekomendasi @ BasileStarynkevitch, kami menggunakan kait pasca-penerimaan git sisi server untuk mengirim "email penasihat" tentang gaya kode.

Jika saya mendorong komit yang berisi pelanggaran gaya, server asal git akan mengirim saya email yang memberitahu saya bahwa saya melanggar pedoman gaya dan merekomendasikan agar saya memperbaiki kode saya. Namun, ini tidak menegakkan ini karena mungkin ada alasan yang sah untuk melanggar gaya rumah (string panjang melebihi batas panjang garis, misalnya).

Jika ini adalah masalah sistemik yang merusak basis kode, mungkin sudah saatnya untuk mulai memunculkan masalah gaya kode dalam ulasan kode. Gaya kode yang buruk dapat menutupi bug dan membuat kode lebih sulit dibaca, sehingga bisa menjadi masalah ulasan kode yang valid.

Untuk menambah aspek "masalah sosial", ada baiknya mendorong orang untuk memperbaiki cacat kosmetik dan gaya saat mereka menemukannya. Kami memiliki pesan komit standar "Kosmetik." untuk perbaikan gaya kode yang diketahui pengembang lain tidak mengandung perubahan yang melanggar.

Seperti kata @DocBrown, opsi lain adalah untuk menegakkan gaya kode dalam IDE Anda. Kami menggunakan CodeMaid dengan Visual Studio untuk memperbaiki banyak kesalahan gaya umum. Ini akan berjalan saat menyimpan file kode, artinya kode gaya buruk seharusnya tidak pernah membuatnya menjadi repo ... dalam teori :-).

Karl Nicoll
sumber
Saya memutakhirkan yang ini, karena secara langsung membahas kedua sisi (keinginan untuk kode yang lebih baik + keamanan dari melanggar build). Namun, setelah basis kode dalam kondisi yang sangat baik, saya akan menganggap "ide buruk" menjadi kata-kata yang agak kuat untuk mengotomatiskan perubahan di masa depan.
donjuedo
10

Ya, saya pikir itu ide yang buruk. Jangan salah paham, alasan untuk melakukannya kedengarannya hebat, tetapi hasilnya masih bisa mengerikan.

Anda akan memiliki konflik menggabungkan ketika menarik cabang dilacak, setidaknya aku takut itu akan terjadi, aku mungkin salah.

Saya tidak ingin mengujinya sekarang di tempat kerja, tetapi Anda harus mencobanya sendiri.

Bahkan Anda bisa melihat komit terbaru. Buat cabang baru, lakukan sesuatu yang kecil, cherry pick atau gabung tanpa autocommit.

Kemudian jalankan skrip Anda, tarik dan jika hasilnya adalah kekacauan gabungan yang mengerikan, maka Anda pasti tidak melakukan ini, di siang hari.

Alih-alih, Anda berpotensi memasukkannya ke bangunan malam atau bangunan mingguan.

Tetapi bahkan setiap malam mungkin merupakan ide yang buruk.

Anda bisa menjalankannya setiap minggu, ketika Anda yakin tidak ada konflik gabungan yang akan muncul karena semuanya selesai pada hari Senin.

Kalau tidak, jalankan 1-2 kali setahun pada musim liburan, ketika konflik gabungan tidak akan terjadi.

Tetapi solusinya mungkin tergantung pada prioritas Anda untuk gaya kode.

Saya pikir membuat skrip setup yang secara otomatis membuat repositori git dan menetapkan hook untuk proyek akan lebih baik.

Atau Anda mungkin memasukkan skrip setup hook ke dalam folder untuk devs Anda di dalam proyek dan cukup memeriksanya di git itu sendiri.

Semoga Membantu
sumber
7

Sesuatu yang belum pernah saya lihat sebutkan adalah fakta bahwa kadang-kadang ada alasan yang sah untuk tidak memformat sesuatu berdasarkan seperangkat aturan. Kadang-kadang kejelasan kode ditingkatkan dengan bertentangan dengan pedoman yang diberikan bahwa 99% dari waktu masuk akal. Manusia perlu menelepon itu. Dalam kasus tersebut, pemformatan kode otomatis akan berakhir membuat hal-hal menjadi kurang mudah dibaca.

Andy Lester
sumber
Setuju. Misalnya, menyelaraskan pengidentifikasi variabel di sebelah kiri, semua tanda sama dalam satu kolom, dan semua nilai di sebelah kanan tanda sama. Formatter akan mengurangi nilai keterbacaan dalam hal ini dengan mengurangi masing-masing tab / spasi menjadi satu ruang. Tentu saja aturan formatter dapat ditulis untuk mencegah hal ini, tetapi kemudian Anda memerlukan pengembang yang ditugaskan hanya untuk menulis formatter kode. Sepertinya ide yang buruk di sekitar. Terapkan konvensi in-house yang lebih baik dan lakukan selama tinjauan kode
ThisClark
7

Itu ide yang buruk.

Jika salah satu kolega pengembang saya membuat perubahan gratis ke file sumber, itu tidak akan melewati tinjauan kode. Itu hanya membuat hidup lebih sulit untuk semua orang. Ubah kode yang perlu diubah, tidak ada yang lain. Perubahan yang tidak berarti mengarah ke menggabungkan konflik, yang dapat menyebabkan kesalahan, dan hanya membuat pekerjaan yang tidak berguna.

Jika Anda ingin melakukan ini secara teratur, itu hanya mengerikan.

Dan kemudian ada pertanyaan tentang perubahan apa yang dilakukan oleh pemformat kode. Saya menggunakan pemformatan otomatis di editor saya, itu berfungsi dengan cukup baik, dan saya dapat meningkatkan hal-hal ketika pemformatan otomatis kurang sempurna. Jika Anda menggunakan pemformat kode yang melampaui itu, Anda tidak akan memperbaiki kode, Anda akan memperburuknya.

Dan kemudian ada masalah sosial. Ada orang yang ingin memaksa semua orang untuk menggunakan gaya kode mereka, dan ada orang yang lebih fleksibel. Sesuatu seperti ini kemungkinan akan disarankan oleh tipe pengembang "grammer-nazi" (ejaan yang disengaja) yang ingin memaksakan gaya mereka pada orang lain. Harapkan serangan balasan, dan harapkan pengembang yang fleksibel dan biasanya santai akan menyerah.

gnasher729
sumber
4

Anda tidak menyebutkan VCS yang Anda gunakan tetapi tergantung pada opsi lain adalah memiliki pengait sisi server. VCS seperti git mendukungnya. Anda bisa menginstal hook sisi-sisi yang menjalankan formatter pada versi yang didorong dan kemudian membandingkan file yang diformat dengan versi yang didorong. Jika berbeda, pengembang tidak menggunakan pemformatan yang benar dan server dapat menolak push. Ini akan memaksa devs Anda hanya mendorong kode dengan format yang diinginkan sehingga mendorong mereka untuk menulis kode bersih dari awal, itu akan membuat devs bertanggung jawab karena telah menguji kode yang diformat dengan benar dan membebaskan devs Anda dari keharusan menginstal secara manual sisi klien menghubungkan.

sigy
sumber
Inilah yang dilakukan Go, misalnya, kecuali menggunakan Mercurial. Mendorong sesuatu yang tidak invarian di bawah go fmtsecara otomatis ditolak.
Jörg W Mittag
1

Ini adalah pertukaran antara format kode yang lebih bersih dan lebih tepat dan lebih mudah untuk memahami sejarah git. Bergantung pada sifat proyek Anda dan seberapa sering Anda menyelam dalam sejarah git atau menyalahkan untuk memahami apa yang terjadi. Jika Anda mengerjakan sesuatu yang baru dan tidak harus mempertahankan kompatibilitas ke belakang, sejarah biasanya tidak memainkan peran penting.

Max Yankov
sumber
1

Gagasan ini mirip dengan beberapa jawaban lain, tetapi saya tidak dapat mengomentari saran saya.

Salah satu opsi adalah mengatur alias (atau kail, atau apa pun) ke fungsi komit, yang menjalankan pemformat kode pada kode yang akan dikomit sebelum dikomit.

Itu dapat memiliki 2 (atau lebih) hasil:

1) Tunjukkan pada pengguna perubahan yang diajukan dan minta persetujuan mereka untuk menerapkan dan melakukan perubahan.

2) Abaikan perubahan yang diajukan dan lakukan kode asli.

Anda juga dapat menambahkan lebih banyak fleksibilitas untuk opsi-opsi ini, seperti kemampuan untuk mengedit perubahan yang diusulkan dalam opsi 1. Gagasan lain (Tergantung pada seberapa keras Anda ingin mendorong standar pengkodean ini) adalah membuat sistem mengirimi Anda semacam laporan ketika opsi 2 dipilih.

Ini mungkin keseimbangan yang baik untuk memeriksa otomatis semua kode seperti yang Anda inginkan, sambil tetap memungkinkan fleksibilitas bagi pengembang untuk memenuhi kebutuhan mereka. Ini juga memungkinkan opsi untuk tidak 'menolak secara otomatis' kode dengan perbedaan format seperti yang disebutkan dalam jawaban lain. Dengan 'Saya telah meninjau dan menyetujui koreksi pemformatan otomatis; pilihan commit, masih menjaga akuntabilitas pribadi untuk setiap pengembang bekerja dan tidak mengacaukan VCS.

MadisonCooper
sumber
0

Saya tidak akan melakukannya di repositori tetapi saya akan melakukannya di save jika alat mendukungnya. Eclipse adalah satu dan selain itu saya akan melakukan pembersihan kode termasuk penyortiran.

Bagian yang bagus adalah bahwa itu adalah bagian dari proyek sehingga setiap pengembang akan mendapatkannya untuk proyek mereka.

Sebagai bonus tambahan, penggabungan akan disederhanakan secara signifikan karena banyak hal tidak akan terjadi.

Ulasan kode akan mencegah kesalahan.

Tempat lain yang akan saya lakukan adalah memilikinya bagian dari membangun. Dalam kasus saya, saya memilikinya sehingga maven build akan memformat ulang XML dan membersihkan file pom dan memformat ulang kode.

Dengan begitu ketika pengembang siap untuk mendorongnya semua akan dibersihkan untuk permintaan tarik mereka.

Archimedes Trajano
sumber