Çapraz kesme sorunu örneği


121

İyi bir a örneği nedir cross-cutting concern? Wikipedia sayfasındaki tıbbi kayıt örneği bana eksik görünüyor.

Özellikle bu örnekten yola çıkarak, günlüğe kaydetme neden kod tekrarına ( saçılma ) yol açıyor ? ( log("....")Her yerde olduğu gibi, önemli gibi görünmeyen basit aramaların yanı sıra ).

A core concernve a arasındaki fark nedir cross-cutting concern?

Nihai hedefim AOP'yi daha iyi anlamaktır.

Yanıtlar:


235

Anlayarak önce enine kesim Endişeli , anlamak zorundayız Endişeli .

Bir Endişe , sistemin işlevsellik temelinde bölünmüş bir bölümünü ifade eden bir terimdir.

Endişeler iki türdür:

  1. Birincil gereksinimler için tek ve özel işlevselliği temsil eden endişeler, temel endişeler olarak bilinir .
    VEYA
    Sistemin birincil işlevselliği, temel konular olarak bilinir.
    Örneğin : İş mantığı
  2. İkincil gereksinimler için işlevleri temsil eden endişeler, kesişen endişeler veya sistem çapında endişeler olarak adlandırılır .
    YA kesen endişe uygulama boyunca geçerli olan bir husustur ve tüm uygulama etkiler. Örneğin: günlüğe kaydetme, güvenlik ve veri aktarımı, bir uygulamanın hemen hemen her modülünde ihtiyaç duyulan endişelerdir, dolayısıyla kesişen konulardır.

Nezaket

görüntü açıklamasını buraya girin

Bu şekil, modüllere ayrılmış tipik bir uygulamayı temsil etmektedir. Her modülün temel amacı, kendi özel alanı için hizmetler sağlamaktır. Bununla birlikte, bu modüllerin her biri, güvenlik kaydı ve işlem yönetimi gibi benzer yardımcı işlevler de gerektirir. Kesişen endişelere bir örnek, yöntem çağrılarını izleyerek hata ayıklamaya yardımcı olmak için dağıtılmış uygulamalarda sıklıkla kullanılan "günlük kaydı" dır. Her bir işlev gövdesinin hem başında hem de sonunda günlük kaydı yaptığımızı varsayalım. Bu, en az bir işlevi olan tüm sınıfların çapraz kesilmesine neden olacaktır.

(Nezaket)


1
"Kesişen endişe, uygulama boyunca geçerli olan bir sorundur" ➤ Bundan emin değilim, çünkü işlem yönetimi uygulama 'genelinde' geçerli değildir, ancak yine de kesişen bir sorundur. Ve resim bana dürüst olmak gerekirse hiçbir şey söylemiyor, sadece kafa karıştırıcı ..
Koray Tugay

İyi bir açıklama, ancak bu endişeler dediğimiz resimle ilgili biraz sorunum var, kesişen endişeler değil ve diğer endişeleri kesişen endişelerle kesmek daha iyi olur, başka türlü değil.
Görünüşe

Yine de cevap, Log4j gibi bir şey kullanarak ve LogManager.getLogger () gibi oturum açmayla ilgili sorunu açıklamıyor. info (ModuleName, msg)
Vicky Singh

49

Kesişen bir endişenin en iyi tek örneğinin işlemsel davranış olduğunu düşünüyorum. Örneğin, tüm hizmet yöntemlerinize commit ve rollback çağrıları içeren try-catch blokları koymak zorundasınız. Yöntemlere, AOP'nin bunları istenen işlemsel davranışla kapsüllemek için kullanabileceği bir işaretçi ile açıklama eklemek büyük bir kazançtır.

Kesişen bir endişeye örnek olarak bir başka iyi aday, yetkilendirmedir. Bir hizmet yöntemine, onu kimin arayabileceğini söyleyen bir işaretçi ile açıklama eklemek ve bazı AOP tavsiyelerinin, yöntem çağrısına izin verip vermemeye karar vermesine izin vermek, bunun hizmet yöntemi kodunda ele alınması tercih edilebilir.

Günlük kaydını AOP tavsiyesiyle uygulamak, daha fazla esneklik elde etmenin bir yolu olabilir, böylece bir birleştirme noktasını değiştirerek kaydedilenleri değiştirebilirsiniz. Pratikte bunu çok sık yapan projeleri görmüyorum. Tipik olarak log4j gibi, ihtiyacınız olursa çalışma zamanında günlük seviyesi ve kategoriye göre filtreleme yapmanızı sağlayan bir kitaplık kullanmak yeterince iyi sonuç verir.

Temel sorun, uygulamanın var olmasının bir nedeni, uygulamanın otomatikleştirdiği iş mantığıdır. Nakliye navlunu ile ilgilenen bir lojistik uygulamanız varsa, bir kamyona ne kadar kargo koyabileceğinizi veya kamyonun teslimatlarını bırakmak için kullanması gereken en iyi yolu bulmak temel endişeler olabilir. Kesişen endişeler, tipik olarak iş mantığından ayrı tutulması gereken uygulama ayrıntılarıdır.


2
Dolayısıyla, işlemsel davranış gerçekten yalnızca veri erişim katmanında mevcut olsa da, deneme-yakalama blokları birçok yöntemde çoğaltıldığı için, çapraz kesme olarak kabul edilir. İlk algılarım, çapraz kesimin kodun uygulamanın birden çok katmanını kapsadığı anlamına geldiğiydi.
jlars62

4
@ jlars62: çapraz kesim, özelliklere dik açılarla gittiği anlamına gelir.
Nathan Hughes

7
@ jlars62: dik açıyla demek istediğim: bir özelliği bir katman yığını olarak düşünün. bir kesişme sorunu yalnızca bir katman için geçerli olabilir, ancak tüm özellikler için ortaktır.
Nathan Hughes

@NathanHughes Yetkilendirme buna iyi bir örnektir. Tüm yetkilendirme kodunu çapraz kesen bir mimariye yerleştirmek için uygulamamı yeniden düzenledim ve çok sayıda kodu temizlemek için harikalar yarattı. Alanı bir ev gibi görüyorum. İçeri girmek için anahtarınız varsa, orada istediğinizi yapabilirsiniz (sahip olduğunuz varsayılır). Ancak evdeki her kapıyı kilitleyip anahtar girişi talep edemezsiniz. Ya varsın ya da değilsin.
richard

"İşlem davranışı" birçok özellik için ortak olabilir, ancak bu, katmanları "çaprazlamadığı" için "çapraz kesme" olmayacaktır. Örneğin, günlük kaydı kesişen bir endişe kaynağıdır çünkü sunum katmanında, iş katmanında, veri katmanında vb. Oturum açmak isteyebilirim.
CodingYoshi

14

Kabul edilen cevaba ek olarak, kesişen bir kaygı için başka bir örnek vermek istiyorum: uzaklaşma. Diyelim ki ekosistemimdeki diğer bileşenleri sanki işliyorlarmış gibi yerel olarak çağırmak istiyorum. Belki bazı durumlarda yaparlar. Ama şimdi hizmetlerimi bir bulut veya küme içinde dağıtılmış olarak çalıştırmak istiyorum. Bir uygulama geliştiricisi olarak bu yönü neden önemsemeliyim? Bir özellik, kimi ve nasıl arayacağını, gerekirse iletilen verileri serileştirmeyi ve uzaktan arama yapmayı öğrenebilir. Her şey devam ediyor olsaydı, özellik sadece yerel aramayı iletirdi. Aranan uç tarafında, özellik verinin serisini kaldırır, yerel aramayı yapar ve sonucu döndürür.

Şimdi size günlük çıktısı gibi "önemsiz" şeyler hakkında küçük bir hikaye anlatayım: Sadece birkaç hafta önce bir müşteri için karmaşık, ancak çok büyük olmayan bir kod tabanını (yaklaşık 250 bin kod satırı) yeniden düzenledim. Birkaç yüz sınıfta bir tür günlüğe kaydetme çerçevesi kullanıldı, diğer birkaç yüz sınıfta. Sonra birkaç bin satır vardıSystem.out.println(*)gerçekten log çıktısı olması gereken yerde. Böylece, kod tabanına dağılmış binlerce satırlık kodu düzelttim. Neyse ki, tüm eylemi hızlandırmak için IntelliJ IDEA'da (yapısal arama ve değiştirme) bazı akıllı hileler kullanabilirim, ama oğlum bunun önemsiz olduğunu düşünmüyor musun! Elbette, büyük ölçüde içeriğe bağlı hata ayıklama günlüğü her zaman bir yöntem gövdesi içinde gerçekleşir, ancak yöntem çağrılarını izleme (güzel bir şekilde girintili çıktıyla hiyerarşik olarak bile), hem işlenmiş hem de işlenmemiş istisnaları günlüğe kaydetme, kullanıcı denetimi (çağrıları günlüğe kaydetme) gibi birçok önemli günlüğe kaydetme türü kullanıcı rollerine dayalı kısıtlı yöntemler) ve benzerleri, kaynak kodunu kirletmeden çeşitli açılardan kolayca uygulanabilir. Günlük uygulama geliştiricisinin bunu düşünmesi veya kod tabanına dağılmış olan kaydedici çağrılarını görmesi gerekmez.

Diğer kesişen endişeler için benzer açıklamalar getirebilirim. Kodu temiz tutmak ve IMO'yu dağıtmaktan ve karıştırmaktan uzak tutmak, isteğe bağlı bir şey değil, profesyonellik meselesidir. Son olarak, kodun okunabilir, bakımı yapılabilir ve yeniden düzenlenebilir olmasını sağlar. Amin.


0

Kesişen Endişeler, uygulamanın türüne bakılmaksızın her zaman mevcut olması gereken senaryolardır.

Örneğin, Günlük Kaydı, Güvenlik, Performans Profili Oluşturma, Yerelleştirme, Erişilebilirlik, İşlem vb. Yazılımdan bağımsız olarak, günlük kaydı oluşturmamız gerekir (aksi takdirde, bazılarının hata ayıklaması veya üretim verilerinden bazı ilgili bilgileri nasıl alacağı). Yalnızca gerçek kullanıcının doğru ayrıcalıklarla uygulamaya girebildiği durumlarda güvenlik (kimlik doğrulama / yetkilendirme vb.) Gereklidir. Uygulamanızın nasıl performans gösterdiğini bilmemiz ve ardından profilleme yapmamız gerekir. Uygulamanın uluslararası kullanıcılar tarafından kullanılması durumunda (kendi yerelleştirilmiş dilleri ile), uygulamada aynı şeyi desteklememiz gerekir. Erişilebilirlik, engelli kişilerin uygulamamızı kullanması için kullanılabilirlik durumlarıdır.

Şimdi uygulamamızın masaüstü, web tabanlı vb. Olmasına bakılmaksızın, son kullanıcılar tarafından üretim ortamında coğrafyada kullanılması gerekiyorsa, çapraz kesimlere ihtiyaç vardır. Şimdiye kadar hangi uygulama vb. Hakkında hiçbir şey söylemedim, ancak üretim ortamında son kullanıcılara yayınlamadan önce ele alınması gereken endişelerin listesini verdim. ve bu tamamen kesişen endişelerle ilgilidir (bu, tüm uygulamalar / yöntemler / sınıflar tarafından, yani çeşitli düzeylerde ele alınması gerekir)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.