Apa itu pemrograman berorientasi aspek?

231

Saya mengerti pemrograman berorientasi objek, dan sudah lama menulis program OO. Orang-orang tampaknya berbicara tentang pemrograman berorientasi aspek, tetapi saya tidak pernah benar-benar belajar apa itu atau bagaimana menggunakannya. Apa paradigma dasarnya?

Pertanyaan ini terkait, tetapi tidak cukup bertanya:

Pemrograman Berorientasi Aspek vs. Pemrograman Berorientasi Objek

Sophie
sumber
5
IMAO, tautan yang disediakan dalam pertanyaan memiliki jawaban yang lebih jelas dan menyeluruh daripada yang diterima di sini. Orang yang membaca pertanyaan ini mungkin membacanya terlebih dahulu.
David Chen

Jawaban:

198

AOP mengatasi masalah lintas sektoral , yang merupakan jenis kode apa pun yang diulangi dalam metode yang berbeda dan biasanya tidak dapat sepenuhnya di refactored ke dalam modulnya sendiri, seperti dengan pencatatan atau verifikasi. Jadi, dengan AOP Anda dapat mengabaikan hal itu dari kode utama dan mendefinisikannya secara vertikal seperti:

function mainProgram()
{ 
   var x =  foo();
   doSomethingWith(x);
   return x;
}

aspect logging
{ 
    before (mainProgram is called):
    { 
       log.Write("entering mainProgram");
    }

    after (mainProgram is called):
    { 
       log.Write(  "exiting mainProgram with return value of "
                  + mainProgram.returnValue);
    }
 } 

aspect verification
{ 
    before (doSomethingWith is called):
    { 
       if (doSomethingWith.arguments[0] == null) 
       { 
          throw NullArgumentException();
       }

       if (!doSomethingWith.caller.isAuthenticated)
       { 
          throw Securityexception();
       }
    }
 }

Dan kemudian aspek-weaver digunakan untuk mengkompilasi kode menjadi ini:

function mainProgram()
{ 
   log.Write("entering mainProgram");

   var x = foo();   

   if (x == null) throw NullArgumentException();
   if (!mainProgramIsAuthenticated()) throw Securityexception();
   doSomethingWith(x);   

   log.Write("exiting mainProgram with return value of "+ x);
   return x;
} 
Mark Cidade
sumber
14
Apakah Anda memerlukan dukungan bahasa untuk ini? Bahasa apa yang menjadi contoh Anda?
Sophie
8
Ini adalah pseudocode tetapi contoh yang paling terkenal adalah AspectJ, yang merupakan modifikasi AOP dari Java, yang menggunakan teknik serupa yang disebut cutpoints.
Mark Cidade
71
Voodoo. Dan saya pikir OOP berlebihan.
Aiden Bell
17
Mark, apakah ini seperti menghias titik masuk dan keluar metode?
Filip Dupanović
3
@AidenBell Jika tindakan tak terlihat dari kejauhan dapat dianggap voodoo, maka ya, itu voodoo. Di bawah metaprogamming Moose, pengubah metode seperti sebelumnya, setelah, sekitar, bagian dalam, penambahan melakukan hal itu. Itu mengaburkan aliran eksekusi program. Ini hampir mustahil untuk dilacak, terutama ketika mereka berasal dari versi aspek sistem, yang disebut peran . Orang dapat menyusun sistem kompleksitas yang mengejutkan dengan semua ini.
tchrist
13

Sayangnya, tampaknya sangat sulit untuk membuat AOP benar-benar bermanfaat dalam organisasi ukuran menengah-normal. (Dukungan editor, rasa kontrol, fakta bahwa Anda mulai dengan hal-hal yang tidak begitu penting yang mengarah pada pembusukan kode, orang-orang pulang ke keluarga mereka, dll.)

Saya menaruh harapan saya pada pemrograman berorientasi komposit , yang merupakan sesuatu yang lebih dan lebih realistis. Ini terhubung ke banyak ide populer dan memberi Anda sesuatu yang sangat keren.

Lihat implementasi yang akan datang di sini: qi4j.org/

PS. Sebenarnya, saya berpikir bahwa salah satu keindahan dengan AOP juga merupakan tumit achilles: Ini tidak mengganggu, membiarkan orang mengabaikannya jika mereka bisa, jadi itu akan diperlakukan sebagai perhatian sekunder di sebagian besar organisasi.

Hugo
sumber
8

Disalin dari duplikat untuk kelengkapan (Einstein):

Contoh klasiknya adalah keamanan dan pencatatan. Alih-alih menulis kode dalam aplikasi Anda untuk mencatat kejadian x atau memeriksa objek z untuk kontrol akses keamanan ada alat bahasa "out of band" dari kode normal yang secara sistematis dapat menyuntikkan keamanan atau masuk ke rutinitas yang tidak secara otomatis memilikinya di sedemikian rupa sehingga meskipun kode Anda tidak menyediakannya - itu diurus.

Contoh yang lebih konkret adalah sistem operasi yang menyediakan kontrol akses ke file. Program perangkat lunak tidak perlu memeriksa pembatasan akses karena sistem yang mendasarinya berfungsi untuk itu.

Jika Anda pikir Anda memerlukan AOP dalam pengalaman saya, Anda sebenarnya benar-benar perlu menginvestasikan lebih banyak waktu dan upaya dalam manajemen meta-data yang sesuai dalam sistem Anda dengan fokus pada desain struktur / sistem yang dipikirkan dengan baik.

paxdiablo
sumber
7

Disalin dari Spring in Action

AOP sering didefinisikan sebagai teknik yang mempromosikan pemisahan kekhawatiran dalam sistem perangkat lunak. Sistem terdiri dari beberapa komponen, masing-masing bertanggung jawab atas bagian fungsionalitas tertentu. Namun seringkali komponen ini juga membawa tanggung jawab tambahan di luar fungsi intinya. Layanan sistem seperti logging, manajemen transaksi, dan keamanan sering menemukan jalan mereka ke komponen yang tanggung jawab utamanya adalah sesuatu yang lain. Layanan sistem ini biasanya disebut sebagai masalah lintas sektoral karena mereka cenderung melintasi banyak komponen dalam suatu sistem.


sumber
6

Disalin dari duplikat untuk kelengkapan (Bel):

Atribut kelas dan metode dalam .NET adalah bentuk pemrograman berorientasi aspek. Anda menghias kelas / metode Anda dengan atribut. Di belakang layar ini menambahkan kode ke kelas / metode Anda yang melakukan fungsi-fungsi tertentu dari atribut. Sebagai contoh, menandai sebuah kelas yang dapat diubah-ubah memungkinkannya untuk diserialisasi secara otomatis untuk penyimpanan atau transmisi ke sistem lain. Atribut lain mungkin menandai properti tertentu sebagai non-serializable dan ini akan secara otomatis dihilangkan dari objek serial. Serialisasi adalah suatu aspek, diterapkan oleh kode lain dalam sistem, dan diterapkan ke kelas Anda dengan penerapan atribut "konfigurasi" (dekorasi).

paxdiablo
sumber
5

AOP dapat digunakan untuk melakukan tindakan yang tidak terkait dengan logika bisnis aplikasi Anda seperti logging, caching, dll. Tindakan ini dapat diletakkan di bagian terpisah dari aplikasi Anda dan kemudian digunakan kembali di seluruh aplikasi. Biasanya ada dua cara untuk mencapai ini. Menyuntikkan kode secara otomatis oleh preprocessor sebelum / setelah suatu metode, atau melampirkan kelas proxy yang memotong panggilan metode dan kemudian dapat menjalankan sesuatu sebelum / setelah panggilan metode.

Berikut adalah contoh di .Net. Ia menggunakan kelas proxy untuk mencegat panggilan metode dan mengeksekusi kode sebelum panggilan metode saif setelah.

Pemrograman Berorientasi Aspek (AOP) dalam .NET Core dan C # menggunakan AutoFac dan DynamicProxy

Carlos Blanco
sumber
4

Ada contoh AOP, ia menggunakan spring AOP sebagai contoh. Contohnya cukup mudah dimengerti.

Kerangka kerja Spring AOP (Pemrograman berorientasi aspek) digunakan untuk memodulasi masalah lintas sektoral dalam berbagai aspek. Sederhananya, itu hanya pencegat untuk mencegat beberapa proses, misalnya, ketika suatu metode dieksekusi, Spring AOP dapat membajak metode eksekusi, dan menambahkan fungsionalitas tambahan sebelum atau setelah eksekusi metode.

Referensi: http://www.mkyong.com/spring/spring-aop-examples-advice/

RF
sumber
Dalam komputasi, pemrograman berorientasi aspek (AOP) adalah paradigma pemrograman yang bertujuan untuk meningkatkan modularitas dengan memungkinkan pemisahan masalah lintas sektoral.
RF
3

AOP adalah cara untuk memodulasi aplikasi Anda dengan lebih baik untuk fungsionalitas yang membentang melintasi banyak batas. AOP adalah cara lain untuk merangkum fitur-fitur ini dan mengikuti Single Responsiblity dengan memindahkan masalah lintas sektoral ini (logging, penanganan kesalahan, dll.) Dari komponen utama aplikasi Anda. Ketika digunakan secara tepat, AOP dapat menyebabkan tingkat pemeliharaan dan ekstensibilitas yang lebih tinggi dalam aplikasi Anda seiring waktu.

Pengembang SaaS
sumber