Kenapa "vs"? Itu bukan "vs". Anda dapat menggunakan pemrograman Berorientasi Aspek dalam kombinasi dengan pemrograman fungsional, tetapi juga dalam kombinasi dengan yang Berorientasi Objek. Ini bukan "vs", itu adalah "Pemrograman Berorientasi Aspek dengan Pemrograman Berorientasi Objek".
Bagi saya AOP adalah semacam "meta-programming". Segala sesuatu yang dilakukan AOP juga dapat dilakukan tanpanya dengan hanya menambahkan lebih banyak kode. AOP hanya menghemat Anda menulis kode ini.
Wikipedia memiliki salah satu contoh terbaik untuk pemrograman meta ini. Asumsikan Anda memiliki kelas grafis dengan banyak metode "set ... ()". Setelah setiap metode yang ditetapkan, data gambar berubah, dengan demikian gambar berubah dan dengan demikian gambar perlu diperbarui di layar. Asumsikan untuk mengecat ulang gambar yang harus Anda panggil "Display.update ()". Pendekatan klasik adalah untuk menyelesaikan ini dengan menambahkan lebih banyak kode . Di akhir setiap set metode yang Anda tulis
void set...(...) {
:
:
Display.update();
}
Jika Anda memiliki 3 set-metode, itu bukan masalah. Jika Anda memiliki 200 (hipotetis), semakin menyakitkan untuk menambahkan ini di mana-mana. Juga setiap kali Anda menambahkan metode-set baru, Anda harus yakin untuk tidak lupa menambahkan ini ke akhir, jika tidak, Anda baru saja membuat bug.
AOP memecahkan ini tanpa menambahkan banyak kode, alih-alih Anda menambahkan aspek:
after() : set() {
Display.update();
}
Dan itu dia! Alih-alih menulis sendiri kode pembaruan, Anda hanya memberi tahu sistem bahwa setelah set point () dicapai, ia harus menjalankan kode ini dan akan menjalankan kode ini. Tidak perlu memperbarui 200 metode, tidak perlu memastikan Anda tidak lupa menambahkan kode ini pada set-metode baru. Selain itu, Anda hanya perlu titik potong:
pointcut set() : execution(* set*(*) ) && this(MyGraphicsClass) && within(com.company.*);
Apa artinya? Itu berarti jika suatu metode bernama "set *" (* berarti nama apa pun dapat mengikuti setelah set), terlepas dari apa metode kembali (tanda bintang pertama) atau parameter apa yang diperlukan (tanda bintang ketiga) dan itu adalah metode MyGraphicsClass dan ini kelas adalah bagian dari paket "com.company. *", maka ini adalah set () pointcut. Dan kode pertama kami mengatakan " setelah menjalankan metode apa pun yang merupakan set pointcut, jalankan kode berikut".
Lihat bagaimana AOP secara elegan menyelesaikan masalah di sini? Sebenarnya semua yang dijelaskan di sini dapat dilakukan pada waktu kompilasi. Seorang preprocessor AOP hanya dapat memodifikasi sumber Anda (misalnya menambahkan Display.update () ke akhir setiap metode set-pointcut) sebelum bahkan mengkompilasi kelas itu sendiri.
Namun, contoh ini juga menunjukkan salah satu kelemahan besar dari AOP. AOP sebenarnya melakukan sesuatu yang oleh banyak programmer dianggap sebagai " Anti-Pola ". Pola yang tepat disebut " Aksi di kejauhan ".
Tindakan di kejauhan adalah anti-pola (kesalahan umum yang diakui) di mana perilaku di satu bagian program bervariasi berdasarkan sulit atau tidak mungkin untuk mengidentifikasi operasi di bagian lain dari program.
Sebagai pemula untuk suatu proyek, saya mungkin hanya membaca kode dari setiap metode-set dan menganggapnya rusak, karena tampaknya tidak memperbarui tampilan. Saya tidak melihat dengan hanya melihat kode dari set-method, bahwa setelah dieksekusi, beberapa kode lain akan "secara ajaib" dijalankan untuk memperbarui tampilan. Saya menganggap ini kerugian serius! Dengan membuat perubahan pada metode, bug aneh mungkin diperkenalkan. Lebih jauh memahami aliran kode di mana hal-hal tertentu tampaknya berfungsi dengan benar, tetapi tidak jelas (seperti yang saya katakan, mereka hanya bekerja secara ajaib ... entah bagaimana), sangat sulit.
Memperbarui
Hanya untuk mengklarifikasi bahwa: Beberapa orang mungkin memiliki kesan saya katakan AOP adalah sesuatu yang buruk dan tidak boleh digunakan. Bukan itu yang saya katakan! AOP sebenarnya adalah fitur yang hebat. Saya hanya mengatakan "Gunakan dengan hati-hati". AOP hanya akan menimbulkan masalah jika Anda mencampur kode normal dan AOP untuk Aspek yang sama . Pada contoh di atas, kita memiliki Aspek memperbarui nilai-nilai objek grafis dan mengecat objek yang diperbarui. Itu sebenarnya satu aspek. Coding setengahnya sebagai kode normal dan setengah lainnya sebagai aspek yang menambah masalah.
Jika Anda menggunakan AOP untuk aspek yang sama sekali berbeda, misalnya untuk logging, Anda tidak akan mengalami masalah anti-pola. Dalam hal itu seorang pemula untuk proyek mungkin bertanya-tanya "Di mana semua pesan log ini berasal? Saya tidak melihat output log dalam kode", tapi itu bukan masalah besar. Perubahan yang dia buat pada logika program tidak akan merusak fasilitas log dan perubahan yang dibuat pada fasilitas log tidak akan merusak logika programnya - aspek-aspek ini benar-benar terpisah. Menggunakan AOP untuk logging memiliki keuntungan bahwa kode program Anda dapat sepenuhnya berkonsentrasi pada melakukan apa yang seharusnya dilakukan dan Anda masih dapat memiliki logging yang canggih, tanpa kode Anda sedang berantakan oleh ratusan pesan log di mana-mana. Juga ketika kode baru diperkenalkan, pesan log ajaib akan muncul pada waktu yang tepat dengan konten yang tepat.
Jadi penggunaan AOP yang baik dalam contoh saya akan selalu mencatat jika ada nilai yang telah diperbarui melalui metode yang ditetapkan. Ini tidak akan membuat pola anti dan hampir tidak pernah menjadi penyebab masalah.
Orang mungkin mengatakan, jika Anda dapat dengan mudah menyalahgunakan AOP untuk menciptakan begitu banyak masalah, itu ide buruk untuk menggunakan semuanya. Namun teknologi mana yang tidak bisa disalahgunakan? Anda dapat menyalahgunakan enkapsulasi data, Anda dapat menyalahgunakan warisan. Hampir setiap teknologi pemrograman yang berguna dapat disalahgunakan. Pertimbangkan bahasa pemrograman yang sangat terbatas sehingga hanya berisi fitur yang tidak dapat disalahgunakan; bahasa di mana fitur hanya dapat digunakan karena mereka awalnya dimaksudkan untuk digunakan. Bahasa seperti itu akan sangat terbatas sehingga bisa diperdebatkan bahkan dapat digunakan untuk pemrograman dunia nyata.