Apa yang harus dilakukan jika Anda perlu bekerja dengan data yang belum Big data berdasarkan volume, tetapi sudah lebih dari apa yang sesuai dengan memori komputer dan fitur Excel mana yang cukup? Untuk pecinta sepeda, jawabannya jelas - Anda harus menulis sesuatu sendiri (ya, kami tidak mencari cara yang mudah).
Tetapi bagaimana jika kode yang Anda tulis di masa lalu mengerikan dan tidak memberi Anda kesempatan untuk mengembangkan proyek? Sisihkan perkembangan lama, berikan jalan kepada yang baru, abadi dan cerah (ya, ya, dan di sini juga, tanpa pilihan).
Kutipan dari CF Matrix: "Satu tablet sudah cukup, Neo." Direktur: Wachowski saudara dan saudari. 1999. ASLebih dari 10 tahun yang lalu, saya menulis kode untuk ASH Viewer (lebih lanjut tentang jalur saya di
sini ), mempostingnya terlebih dahulu di
sourceforge.net , dan kemudian di
github sehingga orang terhubung dan dapat menambahkan fungsionalitas, memperbaiki kesalahan. Proyek ini dibangun menggunakan Gradle, menyelesaikan masalah dengan tampilan grafik: daftar perbaikan yang hampir lengkap
dengan referensi .
Namun, saya menyadari bahwa kode yang ditulis sepuluh tahun yang lalu adalah, secara halus, tidak sempurna. Secara lahiriah, semuanya tampak bagus, fungsionalitasnya dikembangkan, orang-orang secara aktif menggunakan dan berterima kasih. Tetapi di dalam program terdapat semua kesalahan dari pengalaman pengkodean pertama dan, tentu saja, ini sangat menghambat pengembangan proyek.
Kepada semua orang yang siap untuk mulai mengerjakan aplikasi secara serius (misalnya,
dcvetkov ), saya mengatakan bahwa kode tersebut memerlukan perubahan yang lengkap. Dan dengan setiap upaya untuk mengimplementasikan fungsionalitas atau memperbaiki bug, saya menjadi yakin akan hal ini. Saya akan memberi tahu Anda bahwa mengedit kode warisan adalah siksaan yang mengerikan, terutama milik saya :). Saya berharap bahwa di masa depan robot akan belajar untuk menulis ulang semuanya sendiri, tetapi untuk saat ini, keputusan dengan tekad kuat dibuat untuk memulai dari awal, dengan mempertimbangkan pengalaman yang telah diperoleh dalam membuat program dan menulis kode.
Sejak rilis pertama, ASH Viewer telah aktif di area ini. Tiga proyek yang cukup besar berdasarkan
JfreeChart untuk analisis data dibuat. Selain proyek-proyek ini, saya mencoba berbagai pendekatan, paradigma, dan perpustakaan. Akibatnya, saya memutuskan bahwa semuanya harus ditulis dalam Java murni, tanpa menggunakan perpustakaan yang dirancang khusus untuk membuat antarmuka grafis dari awal. Namun tetap saja, menggunakan perpustakaan pihak ketiga untuk menyelesaikan beberapa tugas yang sangat khusus cukup dapat diterima - ini akan memungkinkan Anda untuk mempertahankan tingkat fleksibilitas yang diperlukan dan tidak akan memerlukan investasi waktu yang signifikan dalam memperbaiki bug dan mengembangkan fungsionalitas yang diperlukan dengan tangan Anda sendiri.
Bagaimana semuanya dimulai
Saya selalu khawatir, tetapi apakah ada contoh dalam domain publik yang akan memberikan dasar-dasar penulisan aplikasi dengan kompleksitas sedang di Java Swing? Tentu saja, mereka mengirim saya ke perpustakaan sendiri atau ke beberapa contoh sederhana dari buku teks. Dan dalam beberapa hal mereka benar.
Tapi saya terus mencari kode aplikasi yang dapat digunakan sebagai contoh "bagaimana melakukannya dengan benar" di Java Swing. Dan saya ingin memiliki sistem kerja di depan mata saya sehingga bisa "dirasakan".
Dia mulai mempelajari kode sumber aplikasi Java Swing (semuanya tidak dapat dihitung). Di suatu tempat mereka adalah ToDo sederhana, di suatu tempat yang terlalu kompleks (bagi saya pada waktu itu), dalam beberapa hal mereka gagal dalam kualitas, dan kadang-kadang ada keduanya. Saya membaca artikel tentang Habré, menulis kode. Tapi masih ada yang hilang. Mungkin pada saat itu saya mendapatkan pengetahuan yang sangat banyak untuk menyelesaikan masalah ini.
Suatu hari saya menemukan
Angry IP Scanner dari antonkeks Anton
Keks yang dihormati , melihatnya dan segera menyadari - ini dia! Java Swing, fungsionalitas sederhana, kode bersih, modularitas - enak dibaca! Secara umum, saya menggunakan pendekatan yang digunakan di dalamnya ketika menulis salah satu proyek saya sebelumnya, dan kemudian ketika menulis ulang ASH Viewer.
Perangkat lunak dan perpustakaan yang telah membantu meningkatkan kualitas kode dan menyederhanakan pekerjaan
IDE : Saya sudah menggunakan IDE ini untuk pemrograman Java selama sekitar lima tahun sekarang. Saya mengkonfirmasi pendapat mayoritas - ini adalah program yang sangat berguna dan alat yang sangat nyaman untuk menulis kode. Ketika saya pindah dari Eclipse
www.eclipse.org/ide (dan versi pertama ditulis pada IDE ini), kemudian setelah pelatihan singkat saya menyadari bahwa IDEA memandu Anda dan memberi tahu Anda ketika Anda mencoba untuk beralih ke sisi gelap :). Menyoroti pengulangan dalam kode membuat Anda dalam kondisi yang baik dan mencegah Anda dari melakukan copy-paste bodoh. Ave JetBrains!
Java 8 : ekspresi lambda yang memungkinkan untuk menulis kode yang lebih pendek, API Waktu baru yang memungkinkan Anda untuk membatalkan penggunaan perpustakaan Joda Time pihak ketiga.
Belati 2 : Kerangka kerja injeksi ketergantungan yang belum pernah saya gunakan sebelumnya. Tetapi entah bagaimana saya memata-matai bagaimana perpustakaan ini digunakan oleh Anton
antonkeks , dan mulai melakukan sesuai dengan templat. Bagilah program menjadi beberapa modul, jika memungkinkan, gunakan injeksi ketergantungan. Di mana ini
tidak mungkin , ia menggunakan pembuatan objek shell di muka, dan kemudian ia menetapkan atribut yang diperlukan atau tidak menggunakan DI.
Maven membangun sistem. Ini adalah sistem build yang merupakan standar de facto, jadi saya memutuskan untuk menambahkan pustaka secara bersih melalui pom.xml dan menggunakan sistem modul Maven untuk bekerja dengan JFreeChart dan kode Gantt dalam satu proyek.
Lombok : juga perpustakaan yang sangat nyaman, agar tidak menulis atau mendukung "jejak" kode seragam (getter, setter, dll.). Benar, dalam beberapa kasus saya menolak untuk menggunakannya, karena itu perlu untuk mendefinisikan kembali sama dan membandingkan Untuk, tetapi saya tidak menemukan seberapa cepat untuk melakukan ini di Lombok.
Penjurnalan: membuat program Java yang sempurna? Jadi, tanpa alat jurnal modern, tidak ada tempat. Oleh karena itu, kami mengambil
Fasad Penebangan Sederhana untuk Java SLF4J dan
Logback sebagai dasar .
Manajer tata letak: Saya terutama menggunakan
Miglayout . Cukup sulit untuk dipelajari (di beberapa tempat saya menggunakan pengelola tata letak Swing dengan cara lama), tetapi singkat. Memungkinkan Anda melakukan
efek menarik seperti pada tab Detail.
Swingx oleh Swinglabs: Java Swing UI lama ditinggalkan. Saya aktif menggunakan JXTable. Pemilihan kolom tabel secara sewenang-wenang dan pencarian isi sel yang dilakukan secara terintegrasi memfasilitasi analisis terperinci dari data riwayat sesi aktif.
ommons-dbcp2 : berguna untuk membuat kumpulan koneksi untuk koneksi basis data. Di versi lama, saya menggunakan implementasi yang dimodifikasi yang saya temukan di Internet.
Perpustakaan yang pindah dari versi lama
Oracle Berkeley DB Java Edition v. 5.0.73: penyimpanan nilai kunci tertanam. Untuk menyimpan data riwayat gabungan dari sesi aktif.
JFreeChart : Ribuan proyek analisis data ditulis menggunakan perpustakaan ini. Saya mengambil versi eksperimental, yang diposting di github, dan menambahkannya sebagai modul. Ini dilakukan untuk kenyamanan bekerja dengan kode, karena perubahan
diperlukan sehingga Stacked Chart menampilkan grafik sesuai kebutuhan.
E-Gantt : Perpustakaan untuk membuat grafik Gantt di Java Swing. Jejak itu sekarang tidak dapat ditemukan bahkan di Internet, sayangnya. Juga ditempatkan sebagai modul Maven terpisah dalam proyek.
Dari yang menarik dalam kode, apa yang bisa Anda perhatikan
Perubahan arsitektur:- Sekarang pengaturan disimpan dalam database bawaan yang terpisah, bukan dalam file teks biasa. Karena tidak ada banyak data, pola EAV canggih digunakan untuk menyimpan pengaturan koneksi;
- Untuk menyimpan data pemantauan, saya memutuskan untuk membuat mesin OLAP. Pertama, untuk mempercepat tampilan Gantt drilldown oleh SQL_ID / SESSION_ID pada rentang yang dipilih. Kedua, untuk kemungkinan mendapatkan penelusuran cepat pada SQL_ID / SESSION_ID pada grafik bertumpuk dan Gantt. Ketiga, pembentukan tampilan masa depan dari riwayat sesi aktif (Top pada harapan, bor pada harapan, bor pada SQL_ID / SESSION_ID). Semuanya disimpan dalam satu entitas (data untuk detik, 15 detik dan, di masa depan, untuk interval tambahan lainnya secara fisik terpisah);
- Efek samping dari arsitektur bersih adalah kemampuan untuk mendukung pemantauan sejarah sesi aktif dari database lain. Saat ini menerapkan dukungan Postgres. Untuk menghubungkan basis data lain, Anda memerlukan antarmuka yang sudah jadi untuk data histori sesi aktif (yang ditambahkan ke Postgres atau implementasi semacam itu) atau kumpulan konfigurasi sendiri dari sesi aktif dalam tabel terpisah, yang dapat diakses nanti.
Cara mengaktifkan dukungan untuk database lain- Buat kelas baru dan terapkan antarmuka IProfile. Lakukan hal yang sama seperti dalam kasus Postgres;
- Tambahkan implementasi untuk versi baru dari database ke prosedur loadProfile dari kelas ConnectToDbArea dan Fungsi enum dari kelas ConstantManager ;
- Hubungkan dan periksa aplikasi.
GUI
Formulir koneksi ke databaseSepenuhnya ditulis ulang dari awal, sebelumnya menggunakan praktik terbaik dari proyek
Squirrel-sql terbuka. Sekarang semuanya ada dalam
satu file. Cantik!

Cara terhubung ke database- Buat koneksi baru;
- Tentukan nama, URL (JDBC adalah standar untuk Oracle: jdbc: oracle: thin: @host: port: SID, untuk Postgres: jdbc: postgresql: // host: port: database), nama pengguna / kata sandi, profil dan pilih perpustakaan jdbc;
- Untuk Oracle, semuanya berfungsi dengan ojdbc6.jar; untuk PostgresDB, bekerja dengan postgresql-42.2.5 diverifikasi
Aktivitas atas / antarmuka detailDi sini, tanpa perubahan signifikan, mirip dengan versi lama, hanya tanpa melihat cerita.
Bor dengan SQL_ID / SESSION_IDSQL
ASH : grafik aktivitas untuk SQL_ID tertentu, dipanggil dengan mengklik dua kali pada baris dengan SQL_ID dari Gantt-graph.
Sql text / plan : untuk Oracle / Postgres dimungkinkan untuk mendapatkan teks lengkap dari permintaan. Hanya untuk Oracle adalah paket eksekusi permintaan yang disediakan untuk semua nilai plan_hash_value.
Statistik : data tabel oleh SQL_ID: ambil dari V $ SQL. Kode memiliki kemampuan untuk menambahkan lebih banyak entitas yang dapat Anda pilih (lihat
implementasi ). tetapi Anda harus sangat berhati-hati, karena mungkin ada masalah kinerja: misalnya, mengambil dari
V $ SQLAREA pada sistem yang dimuat sangat lambat).
Sesi
ASH : grafik aktivitas untuk session_id, mirip dengan SQL, klik dua kali pada baris sesi dari grafik Gantt.
Statistik : data tabel oleh SQL_ID: ambil dari V $ SESSION dan V $ PROCESS. Kode memiliki kemampuan untuk menambahkan lebih banyak entitas yang dapat Anda pilih (lihat
implementasi ).
Rencana selanjutnya
- Instal API. Melakukan refactoring kode akhir. Menerapkan penyimpanan dinamis dari data pemantauan awal, yang tidak akan bergantung pada versi dan tipe database;
- Sebenarnya tidak ada cukup tes untuk menguji modul utama sistem, CI dan praktik terbaik lainnya.
Kode proyek Github,
file proyek;
Tautan ke grup di Telegram
t.me/ashviewer untuk menginformasikan tentang pembaruan terkini;
PS Siapa yang memutuskan untuk terhubung ke pengembangan - menulis ke PM, tanpa kegembiraan yang tidak semestinya dan tanpa membuat naksir, tentu saja :).
Itu saja. Terima kasih atas perhatian anda!