Model pengembangan klasik untuk aplikasi apa pun menyiratkan dokumentasi yang baik pada antarmuka pengguna dan API, serta, jika perlu, cakupan yang baik dari kode sumber dengan komentar. Dalam hal ini, finalisasi sistem dimulai dengan studi dokumentasi, kemudian kode diubah secara langsung dan, akhirnya, semua informasi yang diperlukan diperbarui.
Namun, salah satu masalah dengan pendekatan ini adalah bahwa itu secara signifikan meningkatkan biaya dan memperlambat proses pengembangan. Bagaimana jika semua ini bukan? Kemudian IDE datang untuk menyelamatkan, berkat itu Anda dapat mempelajari logika saat ini menggunakan kode telanjang.
Ketika kami mengembangkan platform
lsFusion dengan bahasa yang disematkan, kami memiliki beberapa opsi. Baik menemukan kembali roda, dan menulis dari awal IDE Anda sendiri, seperti 1C lakukan pada satu waktu, atau menerapkan plug-in untuk yang sudah ada. Kami pergi ke jalan kedua, dan dalam artikel ini saya akan menunjukkan apa yang terjadi.
Karena platform itu sendiri dikembangkan di Jawa, kami memiliki dua opsi utama: Eclipse atau IDEA. Kami memilih opsi terakhir dan tidak gagal. Ketika kami membuat keputusan, IDEA masih belum cukup populer, tetapi sejak itu, mereka telah muncul sebagai pemimpin di pasar, dan Eclipse diam-diam tertinggal.
Tidak perlu banyak waktu untuk mengembangkan
plugin itu sendiri, karena dimungkinkan untuk menggunakan kode yang digunakan secara langsung selama eksekusi platform dalam banyak cara. Dengan demikian, dengan upaya minimal kami mendapat IDE yang sangat kuat, dalam banyak aspek secara signifikan unggul dalam fungsi dibandingkan dengan IDE dari banyak platform ERP lainnya (baik yang asli maupun yang dibangun di Eclipse).
Peran IDE dalam pengembangan sulit ditaksir terlalu tinggi. Terlepas dari kenyataan bahwa banyak pengembang masih menggunakan vim dan percaya bahwa itu seharusnya. Posisi ini memiliki hak untuk hidup jika satu orang mengembangkan dan selanjutnya mendukung kode ini. Namun, dalam proyek yang lebih besar di mana sejumlah besar orang terlibat, pertukaran mereka sangat penting. Karyawan sakit, pergi berlibur, pergi pada akhirnya. Selain itu, beban pada proyek yang berbeda tidak merata, dan kadang-kadang diperlukan untuk menghubungkan lebih banyak orang dengan salah satu dari mereka untuk memenuhi tenggat waktu. Pada saat-saat seperti itu, Anda harus menghubungkan orang-orang baru dengan perbaikan, yang perlu dengan cepat mengetahui bagaimana program saat ini bekerja, dan membuat perubahan yang diperlukan. Dan inilah IDE.
Pertama-tama, kami membutuhkan yang berikut dari IDE:
- Dukungan sintaksis . Penyorotan kata kunci, substitusi otomatis, penyorotan kesalahan.
- Navigasi Buka iklan, cari kegunaan, cari berdasarkan string teks, file atau nama, dll.
- Analisis . Hirarki kelas dan panggilan, serta properti dan tindakan kelas.
- Refactoring Mengganti nama kelas, properti, dan tindakan.
- Visualisasi bentuk . Untuk menampilkan kepada pengembang desain saat ini dari bentuk tertentu.
- Metaprogramming . Kemampuan untuk menghasilkan kode berbasis metacode dengan cepat .
- Debugger Kemampuan untuk mengatur breakpoints (termasuk kondisi), debug logika imperatif, jam tangan arloji.
- Injeksi Bahasa . Navigasi, refactoring, penggantian otomatis, dan penyorotan sintaksis lsFusion saat digunakan dalam bahasa lain - Java dan JasperReports XML.
Karena kami menggunakan skema standar yang tertanam dalam IDEA untuk plug-in, output dari bekerja dengan logika di lsFusion ternyata hampir identik dengan pengembangan di Jawa. Item menu yang sama, hot key, debugging transparan, yang dapat beralih dari kode lsFusion ke Java dan sebaliknya, dan sebagainya.
Berikut adalah beberapa contoh sederhana untuk menunjukkan bagaimana ini bekerja dalam praktiknya.
Dukungan sintaksis
Plugin dapat menggantikan kata kunci yang valid, properti yang mungkin, secara otomatis mendeteksi berbagai kesalahan:

Navigasi
Ambil logika dari contoh
Manajemen Material . Misalkan kita perlu melihat di mana properti Price dideklarasikan. Untuk melakukan ini, Anda perlu menempatkan pointer mouse di atas tajuk kolom yang kami butuhkan sebagai pengguna dengan hak administrator:

Di jendela yang muncul, Anda dapat langsung melihat di modul mana properti ini dibuat (Pengiriman), nomor baris apa yang ada di dalamnya (37), tabel tempat penyimpanannya (_auto_Shipment_ShipmentDetail), dan sejumlah informasi lainnya.
Untuk langsung ke deklarasi properti, Anda harus memulai pencarian file dan memasukkan Pengiriman dalam dialog yang muncul:


Kemudian, menggunakan Navigate - Line / Column, pergi ke baris ke-37, di mana kita melihat deklarasi properti:

Dengan menekan CTRL + ALT + F7, saat kursor berada di properti yang diinginkan, Anda dapat dengan cepat menemukan semua kegunaannya untuk semua proyek:

Dalam hal ini, penggunaan pertama harga adalah dalam menghitung jumlah per baris. Dua yang terakhir menambahkan ke formulir yang sesuai.
Jika perlu, Anda dapat mengaktifkan pencarian hanya dengan catatan di properti ini, jika Anda menghapus opsi yang sesuai:

Maka hanya entri di properti ini yang akan tetap ada dalam daftar. Untuk mengetahui nilai spesifik apa yang dituliskan padanya, Anda perlu kursor pada salePrice dan klik Go To Declaration atau Usages. Selanjutnya, kembali melalui Navigasi - Kembali dan pergi ke deklarasi properti item:

Untuk meringkas, kami menemukan di mana properti ini kami butuhkan dinyatakan, dalam kasus apa itu digunakan, dan ketika rekaman pergi ke sana. Di video, saya melakukan semua tindakan dengan mouse, meskipun tentu saja, dalam praktiknya, hanya keyboard yang digunakan. Teknik ini memungkinkan Anda untuk dengan cepat menentukan logika sistem yang diimplementasikan saat ini dan membuat perubahan padanya, memiliki pemahaman penuh tentang apa yang akan terjadi.
Refactoring
Seringkali ada situasi ketika Anda perlu mengubah nama properti, kelas, formulir, atau elemen lain dalam sistem. Untuk melakukan tindakan seperti itu, Anda harus berdiri di atas elemen ini dan klik Refactor - Ganti nama:

Mengganti nama elemen secara otomatis mengubah kode sumber di semua tempat penggunaannya. Selain itu, jika file migrasi.script dibuat, entri yang sesuai akan ditambahkan di sana. Server perlu mengetahui perubahan nama agar, misalnya, untuk secara otomatis memigrasikan data dari satu kolom ke kolom lainnya. Kalau tidak, tidak mungkin membedakan penggantian nama dari membuat properti baru dengan nama yang berbeda.
Analisis
Sebelum melakukan refactoring, seringkali perlu untuk mengetahui "apa yang terjadi" dan "siapa semua orang ini."
Untuk melakukan ini, IDEA, hampir di luar kotak, memungkinkan Anda untuk melihat struktur kelas yang dipilih (properti dan tindakan yang tersedia untuk kelas ini):

Juga, jika Anda perlu mendapatkan gambaran umum tentang apa yang terjadi, IDEA memungkinkan Anda untuk membangun berbagai hierarki:
- warisan dari kelas yang dipilih
- Penggunaan item yang dipilih (misalnya, properti atau formulir)

Semua fitur teratas disediakan oleh IDEA secara otomatis (dengan gerakan minimal) setelah menerapkan iklan mesin pencari. Seperangkat fitur berikut membuat plugin sedikit lebih baik, tetapi masih sebagian besar infrastruktur disediakan oleh IDEA (bukan tanpa masalah tentu saja, tetapi lebih pada itu nanti).
Bentuk visualisasi
Dalam lsFusion, struktur dan desain formulir diatur dalam kode yang sama dengan logika domain menggunakan konstruksi khusus. Selain itu, berbagai bagian formulir dapat dideklarasikan dalam modul yang berbeda, dan ketika server mulai, mereka akan "bergabung" bersama-sama, tergantung pada modul yang terhubung.
Untuk melihat desain yang dihasilkan, Anda tentu saja dapat me-restart server, dan menonton hasilnya di klien. Tetapi server restart membutuhkan waktu. Plugin dapat:
- Perlihatkan desain saat ini dan struktur hierarkis formulir di jendela khusus
- Temukan elemen dalam struktur bentuk
- Sorot elemen bentuk yang dipilih dalam desain
Begini tampilannya di IDE:

Saat membuat formulir, hanya modul aktif saat ini dan semua yang tergantung padanya yang diperhitungkan.
Desain visual saat ini belum memungkinkan untuk diubah, karena formulir ini dibentuk dari beberapa blok kode. Selama modifikasi, sulit untuk menentukan dengan jelas di mana Anda perlu melakukan perubahan yang sesuai. Selain itu, elemen yang sama dapat dimodifikasi dalam beberapa blok kode, dan platform memastikan bahwa jika satu modul bergantung pada yang lain, maka perubahannya akan diterapkan terakhir. Namun, di masa mendatang kami berencana untuk menambahkan fungsionalitas tertentu untuk perubahan desain visual.
Metaprogramming
Terkadang ada kebutuhan untuk membuat jenis kode yang sama untuk berbagai tugas. LsFusion memiliki mekanisme metacode yang memungkinkan Anda menghasilkan kode berdasarkan beberapa templat. Dalam hal ini, jika terjadi perubahan metacode, kode akan diperbarui secara otomatis. Bahkan, ini adalah salinan / tempel otomatis dengan kemampuan untuk mengganti pengidentifikasi tertentu dengan nilai yang ditentukan.
Untuk mengaktifkan mekanisme ini, Anda harus terlebih dahulu mengaktifkannya di menu. Setelah itu, IDE akan secara otomatis mengubah kode yang sesuai.

Ketika server mulai, hanya kode yang dihasilkan yang akan digunakan. Templat META sendiri tidak akan diperhitungkan saat memulai server.
Omong-omong, implementasi dari kemungkinan metaprogramming memaksa kami untuk membuat kontribusi lain ke open-source (dalam hal ini, Intellij IDEA). Faktanya adalah bahwa dalam metacode ERP digunakan cukup aktif, dan, karenanya, seringkali ada kebutuhan untuk menghasilkan kode / menghapus kode yang dihasilkan. Hal ini menyebabkan sejumlah besar perubahan file asinkron, yang, pada gilirannya, menyebabkan
bug yang sangat aneh. Masalahnya adalah bahwa mereka tidak dapat dimainkan di JetBrains sendiri, jadi semuanya berujung pada kenyataan bahwa kita sendiri harus menulis
tes unit yang tidak bekerja. Ini tentu saja memakan waktu beberapa hari, tetapi secara tidak langsung membantu kami dalam menerapkan dua kemungkinan berikut.
Debugger
Ketika kode benar-benar tidak jelas apa yang terjadi, Anda harus beralih ke debugger. Pada setiap garis logika imperatif (tindakan, peristiwa, batasan), Anda dapat meletakkan breakpoint. Segera setelah eksekusi server mencapai titik ini, itu akan dihentikan dan kontrol akan pergi ke debugger. Pada saat ini, Anda dapat menonton jam tangan, dan juga melanjutkan eksekusi baris demi baris. Di sebelah kiri, jejak tumpukan akan ditampilkan, di mana Anda dapat menavigasi seperti ketika debugging aplikasi Java biasa.

Saat melihat nilai saat ini, Anda dapat mengakses kedua objek saat ini (misalnya, Pengiriman), dan objek lain dari database (misalnya, Item i). Namun, pengembang sendiri bertanggung jawab untuk menambahkan data ke jam tangan, yang pembacaannya akan memakan banyak waktu atau memori, dan akan menyebabkan penurunan kinerja.
Anda juga dapat mengatur breakpoint pada properti tertentu. Eksekusi akan berhenti di mana saja saat catatan dibuat:

Ini berguna ketika Anda perlu menentukan acara atau tindakan mana yang mengubah nilai properti.
Untuk benar-benar mengimplementasikan debugger, kami benar-benar menggunakan Debugger Java IDEA yang ada. Yaitu, platform sedang di-debug sebagai aplikasi Java biasa, tetapi untuk tindakan lsFusion kita membuat metode proxy java dan mengganti tampilannya dengan kode kita (seperti yang saya pahami di IDEA, ini dilakukan untuk mendukung Scala dan pembungkus lain di Jawa). Dan inilah momen yang lucu. Pada titik tertentu, pengembang IDEA
menjadikan konstruktor Java Debugger mereka pribadi. Dan jika situasi dengan memanggil metode pribadi masih dapat diatasi melalui Refleksi, maka cara mewarisi dari kelas dengan konstruktor pribadi tidak jelas. Tetapi tepat pada saat itu ada pertikaian dengan bug dari bagian atas, dan kami "barter" memutuskan untuk meminta orang-orang dari JetBrains untuk membuat konstruktor ini kembali terlindungi, yang mereka tanggapi dengan sangat cepat (tentu saja, terima kasih banyak kepada mereka).
Injeksi bahasa
Salah satu fitur IDEA yang paling tidak biasa adalah kemampuan untuk memberikan dukungan untuk bahasa Anda dalam konstanta string bahasa lain. Untuk melakukan ini, cukup untuk memberi tahu IDEA tentang konstanta string mana yang berlaku untuk bahasa Anda, lalu IDEA itu sendiri secara otomatis:
- menghasilkan file virtual (atau beberapa file) dengan awalan yang diberikan untuk setiap string konstan
- membuat dalam editor file sumber untuk semua konstanta semacam "jendela" ke dalam file virtual ini
- memberikan dukungan file virtual ini untuk semua fitur bahasa "tertanam", seperti menyoroti kesalahan, beralih ke iklan, pelengkapan otomatis, mencari penggunaan dan, yang paling penting, refactoring. Yaitu, saat mengganti nama elemen apa pun dalam satu bahasa, ia secara otomatis diganti namanya di semua konstanta string yang merujuk ke elemen ini dalam bahasa lain. Dengan demikian, Anda secara otomatis dilindungi dari tautan yang rusak.

Di sini, di IDEA ada (dan masih)
bug kecil. Ketika file virtual besar, jika IDEA harus pergi ke awal "jendela implementasi" ketika mulai menggunakannya, itu benar-benar pergi ke akhir "jendela implementasi" sebelumnya (yaitu, misalnya, untuk penggunaan properti sebelumnya dalam file Java). Tentu saja, solusi sederhana untuk bug ini adalah membuat file virtual terpisah untuk setiap string literal. Tetapi pendekatan ini melambat ketika ada lebih dari 30 kegunaan, jadi dalam hal ini Anda masih harus menggunakan satu file virtual besar (di sisi lain, ketika ada banyak kegunaan, tidak begitu sulit untuk menemukan yang benar, yaitu, berikut). Kami meminta untuk memperbaiki bug ini lagi dalam rangka "pertukaran layanan", dan pengembang JetBrains semacam memperbaikinya, tetapi, ternyata kemudian, entah bagaimana tidak (itu masih dapat dilihat oleh komit, tetapi kami pikir itu tidak sesuai dengan komitmennya) memahaminya pada akhirnya). Namun, kita semua sudah terbiasa dengan bug ini sejak lama, karena situasi dengan menggunakan lebih dari 30 elemen dalam satu file cukup jarang.
Kesimpulan
Artikel ini hanya menjelaskan kasus penggunaan utama. Ini juga memiliki kemampuan untuk mencari implementasi properti dan kelas abstrak, memvisualisasikan dependensi antara modul dan properti, secara otomatis menghasilkan bentuk berdasarkan xml / json, dan banyak lagi. Dan, tentu saja, ada integrasi built-in dengan sistem kontrol versi utama Git dan Subversion, serta dukungan untuk Maven dan Semut.
Mengikuti jalur pengembangan plug-in IDEA, dengan sedikit usaha kami mendapatkan lingkungan pengembangan terintegrasi gratis yang sangat kuat yang melampaui pesaing IDE dalam banyak hal.