Contoh perhatian lintas sektor

121

Apa contoh yang bagus dari a cross-cutting concern? Contoh rekam medis di halaman wikipedia tampaknya tidak lengkap bagi saya.

Secara khusus dari contoh ini, mengapa logging menyebabkan duplikasi kode ( hamburan )? (Selain panggilan sederhana seperti di log("....")mana - mana, yang sepertinya bukan masalah besar).

Apa perbedaan antara a core concerndan a cross-cutting concern?

Tujuan akhir saya adalah mendapatkan pemahaman yang lebih baik tentang AOP.

jlars62
sumber

Jawaban:

235

Sebelum memahami Crosscutting Concern , kita harus memahami Concern .

Sebuah Kepedulian adalah istilah yang mengacu pada bagian dari sistem dibagi atas dasar fungsi tersebut.

Kekhawatiran ada dua jenis:

  1. Masalah yang mewakili fungsionalitas tunggal dan spesifik untuk persyaratan utama dikenal sebagai masalah inti .
    ATAU
    Fungsi utama dari sistem dikenal sebagai masalah inti.
    Contoh : Logika bisnis
  2. Masalah yang mewakili fungsionalitas untuk persyaratan sekunder disebut sebagai masalah lintas sektor atau masalah seluruh sistem .
    OR
    The kekhawatiran crosscutting merupakan masalah yang berlaku di seluruh aplikasi dan itu mempengaruhi seluruh aplikasi.
    Misalnya: logging, keamanan dan transfer data adalah masalah yang dibutuhkan di hampir setiap modul aplikasi, oleh karena itu keduanya merupakan masalah lintas sektor.

Kesopanan

masukkan deskripsi gambar di sini

Gambar ini merepresentasikan aplikasi khas yang dipecah menjadi modul. Perhatian utama setiap modul adalah menyediakan layanan untuk domain khususnya. Namun, masing-masing modul ini juga memerlukan fungsi tambahan yang serupa, seperti pencatatan keamanan dan manajemen transaksi. Contoh masalah lintas sektor adalah "logging", yang sering digunakan dalam aplikasi terdistribusi untuk membantu proses debug dengan melacak panggilan metode. Misalkan kita melakukan logging di awal dan akhir setiap badan fungsi. Ini akan menghasilkan pemotongan silang semua kelas yang memiliki setidaknya satu fungsi.

(Kesopanan)

Premraj
sumber
1
"Masalah lintas sektor adalah masalah yang dapat diterapkan di seluruh aplikasi" ➤ Tidak yakin tentang hal ini karena manajemen transaksi tidak dapat diterapkan 'di seluruh' aplikasi tetapi masih merupakan masalah lintas sektor. Dan gambar itu tidak memberi tahu saya, jujur ​​saja, itu hanya membingungkan ..
Koray Tugay
Penjelasan yang bagus, tetapi saya memiliki sedikit masalah dengan gambaran di mana kita menyebut kekhawatiran ini, masalah lintas sektoral bukan masalah lintas sektoral dan akan lebih baik saya berpikir untuk memotong masalah lain dengan masalah lintas sektoral, bukan sebaliknya. Seperti pengembangan berorientasi Aspek
hyeganeh
masih jawabannya tidak menjelaskan masalah hanya dengan menggunakan sesuatu seperti Log4j dan logging seperti LogManager.getLogger (). info (ModuleName, msg)
Vicky Singh
49

Saya pikir satu-satunya contoh terbaik dari perhatian lintas sektoral adalah perilaku transaksional. Harus menempatkan blok coba-tangkap dengan panggilan komit dan kembalikan di semua metode layanan Anda akan sangat buruk, misalnya. Memberi anotasi metode dengan penanda yang dapat digunakan AOP untuk merangkumnya dengan perilaku transaksional yang diinginkan adalah keuntungan besar.

Kandidat lain yang baik sebagai contoh perhatian lintas sektoral adalah otorisasi. Menganotasi metode layanan dengan penanda yang memberi tahu siapa yang dapat memanggilnya, dan membiarkan beberapa saran AOP memutuskan apakah akan mengizinkan panggilan metode atau tidak, dapat lebih disukai daripada menanganinya dalam kode metode layanan.

Menerapkan logging dengan saran AOP bisa menjadi cara untuk mendapatkan lebih banyak fleksibilitas, sehingga Anda dapat mengubah apa yang dicatat dengan mengubah titik gabungan. Dalam praktiknya, saya tidak melihat proyek melakukan itu terlalu sering. Biasanya menggunakan pustaka seperti log4j yang memungkinkan Anda memfilter menurut tingkat pencatatan dan kategori, pada waktu proses jika perlu, bekerja dengan cukup baik.

Perhatian inti adalah alasan bahwa aplikasi itu ada, logika bisnis yang diotomatisasi aplikasi. Jika Anda memiliki aplikasi logistik yang menangani pengiriman barang, mencari tahu berapa banyak kargo yang dapat Anda kemas di atas truk atau rute terbaik apa yang harus diambil truk untuk menurunkan pengirimannya mungkin menjadi perhatian utama. Masalah lintas sektoral biasanya merupakan detail implementasi yang perlu dipisahkan dari logika bisnis.

Nathan Hughes
sumber
2
Jadi, meskipun perilaku transaksional benar-benar hanya ada di lapisan akses data, karena blok coba-tangkap diduplikasi melalui banyak metode, hal itu dianggap lintas sektor. Persepsi asli saya adalah bahwa pemotongan silang berarti kode tersebut menjangkau beberapa lapisan aplikasi.
jlars62
4
@ jlars62: cross-cutting artinya mengarah pada sudut kanan ke fitur.
Nathan Hughes
7
@ jlars62: oleh di sudut kanan maksud saya: pikirkan fitur sebagai tumpukan lapisan. masalah lintas sektoral mungkin hanya berlaku untuk satu lapisan, tetapi ini umum untuk semua fitur.
Nathan Hughes
Otorisasi @NathanHughes adalah contoh yang bagus. Saya baru saja memfaktorkan ulang aplikasi saya untuk meletakkan semua kode otorisasi dalam arsitektur lintas sektor dan berhasil membersihkan banyak kode. Saya menganggap domain seperti rumah. Jika Anda memiliki kunci untuk masuk, Anda dapat melakukan apa pun yang Anda inginkan di sana (Anda dianggap sebagai pemilik). Tetapi Anda tidak akan mengunci setiap pintu di rumah dan meminta kunci masuk. Anda ada atau tidak.
richard
"Perilaku transaksional" mungkin umum untuk banyak fitur tetapi ini tidak akan menjadi "lintas sektoral" karena tidak "melintasi" lapisan. Alasannya, misalnya, logging adalah masalah lintas sektoral adalah karena saya mungkin ingin masuk ke lapisan presentasi, lapisan bisnis, lapisan data, dll.
CodingYoshi
14

Selain jawaban yang diterima, saya ingin menyebutkan contoh lain untuk masalah lintas sektoral: jauh. Katakanlah saya hanya ingin memanggil komponen lain dalam ekosistem saya secara lokal seolah-olah mereka sedang berjalan dalam proses. Mungkin dalam beberapa kasus mereka bahkan melakukannya. Tapi sekarang saya ingin menjalankan layanan saya yang didistribusikan di cloud atau cluster. Mengapa saya harus peduli dengan aspek ini sebagai pengembang aplikasi? Suatu aspek dapat menangani mencari tahu siapa yang harus dihubungi dan bagaimana, menserialisasi data yang dikirim jika perlu dan membuat panggilan jarak jauh. Jika semuanya berjalan dalam proses, aspek tersebut hanya akan meneruskan panggilan lokal. Di sisi callee, aspek tersebut akan deserialisasi data, melakukan panggilan lokal dan mengembalikan hasilnya.

Sekarang izinkan saya memberi tahu Anda sedikit cerita tentang hal-hal "sepele" seperti keluaran log: Beberapa minggu yang lalu saya memperbaiki basis kode yang kompleks, tetapi tidak terlalu besar (sekitar 250 ribu baris kode) untuk klien. Dalam beberapa ratus kelas, satu jenis kerangka kerja logging digunakan, di beberapa ratus lainnya. Lalu ada beberapa ribu barisSystem.out.println(*)di mana seharusnya ada keluaran log. Jadi saya akhirnya memperbaiki ribuan baris kode yang tersebar di seluruh basis kode. Untungnya saya bisa menggunakan beberapa trik pintar di IntelliJ IDEA (pencarian & penggantian struktural) untuk mempercepat seluruh tindakan, tapi bukankah itu sepele! Tentu, pencatatan debug yang sangat bergantung pada konteks akan selalu terjadi dalam badan metode, tetapi banyak jenis pencatatan penting seperti pelacakan panggilan metode (bahkan secara hierarki dengan keluaran yang diindentasi dengan baik), pencatatan kedua pengecualian yang ditangani atau tidak tertangani, audit pengguna (pencatatan panggilan ke metode terbatas berdasarkan peran pengguna) dan seterusnya dapat dengan mudah diimplementasikan dalam aspek tanpa mereka mencemari kode sumber. Pengembang aplikasi sehari-hari tidak perlu memikirkannya atau bahkan melihat panggilan logger tersebar di seluruh basis kode.

Saya dapat memberikan penjelasan serupa untuk masalah lintas sektoral lainnya. Menjaga kode tetap bersih dan bebas dari hamburan dan kekusutan IMO adalah masalah profesionalisme, bukan opsional. Last but not least itu membuat kode dapat dibaca, dipelihara, dapat dipulihkan. Amin.

kriegaex.dll
sumber
0

Masalah Lintas Sektor adalah skenario yang harus selalu ada terlepas dari jenis aplikasinya.

Misalnya Logging, Keamanan, Profil Kinerja, Pelokalan, Aksesibilitas, Transaksi, dll. Terlepas dari Perangkat Lunak yang kami buat, diperlukan pencatatan (jika tidak, bagaimana seseorang akan men-debug atau mendapatkan beberapa informasi yang relevan dari data prod). Keamanan (otentikasi / otorisasi, dll.) Diperlukan di mana hanya pengguna asli yang dapat masuk ke dalam aplikasi dengan serangkaian hak yang benar. Kami perlu mengetahui bagaimana kinerja aplikasi Anda, lalu kami perlu melakukan profiling. Jika aplikasi digunakan oleh pengguna internasional (dengan bahasa lokal mereka sendiri), maka kita perlu mendukung aplikasi yang sama. Aksesibilitas adalah kasus kegunaan bagi orang cacat untuk menggunakan aplikasi kami.

Sekarang Terlepas dari apakah aplikasi kita berbasis desktop, berbasis web, dll. Jika perlu digunakan oleh pengguna akhir lintas geografi dalam lingkungan produksi, maka diperlukan lintas sektor. Sampai sekarang saya belum mengatakan apa-apa tentang aplikasi apa itu dll, tetapi mengingat daftar masalah yang harus ditangani sebelum merilisnya ke pengguna akhir di lingkungan produksi. dan itu semua tentang masalah lintas sektor (yang perlu ditangani oleh semua aplikasi / metode / kelas yaitu di berbagai tingkatan).

bharatj
sumber