Bagaimana orang membangun perangkat lunak yang bisa dicolokkan?

20

Jika Anda memiliki semacam aplikasi dan Anda ingin pengguna Anda dapat menulis plugin untuk itu, bagaimana seharusnya aplikasi tersebut dirancang?

Apa yang harus Anda perhitungkan, pola desain apa untuk ini, dll?

pengguna9238
sumber
Pola-pola seperti Pengamat, Mediator, Rantai Komando Tanggung Jawab muncul di benak saya
Mchl
3
@Mchl: Silakan kirim jawaban Anda sebagai jawaban, bukan sebagai komentar.
S.Lott
Anda harus melihat pada Mef dan info MSDN
Luc Bos
Saya merasa itu tidak cukup detail untuk itu
Mchl
@ Mcch: "tidak cukup detail"? Lalu mengapa berkomentar sama sekali? Itu jelas jawaban. Silakan kirim jawaban sebagai jawaban.
S.Lott

Jawaban:

13

Ini agak tergantung pada platform Anda tetapi beberapa hal umum yang perlu diingat

Versi Apa yang terjadi jika Anda memperbarui aplikasi Anda, apakah semua plugin lama menjadi usang (masalah firefox)

Isolasi Dapatkah plugin melakukan apa pun yang mereka inginkan? Apakah Anda selalu mempercayai mereka? Atau apakah Anda perlu menjalankannya di semacam kotak pasir dan meminta izin.

Pembaruan Bagaimana Anda menangani pembaruan plugin?

Keamanan Bagaimana Anda memastikan pembuat plugin, mencegah spoofing, atau pengguna diperdaya untuk memasang kode jahat. Biasanya diselesaikan dengan semacam penandatanganan kode

Serialisasi sering ketika Anda menggunakan isolasi dari beberapa jenis Anda perlu membuat serial informasi antara berbagai utas atau proses. Bagaimana Anda melakukannya dengan sangat efisien?

Extensibility Aspek apa yang perlu Anda perluas? Bagaimana Anda memaksimalkan potensi plugin tanpa API menjadi berat.

Jika Anda menargetkan pengembang pihak ketiga untuk plugin, saya akan mengatakan hal yang paling penting (dari pengalaman saya) adalah melihat api dan kelas plugin sama sekali berbeda dari aplikasi lainnya, dan membuatnya mudah untuk dikembangkan untuk mungkin. Sangat mudah untuk arsitektur dari aplikasi utama untuk "berdarah" ke dalam plugin sehingga pembuat plugin harus belajar lebih banyak dari yang seharusnya. Buat mudah bagi mereka, pikirkan seperti apa antarmuka dan pengalaman yang Anda inginkan sebagai pembuat plugin.

Pola pikir yang baik lainnya adalah jangan berpikir seperti "Plugin akan melakukan semua hal ini (dalam kode) tetapi," plugin perlu memberikan informasi ini ". Dengan cara itu aplikasi dapat mengkonsumsi informasi yang diperlukan dan melakukan pemrosesan aktual yang akan menyederhanakan plugin.

Juga secara umum, setiap kali Anda dapat menggunakan pendekatan deskriptif (metadata, seperti xml) daripada kode Anda memiliki keuntungan besar karena metadata lebih mudah untuk diangkut, versi, disebarkan, aman dan dapat lebih mudah dikonfigurasi oleh pihak ketiga

Homde
sumber
1
+1 Ini tidak langsung menjawab pertanyaan, tetapi ini adalah masalah penting yang harus ada dalam pikiran
Adriano Carneiro
Saya percaya masalah ini dibahas sebelum ada yang mulai mengembangkan mekanisme diperpanjang yang sebenarnya
Gus
9

Saya menulis artikel Proyek Kode ini tentang menggunakan MEF untuk ekstensibilitas dalam .NET. Ini pengantar yang bagus.

Ada kerangka kerja ekstensibilitas lain untuk .NET, seperti Arsitektur Add-in SharpDevelop , Mono.Addins , dan System.AddIn .

Untuk Java, ada Eclipse Plug-in Architecture .

Pola umumnya adalah ini:

  • Anda menentukan kontrak (biasanya antarmuka) antara host dan ekstensi
  • Anda memerlukan mekanisme penemuan yang keluar dan mencari ekstensi yang diinstal
  • Anda harus dapat memuat ekstensi secara dinamis dan membuat host menyadarinya

Dalam praktiknya banyak berbagi dengan Injeksi Ketergantungan dan Pola Strategi.

Scott Whitlock
sumber
+1 MEF dan System.AddIn adalah dua hal yang baik untuk dilihat. Bahkan jika Anda tidak menggunakannya, mereka berdua menunjukkan konsep yang baik.
RationalGeek
@ jkohlhepp - Saya setuju, dan saya juga akan menyarankan menyelam jauh ke dalam arsitektur SharpDevelop karena ada banyak yang ditulis tentang itu, itu open source (begitu juga MEF, btw), dan dirancang dengan baik.
Scott Whitlock
3

Anda hanya perlu menyediakan antarmuka untuk plugin.

Itu harus mengandung setidaknya Activate-Methode (sebuah titik masuk), tetapi Anda juga akan menginginkan hal-hal seperti Inisialisasi dll.

Dan harus ada kemungkinan untuk berkomunikasi dengan aplikasi host dengan cara yang mirip registri, misalnya untuk mendaftarkan item menu. Jadi pendaftar untuk hal-hal yang dapat diubah / diperpanjang untuk plugin harus disediakan.

Juga, harus ada beberapa penyimpanan yang dapat diakses untuk data dan objek aplikasi host, sehingga plugin dapat memanggil rutinitasnya. Ini dapat dengan mudah dilakukan dengan menggunakan DI-Container seperti Unity dan membiarkan plugin mengaksesnya, sehingga mereka dapat menyelesaikan layanan yang mereka butuhkan.

Agregator Acara mungkin merupakan ide yang bagus juga, jadi plugin dapat membuang acara dan bereaksi terhadap peristiwa dari plugin lain dan aplikasi host dengan cara yang dipisahkan. Anda pasti menginginkannya!

Elang
sumber