Dalam file yang berisi banyak bahasa (mis. File templat), apakah ada praktik terbaik mengenai indentasi?
Saya kebanyakan menggunakan ini:
<div>
IF FOO
<div>
<p>contents>
</div>
END FOO
</div>
Indentasi untuk setiap blok baru, terlepas dari bahasa. Ini memiliki beberapa kelemahan. Dalam file yang lebih kompleks, itu dapat mematahkan lekukan dari salah satu bahasa:
<div>
IF FOO
<div someattribute>
ELSE
<div otherattribute>
END FOO
<p>content</p>
</div>
</div>
Saya juga pernah melihat ini digunakan:
<div>
IF FOO
<div>
<p>contents>
</div>
END FOO
</div>
Yaitu. indentasi hanya satu bahasa. Ini memiliki keuntungan selalu konsisten, tetapi dalam file yang lebih kompleks hampir dapat sepenuhnya menyembunyikan beberapa detail implementasi, seperti blok yang bersyarat.
Tujuannya di sini jelas memaksimalkan keterbacaan.
Jawaban:
Menurut pendapat saya, prinsip utama untuk pengkodean yang baik adalah meminimalkan intermixture kode.
File dua bahasa secara inheren berantakan untuk dikerjakan. Prioritas Anda harus meminimalkan sejauh mana kedua bahasa itu saling terkait.
Misalnya, dalam file templat, logika yang diterapkan oleh bahasa templating harus dijaga seminimal mungkin. Bilamana memungkinkan, pindahkan logika di tempat lain dan hanya sajikan nilai dalam file templating.
Bahkan sesuatu seperti contoh Anda:
Bisa lebih baik diimplementasikan sebagai
dengan atribut yang digunakan dihitung di tempat lain. Dalam hal ini, maka, saya akan membiarkan pembacaan bahasa utama file menjadi penggerak strategi lekukan. Saya tidak akan membuat indentasi bahasa templating, dan kode templating yang cukup kompleks untuk membutuhkan indentasi mungkin dirancang dengan buruk.
sumber
Ini adalah salah satu alasan utama untuk menghindari sistem yang menggabungkan dua bahasa bersama seperti ini. Sangat sulit untuk memeriksa bagaimana aliran kontrol bahasa luar memengaruhi struktur blok bahasa dalam, dan ketika Anda tidak dapat melihat itu, bug terjadi.
Saya lebih suka memisahkan mereka dan ketika menghasilkan output dalam bahasa terstruktur lain selalu menggunakan sistem template yang menghormati penataan bahasa dan tidak memerlukan blok aliran kontrol untuk tugas-tugas umum.
sumber
(Seperti yang dijanjikan, pendapat saya berdasarkan pengalaman.)
Pertama-tama, jika Anda dapat mencegahnya: jangan tidak mencampur bahasa, bila memungkinkan.
Sebagai contoh Anda, sepertinya Anda kebanyakan bertanya-tanya tentang bagaimana hal itu harus dilakukan dalam bahasa templating yang dicampur dengan HTML, yang akan saya bahas. (Kasus lain akan membangun SQL menggunakan bahasa pemrograman lain, yang akan membutuhkan aturan yang sama sekali berbeda).
Sebagai contoh, saya akan membahas Django (tapi PHP, Twig, dll) kebanyakan berfungsi sama. Django memiliki blok logis dalam template (buka
{% tag %}
, tutup{% endtag %}
). HTML memiliki blok logis (buka<tag>
, tutup</tag>
). Di sini saya kebanyakan mengikuti aturan ini: kenaikan setelah tag terbuka, penurunan setelah tag penutup. Aturan lain yang saya pertahankan: pastikan bahwa konten blok Django adalah HTML yang diformat dengan baik.Per contoh Anda, menurut saya ini sangat salah:
Mengapa? Karena konten
IF
bukan HTML yang diformat dengan baik. Seperti apa bentuknya?(Karena bahasa template Anda tidak memiliki sintaks yang dapat diuraikan, kita perlu baris baru. Di Django, saya akan menulis)
Sebagai manfaat tambahan, bayangkan bahwa
<div>
ada 7 atribut, 1 di antaranya diputuskan berdasarkan kondisi tertentu. Atau lebih buruk: bagaimana jika memiliki 3 atribut yang masing-masing tergantung pada suatu kondisi. Itu akan memberikan 8 tag berbeda.Dengan mengingat "aturan" untuk menjaga konten semua blok diformat dengan baik dalam lingkup itu, Anda tidak perlu khawatir melanggar indentasi kedua bahasa.
Poin lain yang ingin saya bahas (meskipun sedikit di luar topik): Jika tag pembuka dan penutup berada pada baris yang berbeda, mereka harus menjadi satu-satunya tag pada baris itu.
Salah:
Sebaliknya, lebih suka
atau
(Peringatan: penggunaan lanjutan): Terkadang Anda memiliki beberapa tag pembungkus, Anda mungkin (tidak harus) menganggap ini sebagai satu tag:
Namun, sebaiknya jangan mencampur bahasa (host / tamu) saat melakukan ini. Dan sebaiknya jangan lakukan ini dengan
for
loop. Dan jangan lakukan ini dengan.TL; DR untuk pertanyaan spesifik Anda.
Dan catatan umum yang harus saya tambahkan (seperti biasa): gunakan penilaian Anda sendiri. Tahu kapan harus menyimpang.
sumber