Saya baru-baru ini menuangkan beberapa jam ke dalam JavaScript karena saya ingin mendapat manfaat dari basis pengguna yang besar. Melakukan hal itu, saya perhatikan sebuah pola yang oleh sebagian besar orang dikaitkan dengan bahasa dinamis. Anda membuat segala sesuatunya bekerja dengan sangat cepat, tetapi begitu kode Anda mencapai ukuran tertentu Anda membuang banyak waktu dengan kesalahan ketik, ejaan, dan refactoring secara umum. Kesalahan yang biasanya dikompilasi oleh kompiler saya. Dan tidak ada saya mencari kesalahan dalam logika ketika saya baru saja membuat kesalahan ketik pada modul lain.
Mengingat JavaScript yang luar biasa berikut dan bahasa yang diketik secara dinamis lainnya saya percaya bahwa ada sesuatu yang salah dengan pendekatan saya. Atau apakah ini harga yang harus Anda bayar?
Untuk membuatnya lebih ringkas:
- Bagaimana Anda mendekati proyek JavaScript (atau bahasa dinamis lainnya dalam hal ini) dengan ~ 2000 LOC?
- Apakah ada alat untuk mencegah saya melakukan kesalahan itu? Saya telah mencoba aliran oleh Facebook dan JSHint yang agak membantu, tetapi tidak menangkap kesalahan ketik.
Jawaban:
Khusus berbicara tentang JavaScript, Anda bisa menggunakan TypeScript sebagai gantinya. Menawarkan beberapa hal yang Anda maksud. Mengutip situs web:
Dan itu hanya superset dari JS, artinya beberapa kode Anda yang ada akan bekerja dengan TS:
sumber
foo(x) { return x.bar;}
atau semacamnya. Karena tidak ada informasi jenis dan fungsinya bersifat publik (maka Anda tidak dapat mengetahui semua penelepon), tidak mungkin bagi Anda untuk mengetahui apakah bilah harus diubah namanya menjadi baz jika Anda mengganti nama beberapa kelas.Ada beberapa pendekatan yang dapat membantu:
Pengujian unit
Tuliskan tes unit jika memungkinkan. Hanya mengandalkan pengujian manual atau menemukan bug di alam liar adalah untung-untungan.
Gunakan kerangka kerja
Daripada memutar sendiri dan mempertaruhkan pengenalan bug, gunakan kerangka kerja yang mapan jika memungkinkan.
Lebih suka CSS / bahasa tingkat tinggi
Di mana Anda dapat menyerahkan fungsionalitas ke CSS atau bahasa tingkat tinggi apa pun yang Anda tulis.
Refactor
Refactor untuk mengurangi jumlah kode. Lebih sedikit kode = lebih sedikit tempat untuk kesalahan.
Penggunaan kembali
Gunakan kembali kode yang ada di mana Anda bisa. Meskipun kode tidak sama persis, lebih baik menyalin, menempel, dan memodifikasi daripada menulis sesuatu lagi.
IDE
IDE modern umumnya memiliki setidaknya beberapa dukungan Javascript. Beberapa editor teks juga sadar Javascript.
sumber
Salah satu alat yang belum disebutkan adalah pencarian teks sederhana, lokal file atau proyek-lebar .
Kedengarannya sederhana, tetapi ketika Anda memasukkan beberapa ekspresi reguler, Anda dapat melakukan pemfilteran dasar hingga lanjutan, mis. Mencari kata-kata yang terdapat dalam dokumentasi atau kode sumber.
Ini telah menjadi alat yang efektif bagi saya (selain analisa statis), dan mengingat ukuran proyek Anda sebesar 2k LOC, yang menurut saya tidak terlalu besar, semoga berhasil.
sumber
grep
pergi jauh. Kecuali Anda tidak melakukan hal-hal dinamis yang terlalu aneh, itu berhasil. Namun, rasanya sangat manual jika Anda terbiasa dengan IDE untuk bahasa yang diketik secara statis.Saat ini saya sedang refactoring beberapa ribu baris kode pada proyek AngularJS besar. Salah satu kerepotan terbesar adalah mencari tahu kontrak yang tepat dari fungsi yang diberikan. Saya kadang-kadang akhirnya membaca dokumentasi API karena elemen respons API mentah ditugaskan ke variabel yang melewati 6 lapisan kode sebelum dimodifikasi dan dikembalikan melalui 6 lapisan kode lagi.
Saran pertama saya adalah merancang berdasarkan kontrak . Ambil input spesifik, hasilkan output spesifik, hindari efek samping, dan dokumentasikan ekspektasi tersebut menggunakan TypeScript atau setidaknya JSDoc.
Saran kedua saya adalah menerapkan sebanyak mungkin pemeriksaan. Kami mengikuti standar AirBnB dan menggunakan eslint pada seluruh basis kode kami. Kait komit memverifikasi bahwa kami selalu mengikuti standar. Kami secara alami memiliki baterai unit dan tes penerimaan, dan semua komitmen harus ditinjau oleh sejawat.
Beralih dari editor teks (Sublime Text) ke IDE yang tepat (WebStorm) juga membuatnya lebih mudah untuk bekerja dengan kode pada umumnya. WebStorm akan menggunakan JSDoc untuk memberikan petunjuk tentang tipe parameter yang diharapkan dan meningkatkan kesalahan jika Anda memberikan tipe yang salah atau menggunakan nilai balik dengan cara yang salah.
Dalam JavaScript, fitur-fitur baru seperti simbol dan pengambil / setter dapat membantu menegakkan tingkat kualitas tertentu dengan menambahkan pernyataan ke penugasan variabel (mis. Pastikan bilangan bulat berada dalam jangkauan, atau bahwa objek data memiliki atribut tertentu).
Sayangnya, saya tidak berpikir ada solusi yang benar untuk mencegah kesalahan bahasa dinamis, hanya serangkaian tindakan yang dapat membantu mengurangi frekuensi mereka.
sumber
Jawaban saya untuk pertanyaan "Bagaimana Anda mendekati proyek JavaScript (atau bahasa dinamis lainnya dalam hal ini) dengan ~ 2000 LOC?"
Saya mengembangkan aplikasi formulir PDF. Saya mendekati proyek pengembangan perangkat lunak JavaScript saya (terlepas dari ukuran kode sumber) menggunakan elemen bersih dan penjelasan Petri. Metode ini tidak terikat pada teknologi bahasa pemrograman tertentu. Dengan demikian dapat digunakan untuk "bahasa pemrograman" lainnya.
Saya membuat diagram dari logika aplikasi. Untuk menjaga diagram tetap rapi, saya menambahkan sebagian besar penjelasan saya ke formulir yang saya gunakan dengan diagram. Entri dalam formulir termasuk referensi ke properti atau fungsi. Kemudian saya menulis kode sumber berdasarkan informasi dalam diagram dan entri dalam formulir. Metode ini sistematis karena setiap kode sumber yang ditulis langsung dipetakan dari diagram dan entri dalam formulir. Kode sumber dapat dengan mudah diperiksa karena saya juga mengikuti konvensi penamaan dan pengkodean ketika saya menulis kode.
Sebagai contoh, saya telah memilih konvensi bahwa semua fungsi adalah prototipe. Jika kinerja menjadi masalah maka itu dapat ditingkatkan dengan mendeklarasikan fungsi dalam konstruktor. Untuk beberapa properti saya menggunakan array. Sekali lagi jika kinerja menjadi masalah maka itu dapat diperbaiki dengan menggunakan referensi langsung.
Saya juga menggunakan eval. Ini dapat sangat mengurangi ukuran kode sumber. Karena masalah kinerja, saya menggunakan eval di bagian awal atau inisialisasi aplikasi saya; Saya tidak pernah menggunakannya dalam "logika runtime" - ini adalah konvensi pengkodean lain yang saya ikuti.
sumber