Terdapat perdebatan sekarang dan kemudian mengenai nilai JavaScript yang ditaip. "Tulis lebih banyak ujian!" Sesetengah lawan menjerit. "Gantikan ujian unit dengan jenis!" yang lain menjerit. Kedua -duanya betul dalam beberapa cara dan salah pada orang lain. Ruang Twitter tidak mencukupi untuk mencerminkan kehalusan. Tetapi dalam artikel ini, kita boleh cuba menghuraikan hujah yang munasabah tentang bagaimana dan bagaimana kedua -duanya harus wujud bersama.
Ketepatan: Apa yang kita mahukan
Lebih baik bermula dengan hasilnya. Apa yang kita mahukan dari semua kejuruteraan meta ini adalah ketepatan . Saya tidak merujuk kepada definisi sains komputer teoretikal yang ketat, tetapi pematuhan yang lebih umum terhadap tingkah laku program dan norma -norma: ada idea dalam fikiran kita tentang bagaimana program berfungsi, dan proses pengaturcaraan menganjurkan bit dan bait, menjadikan idea ini menjadi kenyataan. Kerana kita tidak selalu tahu apa yang kita mahu, dan kita ingin memastikan bahawa program kita tidak pecah ketika membuat perubahan, kita menulis jenis dan ujian di atas kod asal yang ada hanya untuk membuat sesuatu berfungsi di tempat pertama.
Oleh itu, jika kita menerima ketepatan itu adalah apa yang kita mahu dan jenis dan ujian itu hanya cara automatik untuk mencapai matlamat ini, lebih baik mempunyai model intuitif untuk menunjukkan bagaimana jenis dan ujian membantu kita mencapai ketepatan, dengan itu memahami di mana mereka bertindih dan di mana mereka saling melengkapi.
Model visualisasi ketepatan program
Sekiranya kita membayangkan seluruh ruang yang tidak dapat dilengkapkan dari semua operasi yang boleh dilakukan oleh program ( termasuk kesilapan ) sebagai kawasan kelabu yang besar, maka apa yang kita mahu program ini dilakukan, spesifikasi kami, adalah subset yang sangat kecil dari ruang yang mungkin (rhombus hijau dalam angka di bawah, dibesar-besarkan dalam saiz untuk memaparkan sesuatu):
Tugas kami dalam pengaturcaraan adalah untuk menyelaraskan program kami dengan spesifikasi sebanyak mungkin (sudah tentu, kami tahu bahawa kami tidak sempurna, spesifikasi kami sentiasa berubah, seperti disebabkan oleh kesilapan manusia, ciri -ciri baru, atau tingkah laku yang tidak ditentukan, oleh itu kami tidak pernah berjaya mencapai pertindihan lengkap):
Perhatikan sekali lagi bahawa untuk tujuan perbincangan kami di sini, sempadan tingkah laku prosedur juga termasuk kesilapan yang dirancang dan tidak dirancang . Makna "ketepatan" kami termasuk kesilapan yang dirancang, tetapi tidak kesilapan yang tidak dirancang.
Ujian dan ketepatan
Kami menulis ujian untuk memastikan program kami memenuhi jangkaan kami, tetapi terdapat banyak pilihan untuk diuji:
Ujian yang ideal adalah titik oren dalam angka - mereka secara tepat menguji sama ada program kami bertindih spesifikasi. Dalam visualisasi ini, kita tidak benar-benar membezakan antara jenis ujian, tetapi anda boleh memikirkan ujian unit sebagai titik yang sangat kecil , dan ujian integrasi/akhir-ke-akhir adalah mata besar . Sama ada cara, mereka adalah mata, kerana tiada ujian dapat menggambarkan sepenuhnya setiap jalan dalam program ini. (Sebenarnya, anda boleh mempunyai liputan kod 100%, tetapi masih tidak dapat menguji setiap jalan kerana terdapat letupan gabungan!)
Titik biru dalam gambar adalah ujian yang buruk. Sudah tentu, ia menguji sama ada program kami berfungsi, tetapi ia sebenarnya tidak menyentuhnya kepada spesifikasi yang mendasari (pada penghujung hari, apa yang kita benar -benar ingin mendapatkan dari program ini). Ujian ini pecah apabila kita menetapkan program untuk menyelaraskan lebih rapat dengan spesifikasi, memberikan kita positif palsu.
Titik ungu adalah ujian yang berharga kerana ia menguji bagaimana kita fikir program itu harus berfungsi dan menentukan bidang di mana program ini tidak berfungsi sekarang. Memimpin dengan ujian ungu dan menetapkan pelaksanaan program yang sewajarnya juga dikenali sebagai pembangunan yang didorong oleh ujian .
Ujian merah dalam gambar adalah ujian yang jarang berlaku . Ia bukan ujian biasa (oren) yang menguji "jalan gembira" (termasuk keadaan yang salah pelan), tetapi ujian yang mengharapkan dan mengesahkan "jalan yang tidak berpuas hati " gagal. Jika ujian ini "berlalu" di mana ia sepatutnya "gagal," ia adalah tanda amaran awal yang besar bahawa sesuatu yang salah - tetapi pada dasarnya mustahil untuk menulis ujian yang cukup untuk menutup jalan yang besar yang mungkin tidak berpuas hati yang wujud di luar kawasan hijau spesifikasi. Sudah jarang mendapati bahawa ujian yang tidak seharusnya berfungsi adalah berharga, jadi mereka tidak melakukannya; Tetapi apabila keadaan menjadi salah, ia masih boleh menjadi tanda amaran awal yang berguna.
Taip dan ketepatan
Jika ujian adalah satu titik dalam ruang kebarangkalian di mana program boleh melakukan operasi, jenis mewakili kategori yang membahagikan seluruh bahagian dari jumlah ruang kebarangkalian. Kita boleh memvisualisasikannya sebagai segi empat tepat:
Kami memilih segi empat tepat untuk membandingkan berlian yang mewakili program ini, kerana tiada sistem jenis sendiri boleh menggunakan jenis untuk menggambarkan sepenuhnya tingkah laku program kami. (Untuk memberikan contoh mudah, ID yang harus selalu menjadi integer positif adalah jenis angka, tetapi jenis angka juga menerima pecahan dan nombor negatif. Selain dari kesatuan yang sangat mudah bagi literasi angka, adalah mustahil untuk mengehadkan jenis angka ke julat tertentu.)
Jenis bertindak sebagai kekangan di mana program boleh dijalankan apabila anda menulis kod anda. Sekiranya program kami mula melebihi sempadan jenis program yang ditentukan, pemeriksa jenis kami (seperti typescript atau aliran) hanya akan menolak untuk membiarkan kami menyusun program. Ini baik kerana dalam bahasa yang dinamik seperti JavaScript, mudah untuk secara tidak sengaja membuat program kemalangan yang pastinya bukan yang anda mahu buat. Nilai tambah yang paling mudah adalah pemeriksaan nilai null automatik. Jika Foo tidak mempunyai kaedah yang dinamakan bar, memanggil foo.bar () akan menghasilkan yang tidak dikenali yang terkenal bukanlah pengecualian runtime fungsi. Jika Foo ditaip sepenuhnya, anda boleh menangkap isu ini oleh Pemeriksa Jenis pada masa penulisan dan menunjukkan baris kod yang bermasalah (dan dengan manfaat yang disertakan dengan autokomplete). Ini adalah sesuatu yang tidak dapat dilakukan oleh ujian.
Kami mungkin ingin menulis jenis yang ketat untuk program kami seolah -olah kami cuba menulis sekecil mungkin segi empat tepat yang masih sesuai dengan spesifikasi kami. Walau bagaimanapun, ini mempunyai lengkung pembelajaran, kerana memanfaatkan sistem jenis melibatkan pembelajaran sintaks dan pengendali yang baru serta sintaks logik jenis generik yang diperlukan untuk mensimulasikan pelbagai JavaScript dinamik penuh. Manual dan helaian cheat membantu menurunkan lengkung pembelajaran, dan lebih banyak pelaburan diperlukan di sini.
Nasib baik, keluk pengangkatan/pembelajaran ini tidak perlu menghalang kami. Oleh kerana pemeriksaan jenis adalah proses pilihan untuk aliran, dan ketegangan yang boleh dikonfigurasikan dari TypeScript (keupayaan untuk secara selektif mengabaikan garis kod yang dipersoalkan), kita boleh memilih dari dalam skop keselamatan jenis. Kita juga boleh memodelkan ini:
Rectangles yang lebih besar, seperti segi empat tepat merah besar dalam imej di atas, menunjukkan penggunaan sistem jenis asas yang sangat longgar -contohnya, yang membolehkan implisit dan bergantung sepenuhnya pada kesimpulan jenis untuk hanya mengehadkan program kami dari pengekodan yang paling teruk.
Ketegangan sederhana (seperti segi empat tepat hijau bersaiz sederhana) boleh menunjukkan lebih banyak jenis yang setia, tetapi terdapat banyak kelemahan, seperti menggunakan sebarang contoh dan pernyataan jenis manual di seluruh pangkalan kod. Walau bagaimanapun, walaupun kerja menaip ringan seperti itu dilakukan, kemungkinan kawasan permukaan program yang berkesan yang tidak sepadan dengan spesifikasi kami akan dikurangkan.
Ketegangan maksimum, seperti segi empat tepat ungu, membuat perkara -perkara yang begitu ketat sehingga kadang -kadang mendapati bahagian -bahagian program anda yang tidak sesuai (yang biasanya tidak dirancang dalam tingkah laku program). Mencari kesilapan dalam program sedia ada seperti ini adalah kes yang sangat biasa dalam pasukan yang menukar asas kod JavaScript biasa. Walau bagaimanapun, mendapatkan keselamatan jenis maksimum dari pemeriksa jenis kami mungkin memerlukan memanfaatkan jenis generik dan pengendali khas yang direka untuk menyempurnakan dan mempersempit ruang jenis yang mungkin untuk setiap pembolehubah dan fungsi.
Perhatikan bahawa kita tidak perlu menulis program sebelum menulis jenis. Lagipun, kami hanya mahu jenis kami untuk mensimulasikan spesifikasi kami dengan teliti, jadi kami sebenarnya boleh menulis jenis kami terlebih dahulu dan kemudian mengisi pelaksanaan kemudian. Secara teori, ini akan menjadi pembangunan yang didorong oleh jenis ; Dalam praktiknya, beberapa orang benar -benar mengembangkan cara ini, kerana jenis menembusi dan intertwin dengan kod program sebenar kami.
Letakkan mereka bersama
Apa yang akhirnya kita ingin bina adalah visualisasi intuitif yang menggambarkan bagaimana jenis dan ujian saling melengkapi dalam memastikan ketepatan program.
Ujian kami menegaskan bahawa program kami dilakukan secara khusus seperti yang diharapkan dalam laluan kritikal yang dipilih (walaupun, seperti yang disebutkan di atas, terdapat beberapa variasi ujian lain, sebahagian besar ujian berbuat demikian). Dalam bahasa visual yang telah kami usahakan, mereka "memperbaiki" rhombus hijau gelap program ke rhombus hijau cahaya kanonik. Mana -mana pergerakan program akan memusnahkan ujian ini, yang akan menyebabkan mereka berjaga -jaga. Ia hebat! Ujian juga mempunyai fleksibiliti dan konfigurasi yang tidak terhad untuk kes penggunaan yang paling disesuaikan.
Jenis kami menegaskan bahawa program kami tidak akan keluar dari kawalan kami dengan melarang mod kegagalan yang mungkin di luar sempadan yang kami lukis, dengan harapan dapat mengelilingi spesifikasi kami sedekat mungkin. Dalam bahasa visual kami, mereka "mengandungi" kemungkinan hanyutan program yang menyimpang dari norma (kerana kami sentiasa mempunyai kelemahan, dan setiap kesilapan yang kami buat menambah kegagalan tambahan kepada program kami). Jenis juga tumpul, tetapi kuat (kerana alat kesimpulan dan alat editor) yang mendapat manfaat daripada komuniti yang kuat yang menyediakan jenis yang anda tidak perlu menulis dari awal.
Pendek kata:
- Ujian adalah yang terbaik untuk memastikan bahawa jalan gembira berfungsi.
- Jenis -jenis yang terbaik untuk mencegah jalan yang tidak berpuas hati dari yang ada.
Gunakan mereka bersama -sama mengikut kekuatan mereka untuk hasil yang terbaik!
Sekiranya anda ingin mengetahui lebih lanjut mengenai bagaimana jenis dan ujian menyeberang, ucapan hebat Gary Bernhardt mengenai sempadan dan trofi ujian Kent C. Dodds mempunyai kesan yang signifikan terhadap pemikiran saya tentang jawatan ini.
Atas ialah kandungan terperinci Jenis atau ujian: Mengapa tidak kedua -duanya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Terdapat tiga cara untuk membuat pemutar pemuatan CSS: 1. Gunakan pemutar asas sempadan untuk mencapai animasi mudah melalui HTML dan CSS; 2. Gunakan pemutar tersuai pelbagai mata untuk mencapai kesan lompat melalui masa kelewatan yang berlainan; 3. Tambahkan pemutar dalam butang dan beralih kelas melalui JavaScript untuk memaparkan status pemuatan. Setiap pendekatan menekankan pentingnya butiran reka bentuk seperti warna, saiz, kebolehcapaian dan pengoptimuman prestasi untuk meningkatkan pengalaman pengguna.

Untuk menangani keserasian pelayar CSS dan isu awalan, anda perlu memahami perbezaan sokongan penyemak imbas dan menggunakan awalan vendor dengan munasabah. 1. Memahami masalah biasa seperti Flexbox dan sokongan grid, kedudukan: prestasi tidak sah, dan prestasi animasi adalah berbeza; 2. Periksa status sokongan ciri CANIUSE Ciri; 3. Gunakan dengan betul -webkit-, -moz-, -ms-, -o- dan awalan pengeluar lain; 4. Adalah disyorkan untuk menggunakan autoprefixer untuk menambah awalan secara automatik; 5. Pasang postcss dan konfigurasi penyemak imbas untuk menentukan penyemak imbas sasaran; 6. Secara automatik mengendalikan keserasian semasa pembinaan; 7. Ciri -ciri pengesanan moden boleh digunakan untuk projek lama; 8. Tidak perlu meneruskan konsistensi semua pelayar,

Themaindifferencesbetweendisplay: inline, block, andinline-blockinhtml/cssarelayoutbehavior, spaceusage, andstylingcontrol.1.inlineelementsflowwithtext, notstartonNewlines, abaikanwidth/height, andonyapplylylylylylinddding/

Gunakan atribut clip-path CSS untuk menanam unsur-unsur ke dalam bentuk tersuai, seperti segitiga, takik bulat, poligon, dan lain-lain, tanpa bergantung pada gambar atau SVG. Kelebihannya termasuk: 1. Menyokong pelbagai bentuk asas seperti Circle, Ellipse, Polygon, dan lain -lain; 2. Pelarasan responsif dan boleh disesuaikan dengan terminal mudah alih; 3. Mudah untuk animasi, dan boleh digabungkan dengan hover atau javascript untuk mencapai kesan dinamik; 4. Ia tidak menjejaskan aliran susun atur, dan hanya tanaman kawasan paparan. Penggunaan umum adalah seperti laluan klip bulat: bulatan (50pxatcenter) dan triangle clip-path: polygon (50%0%, 100 0%, 0 0%). Notis

Menetapkan gaya pautan yang telah anda lawati dapat meningkatkan pengalaman pengguna, terutama di laman web yang berintensifkan kandungan untuk membantu pengguna menavigasi lebih baik. 1. Gunakan CSS: Kelas pseudo yang dilawati untuk menentukan gaya pautan yang dikunjungi, seperti perubahan warna; 2. Perhatikan bahawa penyemak imbas hanya membenarkan pengubahsuaian beberapa atribut disebabkan oleh sekatan privasi; 3. Pemilihan warna harus diselaraskan dengan gaya keseluruhan untuk mengelakkan ketangkasan; 4. Terminal mudah alih mungkin tidak memaparkan kesan ini, dan disyorkan untuk menggabungkannya dengan arahan visual lain seperti logo tambahan ikon.

Untuk membuat imej responsif menggunakan CSS, ia boleh dicapai terutamanya melalui kaedah berikut: 1. Gunakan maksimum lebar: 100% dan ketinggian: auto untuk membolehkan imej menyesuaikan diri dengan lebar kontena sambil mengekalkan perkadaran; 2. Gunakan atribut SRCSET dan saiz HTML dengan bijak memuatkan sumber imej yang disesuaikan dengan skrin yang berbeza; 3. Gunakan objek-sesuai dan kedudukan objek untuk mengawal penanaman imej dan paparan fokus. Bersama -sama, kaedah ini memastikan bahawa imej dibentangkan dengan jelas dan indah pada peranti yang berbeza.

Penyemak imbas yang berbeza mempunyai perbezaan dalam parsing CSS, mengakibatkan kesan paparan yang tidak konsisten, terutamanya termasuk perbezaan gaya lalai, kaedah pengiraan model kotak, flexbox dan tahap sokongan susun atur grid, dan tingkah laku yang tidak konsisten bagi atribut CSS tertentu. 1. Pemprosesan gaya lalai tidak konsisten. Penyelesaiannya adalah menggunakan cssreset atau normalisasi.css untuk menyatukan gaya awal; 2. Kaedah pengiraan model kotak versi lama IE adalah berbeza. Adalah disyorkan untuk menggunakan kotak-kotak: kotak sempadan dengan cara yang bersatu; 3. Flexbox dan grid melakukan secara berbeza dalam kes kelebihan atau dalam versi lama. Lebih banyak ujian dan gunakan autoprefixer; 4. Beberapa tingkah laku atribut CSS tidak konsisten. CANIUSE mesti dirujuk dan diturunkan.

Pilihan unit CSS bergantung kepada keperluan reka bentuk dan keperluan responsif. 1.PX digunakan untuk saiz tetap, sesuai untuk kawalan yang tepat tetapi kekurangan keanjalan; 2.EM adalah unit relatif, yang mudah disebabkan oleh pengaruh unsur induk, sementara REM lebih stabil berdasarkan unsur akar dan sesuai untuk skala global; 3.VW/VH didasarkan pada saiz viewport, sesuai untuk reka bentuk yang responsif, tetapi perhatian harus dibayar kepada prestasi di bawah skrin yang melampau; 4. Apabila memilih, ia harus ditentukan berdasarkan sama ada pelarasan responsif, hubungan hierarki elemen dan ketergantungan viewport. Penggunaan yang munasabah boleh meningkatkan fleksibiliti dan penyelenggaraan susun atur.
