Datang terlambat ke permainan, tapi saya menyediakan ini untuk pengembang nanti yang mungkin menemukan pertanyaan ini.
Saya akan sangat menyarankan terhadap AOP jika aplikasi Anda bergantung padanya untuk beroperasi dengan benar. Aspek kerjanya seperti ini:
- Saran (perilaku tambahan) diterapkan untuk
- Menggabungkan poin (tempat-tempat di mana kode tambahan dapat dilampirkan, metode mulai atau berakhir, atau ketika suatu peristiwa tertentu memicu)
- ... di mana titik potong (pola yang mendeteksi apakah titik gabungan yang diberikan cocok) pola cocok
Bagi siapa pun yang sudah lama menggunakan komputer, fakta bahwa pola yang digunakan mungkin sesuatu yang harus diperhatikan. Jadi, inilah contoh titik potong yang cocok dengan metode apa pun yang dinamai set
apa pun argumennya:
call(* set(..))
Jadi itu pointcut yang cukup menyapu dan harus jelas bahwa penanganan ini dengan hati-hati disarankan (tidak ada permainan kata-kata) karena Anda menerapkan saran untuk banyak hal.
Atau, mari kita terapkan saran untuk semuanya , terlepas dari nama atau tanda tangan!
execution(* *(..))
Jadi jelas kita harus berhati-hati karena ada banyak daya di sini, tapi ini bukan argumen terhadap aspek - ini argumen untuk hati-hati karena ada banyak daya di sini dan pencocokan pola dapat dengan mudah serba salah (tekan saja mesin pencari favorit Anda untuk aop bug dan bersenang-senang).
Jadi, inilah yang terlihat sebagai titik potong yang relatif aman:
pointcut setter(): target(Point) &&
( call(void setX(int)) ||
call(void setY(int)) );
Itu secara eksplisit memberikan saran jika metode bernama setX
atau setY
pada Point
objek ditemukan. Metode hanya dapat menerima int
dan mereka harus void
. Terlihat cukup aman, bukan? Nah, itu aman jika metode itu ada dan Anda sudah menerapkan saran yang benar. Jika tidak, terlalu buruk; itu diam-diam gagal.
Sebagai contoh, seorang teman mencoba men-debug aplikasi Java di mana setiap orang sesekali senang, itu akan mengembalikan data yang salah. Itu adalah kegagalan yang jarang terjadi dan tampaknya tidak berkorelasi dengan kejadian atau data tertentu pada khususnya. Itu adalah bug threading, sesuatu yang terkenal sulit untuk diuji atau dideteksi. Ternyata, mereka menggunakan aspek untuk mengunci metode dan membuatnya "thread aman", tetapi seorang programmer mengganti nama metode dan sebuah pointcut gagal mencocokkannya, sehingga menyebabkan kerusakan aplikasi diam-diam.
Jadi, saya memberi tahu orang-orang bahwa jika mereka harus menggunakan AOP, untuk memperlakukan aspek seperti pengecualian: dalam sistem yang dirancang dengan baik dan jika tidak ada yang salah, mereka dapat dihapus dan perangkat lunak masih berfungsi dengan benar. Namun, jika fungsionalitas program tergantung pada AOP, Anda memperkenalkan kerapuhan pada program Anda yang tidak beralasan.
Jadi, logging, debugging dan tracing adalah contoh perilaku yang sempurna untuk aspek, tetapi keamanan? Nggak. Keamanan benang? Nggak.
Untuk alternatif yang lebih baik untuk AOP, lihat ciri-ciri . Alih-alih dibaut ke bahasa, mereka diintegrasikan ke dalamnya secara langsung, tidak perlu IDE "trait aware" (meskipun dapat membantu) dan memiliki kegagalan waktu kompilasi jika metode yang Anda butuhkan tidak ada. Ciri-ciri melakukan pekerjaan yang jauh lebih bersih dalam menangani pemisahan masalah karena masalahnya lebih baik ditentukan sejak awal. Saya menggunakannya secara luas dan mereka luar biasa.