Apakah ide yang lebih baik untuk memanggil aplikasi baris perintah eksternal atau untuk menginternalisasi logika aplikasi itu?

10

Saya memiliki semacam "jalur pipa" proses yang pada dasarnya hanya menghubungkan sekelompok alat yang ada untuk mengotomatisasi alur kerja. Untuk salah satu langkah, ada alat baris perintah yang ada yang sudah melakukan apa yang perlu dilakukan langkah itu.

Alat CLI eksternal berbasis java, dan juga pipeline saya, jadi akan mungkin untuk mengintegrasikan alat langsung ke langkah pipeline, tetapi alat ini sangat kompleks dan saat ini terkait erat dengan memiliki input baris perintah (seperti 37 opsi konfigurasi flag).

Pertanyaannya adalah: Apakah lebih baik memanggil dan memanggil proses eksternal, atau lebih baik mengintegrasikan kode eksternal ke dalam aplikasi saya?

Apa pro / kontra dari mengintegrasikan vs memanggil proses eksternal?

cdeszaq
sumber
Apakah alat baris perintah itu sesuatu yang Anda kendalikan, atau dikembangkan oleh pihak lain?
whatsisname
Ini adalah open source (lisensi Mozilla) dcm4che DICOM toolkit, jadi ini dikembangkan oleh pihak lain, tetapi saya dapat melakukannya dengan apa pun yang saya inginkan.
cdeszaq

Jawaban:

12

Apakah lebih baik memanggil dan memanggil proses eksternal, atau lebih baik mengintegrasikan kode eksternal dalam aplikasi saya?

Jauh lebih baik untuk mengintegrasikan hal-hal ini.

Antarmuka baris perintah hanyalah antarmuka, dan yang sangat buruk. Ini penting tetapi juga diisi dengan kebiasaan dan keterbatasan yang tidak masuk akal.

Setiap "alat yang ada untuk mengotomatisasi alur kerja" harus memiliki kelas rapi yang melakukan pekerjaan nyata setelah opsi baris perintah diuraikan.

Idealnya, public static void mainfungsi melakukan dua hal di masing-masing "alat yang ada".

  1. Itu memanggil beberapa opsi baris perintah / argumen parser.

  2. Ini memanggil kelas rapi yang melakukan pekerjaan nyata. Pikirkan tugas Semut atau tugas Maven yang melakukan pekerjaan nyata setelah Semut atau Maven telah menangani semua penguraian dan pengambilan keputusan.

Ketika Anda pergi untuk mengintegrasikan hal-hal ini, Anda ingin kelas rapi yang melakukan pekerjaan nyata.

Jika mereka tidak ada, maka Anda harus menulis ulang semua alat itu untuk membuat kelas rapi yang melakukan pekerjaan nyata, terpisah dari semua penguraian baris perintah.

Untuk panduan tentang cara kerja kelas yang rapi ini, baca Semut (atau Maven) untuk melihat bagaimana mereka mendefinisikan berbagai tugas pekerja. Ini adalah model mental yang baik untuk bagaimana banyak hal yang berbeda diintegrasikan tanpa kembali ke baris perintah.

S.Lott
sumber
Dalam kasus saya, kelas yang melakukan pekerjaan adalah seluruh alat, dan berisi mainmetode, metode CLI-parse, dll. Agak jahat :(
cdeszaq
@cdeszaq: Dalam hal ini, perlu diperbaiki. Itu bukan penulisan ulang yang sangat sulit, dan itu harus dilakukan.
S.Lott
3
Saya akan menambahkan itu tergantung pada tenggat waktu Anda, Anda dapat berintegrasi dengan antarmuka CL yang ada dan port ke solusi terintegrasi dengan baik dari waktu ke waktu. Tetapi jika Anda punya waktu untuk memperbaikinya sekarang, maka lakukanlah :-)
Martijn Verburg
1
@ MartijnVerburg: Poin Bagus. Seringkali, ada prioritas yang jelas. Beberapa alur kerja lebih terintegrasi atau berpotensi memiliki penggunaan terpisah sebagai "alur kerja sub-". Hal ini dapat menyebabkan tumpukan pekerjaan ulang dari yang paling berharga ke yang paling tidak berharga.
S.Lott
Di perusahaan terakhir saya, kami memiliki masalah dalam menjalankan exe utilitas (kami tetapi tidak kode saya sama sekali). Membantu pengembang "senior" mendiagnosis mengapa exe ini tidak dapat dieksekusi, saya menyarankan untuk menulis file kelelawar untuk memulai. Itu berhasil. Dia berhenti mencari masalah dan begitulah cara keluar dari pintu. Pelajaran yang saya pelajari adalah 1. Jangan pernah mengusulkan ide buruk untuk memecahkan masalah kepada seseorang yang membuat keputusan. 2. Gunakan perpustakaan atau internalisasikan logika Anda sendiri sebanyak mungkin. Itu "memperbaiki" biaya sejumlah dukungan teknis pada beberapa mesin. Dia juga tidak percaya pada pengujian atau kontrol sumber sehingga tidak mengherankan ...
Rig
8

Saya akan mengatakan biarkan saja jika berhasil.

Sebagai seorang programmer Anda memberikan nilai pada organisasi Anda dengan menyelesaikan masalah dengan perangkat lunak. Memecahkan lebih banyak masalah baik dalam kualitas maupun kuantitas dalam jumlah waktu tertentu secara langsung berkaitan dengan nilai Anda di organisasi. Menghabiskan waktu ini untuk membuat kode mengurangi nilai Anda karena itu membuat Anda jauh dari menyelesaikan masalah yang lebih penting.

Namun, beberapa faktor yang dapat mengurangi pengeluaran waktu adalah skalabilitas dan jika ada kekhawatiran terhadap stabilitas program eksternal.

bigtech
sumber
Saya setuju. Anda dapat membuka diri terhadap banyak masalah saat mencoba mengintegrasikan program / kode pihak ketiga ke dalam aplikasi Anda. Kadang-kadang itu perlu tetapi, seperti kata pepatah, "Jika tidak rusak, jangan memperbaikinya"
jfrankcarr
5
Memecahkan masalah itu bagus. Memecahkan beberapa masalah saat membuka pintu ke masalah lain tidak begitu hebat.
yfeldblum
5

Itu bukan "lebih baik" atau "lebih buruk". Hanya ada biaya dan manfaat yang berbeda.

Sering kali lebih mahal untuk menulis dan memelihara perangkat lunak, semakin besar jumlah titik integrasi untuk menambah kompleksitas.

  • Fungsi yang Anda tulis memiliki biaya integrasi yang sangat kecil.
  • Perpustakaan pihak ketiga memiliki biaya integrasi yang sedikit lebih besar.
  • Program terpisah yang harus Anda jalankan akan memiliki dan bahkan biaya integrasi yang lebih besar.

Perhatikan ini adalah biaya integrasi yang harus Anda timbang terhadap total biaya yang mencakup antara lain biaya untuk menulis dan memelihara perangkat lunak.

Mungkin Anda adalah programmer yang sangat tidak berpengalaman, tetapi pengguna daya yang lama.

  • Jika Anda "keluar" total biaya Anda mungkin rendah meskipun biaya integrasi lebih tinggi, karena Anda dapat mengurangi biaya integrasi dengan pengalaman dan pengetahuan Anda.
  • Jika Anda ingin menulis sendiri fungsi total biaya Anda mungkin cukup tinggi meskipun biaya integrasi rendah karena pemrograman pengalaman Anda.

Cara terbaik untuk mencari tahu:

Apakah ide yang lebih baik untuk memanggil aplikasi baris perintah eksternal atau untuk menginternalisasi logika aplikasi itu?

Adalah untuk menghitung biaya untuk diri sendiri. Biaya akan berbeda untuk lingkungan, situasi dan orang yang berbeda. Sebagian besar waktu akan lebih mahal untuk memanggil baris perintah, tetapi tidak selalu dan satu-satunya cara untuk memastikannya melakukan analisis.

dietbuddha
sumber
Dalam kasus saya, ini pada dasarnya adalah aplikasi eksternal yang kebetulan open-source dan ditulis dalam Java, sama seperti aplikasi saya . Sayangnya, tidak hanya ada pustaka yang digunakan aplikasi eksternal, karena pustaka itu dibundel dengan erat ke antarmuka CLI itu sendiri. Selain itu, semua poin bagus.
cdeszaq
1

Idealnya Anda ingin mengintegrasikannya. Terutama jika ini adalah aplikasi yang didistribusikan - mengurangi jumlah dependensi dan konfigurasi akan membuatnya lebih mudah. Tapi itu tentu saja masalah biaya / manfaat untuk kasus spesifik Anda.

Yang mengatakan, satu hal yang perlu dipertimbangkan adalah stabilitas. Saya menemukan sesuatu yang serupa beberapa tahun yang lalu dan tetap menjalankan program cli. Itu terlalu tidak stabil, dan aku tidak ingin yang menerjang untuk mencatat aplikasi induk, yang dibutuhkan untuk menjalankan 24/7. Sekarang ini bukan aplikasi java, tetapi tidak kurang, jika itu masalah yang mungkin berlaku Anda mungkin ingin tetap mempertimbangkan itu.

GrandmasterB
sumber