Lekukan dalam file multi-bahasa [ditutup]

8

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.

Celos
sumber
1
+1: pertanyaan menarik. Saya akan melihat apakah saya bisa menuliskan pendapat saya (berdasarkan pengalaman) hari ini.
Sjoerd Job Postmus
@ SojoerdJobPostmus Tidak, tidak. Standar pengkodean harus memberi tahu identitas apa yang digunakan.
BЈовић
Ya itu. Itu perlu dijawab sebelum mendefinisikan standar pengkodean tentang hal itu.
Florian F
1
@ BЈовић, bagaimana jika tidak ada standar pengkodean? Bagaimana jika Anda yang membuat standar pengkodean? Seseorang harus memikirkan ini dan memutuskan solusinya. Bagaimanapun, pertanyaan apakah itu "menarik" sepenuhnya subjektif.
1
Pertanyaannya adalah tentang praktik terbaik. Apa yang dilakukan orang berpengalaman dalam hal ini? Apa pro dan kontra dari berbagai opsi? Sungguh subyektif, tidak ada benar dan salah, orang mengikuti selera mereka, tetapi ide bagus cenderung menyebar.
Florian F

Jawaban:

11

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:

<div>
    IF FOO
        <div someattribute>
    ELSE
        <div otherattribute>
    END FOO
        <p>content</p>
    </div> 
</div>

Bisa lebih baik diimplementasikan sebagai

<div>
    <div [FOO_ATTRIBUTE]>
        <p>content</p>
    </div> 
</div>

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
5

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.

Jules
sumber
3

(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:

<div>
    IF FOO
        <div someattribute>
    ELSE
        <div otherattribute>
    END FOO
        <p>content</p>
    </div>
</div>

Mengapa? Karena konten IFbukan HTML yang diformat dengan baik. Seperti apa bentuknya?

<div>
    <div
        IF FOO
            someattribute
        ELSE
            otherattribute
        END FOO
    >
        <p>Content</p>
    </div>
</div>

(Karena bahasa template Anda tidak memiliki sintaks yang dapat diuraikan, kita perlu baris baru. Di Django, saya akan menulis)

<div>
    <div {% if foo %}someattribute{% else %}otherattribute{% endif %}>
        <p>Content</p>
    </div>
</div>

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:

<ul>
    <li>This is something <a href="http://programmers.stackexchange.com">Usefull</a>
    </i>
</ul>

Sebaliknya, lebih suka

<ul>
    <li>This is something <a href="http://programmers.stackexchange.com">Usefull</a></li>
</ul>

atau

<ul>
    <li>
        This is something <a href="http://programmers.stackexchange.com">Usefull</a>
    </li>
</ul>

(Peringatan: penggunaan lanjutan): Terkadang Anda memiliki beberapa tag pembungkus, Anda mungkin (tidak harus) menganggap ini sebagai satu tag:

<ul>
    <li><div id="something"><span class="like this">
        Something like this
    </span></div></li>
</ul>

Namun, sebaiknya jangan mencampur bahasa (host / tamu) saat melakukan ini. Dan sebaiknya jangan lakukan ini dengan forloop. Dan jangan lakukan ini dengan.

TL; DR untuk pertanyaan spesifik Anda.

  • Anda memiliki 'host' (mis. Django templating) dan 'guest' language (mis. HTML). Pastikan blok bahasa host selalu berisi blok bahasa tamu yang diformat dengan benar.
  • Pembukaan setiap blok harus menambah indentasi, penutupan setiap blok harus sejajar dengan pembukaan.

Dan catatan umum yang harus saya tambahkan (seperti biasa): gunakan penilaian Anda sendiri. Tahu kapan harus menyimpang.

Sjoerd Job Postmus
sumber