Apa alternatif yang ada untuk masalah lintas sektoral selain pemrograman berorientasi aspek? [Tutup]

19

Pemrograman berorientasi aspek menjanjikan untuk menangani masalah lintas sektoral, tapi saya belum sepenuhnya menjualnya. Apakah ada upaya lain untuk mengatasi masalah ini?

Casebash
sumber
Pola pengunjung dapat mengatasi banyak situasi yang sekarang diselesaikan melalui AOP.
Steven Evers
@SnOrfus: Lihat juga tanggapan saya di bawah ini, di mana saya berbicara tentang perpustakaan DJ untuk Jawa: Cara dinamis untuk menggunakan pola pengunjung! Layak dicoba. (Ini juga merupakan teknik umum yang dapat Anda gunakan sendiri dengan Reflection.)
Macneil

Jawaban:

7

Jika memungkinkan, Anda dapat merangkum masalah lintas sektor ke dalam modul terpisah yang kemudian digunakan di seluruh aplikasi melalui injeksi ketergantungan. Ini memungkinkan Anda untuk agak memisahkan implementasi lintas sektor dari penggunaannya di seluruh kode.

Ini tidak selalu bekerja dengan elegan. Itulah alasan orang mencoba untuk mengatasi masalah dengan hal-hal seperti AOP.

Fishtoaster
sumber
6

Dua opsi lain yang belum saya lihat dieksplorasi:

Pemrograman Fungsional dengan Monads dan Arrows

Dalam FP Anda mewakili masalah lintas sektoral seperti hal lain: sebagai sesuatu yang Anda sampaikan pada panggilan fungsi. Karena melakukan itu secara eksplisit terasa membosankan, Anda dapat menggunakan Monads (atau mungkin Panah) untuk menyembunyikan informasi tambahan yang diteruskan.

Contoh AOP yang paling umum adalah logging. Dengan Monads, Anda akan membuat monad "Logger" yang menyimpan daftar pesan. Setiap fungsi yang Anda lakukan melalui LoggerMonad memiliki kemampuan untuk mengirim pesan log. Dengan Arrows, Anda akan memodelkan seluruh aliran data aplikasi, dan akan melakukan rutinitas logging ke dalam model yang sesuai. Kupikir. Panahnya cukup rumit.

Pemrograman Berbasis Entitas / Komponen

Sesuatu yang telah saya teliti dan coba-coba untuk mesin gim. Alih-alih "objek" seperti di OOP, Anda menguraikan semuanya menjadi paket data (komponen) dan layanan yang beroperasi di atas jenis komponen. Komponen dikelompokkan bersama oleh ID umum, seperti dalam database relasional, dan kelompok komponen terkait adalah Entitas. Untuk menambahkan logging di sistem seperti itu, Anda akan menambahkan layanan logging baru pemicu berdasarkan komponen mana yang dilewati.

Kedua metode ini memungkinkan seseorang untuk dengan mudah melakukan perubahan lintas sektor dengan sangat mudah, tetapi keduanya adalah model arsitektur tingkat tinggi. Jadi, Anda mungkin harus menggunakannya sejak awal. Model Komponen, secara teoritis, dapat dikerjakan ke dalam sistem OOP yang ada. Saya kira monad juga bisa jika bahasa Anda cukup kuat.

CodexArcanum
sumber
Ketika Anda berbicara tentang Monads dan Arrows, Anda juga harus menyebutkan Fungsi Aplikatif.
Waquo
3

Ada beberapa cara untuk mengatasi masalah kekhawatiran lintas sektor:

  • Gunakan Pola, Idiom, atau Mekanisme Abstraksi yang Lebih Baik : Kode dapat memotong secara silang meskipun dapat dimodulasi. Untuk mempertahankan kode, Anda perlu refactor untuk menggunakan teknik desain yang dapat memodulasi itu. Refactoring semacam itu dapat memperkenalkan crosscutting dari jenis yang berbeda, tetapi mudah-mudahan apa itu crosscut yang stabil, dan tidak mungkin berubah.

  • Mengembangkan Fitur Bahasa Lebih Kaya : Banyak manifestasi dari pemotongan silang dapat diselesaikan melalui mekanisme abstraksi yang lebih baik, dan kadang-kadang fitur bahasa baru diperlukan. Misalnya, bahasa yang lebih maju yang mencakup fitur fungsional dan berorientasi objek sering tidak menggunakan banyak pola desain, karena mereka tidak diperlukan. Perhatikan bahwa pola desain itu sendiri dapat memotong secara alami , karena mereka menggambarkan peran beberapa objek dan kelas yang berbeda. Di Jawa, refleksi sering dapat digunakan sebagai pengganti aspek, meskipun dengan biaya runtime yang lebih tinggi. Misalnya, menggunakan refleksi, Anda dapat mendukung pola pengunjung di atas ratusan kelas hanya dengan beberapa baris kode. Perpustakaan DJdari Northeastern adalah salah satu solusi reflektif yang melakukan hal itu. Mixin adalah teknik ampuh yang tersedia dalam C ++ (tetapi tidak Java) dan dapat memberi Anda beberapa kasus penggunaan yang sama sebagai suatu aspek.

  • Berikan Dukungan Alat yang Lebih Baik : Teknik seperti menggunakan grepdan melakukan operasi refactoring dapat menangani masalah yang terkait dengan kode lintas potong. Misalnya, nama metode yang dideklarasikan dalam sebuah antarmuka dapat memotong seluruh program. (Perhatikan perbedaan teknis di sini: Ini adalah nama metode, bukan implementasi metode, yang memotong.) Ini biasanya bukan masalah dalam IDE seperti Eclipse, di mana Anda dapat menggunakan "rename refactoring" untuk mengubah semua tempat-tempat dalam kode Anda yang menggunakan nama. Dengan cara ini, dimungkinkan untuk tidak memerlukan fitur bahasa ketika lingkungan pemrograman cukup ekspresif untuk Anda.

  • Gunakan Bahasa Domain-Khusus : Bahasa -bahasa aspek awal, yang datang sebelum AspectJ, adalah domain-spesifik dan diterapkan hanya pada masalah tertentu, seperti sinkronisasi utas atau analisis aliran data untuk menggabungkan komposisi fungsi secara efisien. Bahasa-bahasa ini bersifat eksperimental, tetapi tampaknya sangat berhasil dalam memodulasi kekhawatiran yang sebaliknya memotong lintas.

  • Gunakan Teknik Pemrograman Generatif : Melangkah ke tingkat meta mungkin dianggap sebagai teknik implementasi untuk pemrograman berorientasi aspek, tetapi ini adalah area yang cukup besar sehingga melampaui aspek sederhana. Teknik generatif (di mana suatu program menghasilkan kode sumber untuk program lain) juga terkait dengan bahasa khusus domain.

Untuk semua ini, saya pikir mempelajari AOP adalah tepat. AOP dapat membantu Anda memperluas konsepsi kode Anda, bahkan jika Anda tidak menggunakan bahasa AOP.

Macneil
sumber
2

Secara umum, penandaan kode elemen dengan fitur deklaratif, tetapi secara khusus sistem Atribut di dunia C # /. NET / Mono.


sumber
Bisakah Anda lebih spesifik? Apa yang Anda gambarkan adalah bagaimana beberapa sistem AOP bekerja.
Steven Evers
2
Cukup banyak AOP.
Matt H
AOP dalam pengertian tipikal / klasiknya memerlukan alat pendukung (suatu aspek tenun IDE) untuk melakukannya dalam skala besar. AOP mempersulit alasan tentang kode dari kode sumber utama saja. Lebih sulit untuk memprediksi perilaku komponen Anda ketika program Anda disusupi oleh zombie aspek. Atribut atau tag menyediakan fungsionalitas yang serupa tetapi dengan representasi eksplisit dalam kode sumber.
Perhatikan bahwa masalah saya tidak persis dengan masalah yang diselesaikan dengan cara AOP. Satu-satunya kekhawatiran saya adalah bahwa dengan AOP, kode sumber saya bukan sumber yang cukup untuk memprediksi perilaku program saya.
@mumtaz: Saya bisa melihat bagaimana itu akan terjadi ketika menerapkan aspek ke seluruh namespace. Metode AOP lainnya: mengaitkan metode / properti / dll. untuk menerapkan aspek tersebut, identik dengan apa yang Anda gambarkan.
Steven Evers
2

Saya bukan ahli dalam AOP, tetapi dari membaca tentang hal itu selama bertahun-tahun, selalu tampak seperti bentuk yang lebih lemah dari pemrograman metap yang ditawarkan oleh Lisp , terutama bagian-bagian seperti protokol metaobjectnya.

Ini seharusnya tidak mengejutkan, saya kira: Gregor Kiczales adalah salah satu penulis AMOP, dan kemudian menulis AspectJ for Java!

Ken
sumber