Boyut odaklı programlama - Aspect-oriented programming - Wikipedia


İçinde bilgi işlem, bakış açısına yönelik programlama (AOP) bir programlama paradigması arttırmayı hedefleyen modülerlik izin vererek ayrılık Kesişen kaygılar. Bunu, mevcut koda ek davranış ekleyerek yapar (bir tavsiye ) olmadan kodun kendisini değiştirmek yerine, bunun yerine hangi kodun bir "nokta kesimi "özellik, örneğin" işlevin adı 'set ile başladığında tüm işlev çağrılarını günlüğe kaydet'". Bu, temelde olmayan davranışlara izin verir. iş mantığı (günlük kaydı gibi) bir programa kodu karıştırmadan eklenecek, işlevselliğin özü. AOP şunun için bir temel oluşturur: yön odaklı yazılım geliştirme.

AOP, kaygıların kaynak kodu düzeyinde modülerleştirilmesini destekleyen programlama yöntemlerini ve araçlarını içerirken, "bakış açısına yönelik yazılım geliştirme", bütün bir mühendislik disiplinini ifade eder.

Boyut odaklı programlama, program mantığını farklı parçalara ayırmayı gerektirir (sözde endişeleruyumlu işlevsellik alanları). Neredeyse tüm programlama paradigmaları belirli bir düzeyde gruplamayı destekler ve kapsülleme Bu endişeleri uygulamak, soyutlamak ve oluşturmak için kullanılabilecek soyutlamalar (örneğin, fonksiyonlar, prosedürler, modüller, sınıflar, yöntemler) sağlayarak endişelerin ayrı, bağımsız varlıklara ayrılması. Bazı endişeler, bir programdaki çoklu soyutlamaları "keser" ve bu uygulama biçimlerine meydan okur. Bu endişelere denir Kesişen kaygılar veya yatay endişeler.

Kerestecilik Günlüğe kaydetme stratejisi, sistemin her günlüğe kaydedilen bölümünü zorunlu olarak etkilediği için kesişen bir endişeyi örneklemektedir. Böylece kayıt çapraz kesimler günlüğe kaydedilen tüm sınıflar ve yöntemler.

Tüm AOP uygulamaları, her endişeyi tek bir yerde özetleyen bazı kesişen ifadelere sahiptir. Uygulamalar arasındaki fark, sağlanan yapıların gücü, güvenliği ve kullanılabilirliğinde yatmaktadır. Örneğin, tür güvenliği veya hata ayıklama için fazla destek olmadan sınırlı bir çapraz kesim biçimini ifade etme yöntemlerini belirten durdurucular. AspectJ bu tür bir dizi ifadeye sahiptir ve bunları özel bir sınıfta özetlemektedir. Görünüş. Örneğin, bir özellik, temel kodun (bir programın görünüşsüz kısmı) davranışını uygulayarak değiştirebilir. tavsiye (ek davranış) çeşitli birleşme noktaları (bir programdaki noktalar) bir nicelik veya sorguda belirtilen nokta kesimi (belirli bir birleştirme noktasının eşleşip eşleşmediğini algılar). Bir yön, üye veya üst öğe eklemek gibi diğer sınıflarda ikili uyumlu yapısal değişiklikler de yapabilir.

Tarih

AOP'nin birkaç doğrudan öncülü A1 ve A2 vardır:[1] yansıma ve meta nesne protokolleri, konu odaklı programlama, Kompozisyon Filtreleri ve Uyarlamalı Programlama.[2]

Gregor Kiczales ve şuradaki meslektaşlarım Xerox PARK açık AOP kavramını geliştirdi ve bunu, AspectJ Java için AOP uzantısı. IBM'in araştırma ekibi, bir dil tasarım yaklaşımı üzerinde bir araç yaklaşımı izledi ve 2001'de, Hiper / J ve Endişe Manipülasyon Ortamı, geniş kullanım görmemiş.

Bu makaledeki örnekler AspectJ kullanmaktadır.

Microsoft İşlem Sunucusu AOP'nin ilk büyük uygulaması olarak kabul edilir ve ardından Kurumsal JavaBeans.[3][4]

Motivasyon ve temel kavramlar

Tipik olarak bir yönü dağınık veya karışık kod olarak, anlaşılması ve sürdürülmesi zorlaşır. İşlevin (günlük kaydı gibi) kullanabileceği bir dizi ilgisiz işleve yayılmasıyla dağılmıştır. onun işlevi, muhtemelen tamamen ilgisiz sistemlerde, farklı kaynak dillerinde vb. Bu, günlüğe kaydetmeyi değiştirmek, etkilenen tüm modüllerin değiştirilmesini gerektirebilir. Yönler, yalnızca ifade edildikleri sistemlerin ana hat işlevi ile değil, aynı zamanda birbirleriyle de karışır. Bu, bir endişeyi değiştirmek, tüm karışık endişeleri anlamayı veya değişikliklerin etkisinin çıkarılabileceği bazı araçlara sahip olmayı gerektirir.

Örneğin, bir tutarı bir hesaptan diğerine aktarmak için kavramsal olarak çok basit bir yöntemi olan bir bankacılık uygulamasını düşünün:[5]

geçersiz Aktar(Hesap fromAcc, Hesap toAcc, int Miktar) atar İstisna {  Eğer (fromAcc.getBalance() < Miktar)      atmak yeni InsufficientFundsException();  fromAcc.Çekil(Miktar);  toAcc.Depozito(Miktar);}

Bununla birlikte, bu transfer yöntemi, konuşlandırılmış bir uygulamanın gerektireceği bazı hususları göz ardı eder: mevcut kullanıcının bu işlemi gerçekleştirme yetkisine sahip olduğunu doğrulamak için güvenlik kontrollerinden yoksundur; a veritabanı işlemi kazara veri kaybını önlemek için operasyonu özetlemelidir; teşhis için işlem sistem günlüğüne vb. kaydedilmelidir.

Tüm bu yeni endişeleri içeren bir sürüm, örnek olarak, bir şekilde şöyle görünebilir:

geçersiz Aktar(Hesap fromAcc, Hesap toAcc, int Miktar, Kullanıcı kullanıcı,    Ağaç kesicisi ağaç kesicisi, Veri tabanı veri tabanı) atar İstisna {  ağaç kesicisi.bilgi("Para aktarılıyor ...");    Eğer (!isUserAuthorised(kullanıcı, fromAcc)) {    ağaç kesicisi.bilgi("Kullanıcının izni yok.");    atmak yeni Yetkisiz Kullanıcı İstisnası();  }    Eğer (fromAcc.getBalance() < Miktar) {    ağaç kesicisi.bilgi("Yetersiz bakiye.");    atmak yeni InsufficientFundsException();  }  fromAcc.Çekil(Miktar);  toAcc.Depozito(Miktar);  veri tabanı.commitChanges();  // Atomik işlem.  ağaç kesicisi.bilgi("İşlem başarılı.");}

Bu örnekte, diğer ilgi alanları karışık temel işlevsellikle (bazen iş mantığı endişesi). İşlemler, güvenlik ve kayıt tutma, hepsi örnek teşkil eder Kesişen kaygılar.

Şimdi, uygulamanın güvenlik hususlarını aniden değiştirmemiz gerekirse (örneğin) ne olacağını düşünün. Programın mevcut sürümünde, güvenlikle ilgili işlemler görünür dağınık sayısız yöntemle ve böyle bir değişiklik büyük bir çaba gerektirecektir.

AOP, programcının, adı verilen bağımsız modüllerde kesişen endişeleri ifade etmesine izin vererek bu sorunu çözmeye çalışır. yönler. Yönler içerebilir tavsiye (programda belirtilen noktalara eklenen kod) ve türler arası bildirimler (diğer sınıflara yapısal elemanlar eklendi). Örneğin, bir güvenlik modülü, bir banka hesabına erişmeden önce güvenlik kontrolü gerçekleştiren bir tavsiye içerebilir. nokta kesimi zamanları tanımlar (birleşme noktaları ) Bir banka hesabına erişilebildiğinde ve danışma kurumundaki kod, güvenlik kontrolünün nasıl uygulandığını tanımlar. Bu şekilde, hem kontrol hem de yerler tek bir yerde tutulabilir. Ayrıca, iyi bir nokta daha sonraki program değişikliklerini öngörebilir, bu nedenle başka bir geliştirici banka hesabına erişmek için yeni bir yöntem oluşturursa, tavsiye yürütüldüğünde yeni yöntem için geçerli olacaktır.

Dolayısıyla, günlüğe kaydetmeyi bir açıdan uygulayan yukarıdaki örnek için:

Görünüş Ağaç kesicisi {  geçersiz Banka.Aktar(Hesap fromAcc, Hesap toAcc, int Miktar, Kullanıcı kullanıcı, Ağaç kesicisi ağaç kesicisi)  {    ağaç kesicisi.bilgi("Para aktarılıyor ...");  }  geçersiz Banka.getMoneyBack(Kullanıcı kullanıcı, int İşlem Kimliği, Ağaç kesicisi ağaç kesicisi)  {    ağaç kesicisi.bilgi("Kullanıcı parayı geri istedi.");  }  // Diğer kesişen kod.}

AOP, bir hata ayıklama aracı veya kullanıcı düzeyinde bir araç olarak düşünülebilir. İşlevi değiştiremediğiniz durumlar için tavsiye ayrılmalıdır (kullanıcı seviyesi)[6] veya üretim kodundaki işlevi değiştirmek istemiyorsanız (hata ayıklama).

Birleştirme noktası modelleri

Yön odaklı bir dilin tavsiye ile ilgili bileşeni, bir birleştirme noktası modelini (JPM) tanımlar. Bir JPM üç şeyi tanımlar:

  1. Tavsiye ne zaman işe yarayabilir. Bunlara denir birleşme noktaları çünkü çalışan bir programda ek davranışın yararlı bir şekilde birleştirilebileceği noktalardır. Bir birleştirme noktasının yararlı olması için sıradan bir programcı tarafından ele alınabilir ve anlaşılabilir olması gerekir. Ayrıca, bir yönün bu tür değişiklikler karşısında kararlı olması için, önemsiz program değişikliklerinde de kararlı olmalıdır. Birçok AOP uygulaması, birleştirme noktaları olarak yöntem uygulamalarını ve alan referanslarını destekler.
  2. Belirtmenin bir yolu (veya ölçmek) birleştirme noktaları denir nokta kesimleri. Nokta kesimleri, belirli bir birleşme noktasının eşleşip eşleşmediğini belirler. En kullanışlı nokta kesim dilleri, temel dil gibi bir sözdizimi kullanır (örneğin, AspectJ Java imzalarını kullanır) ve adlandırma ve kombinasyon yoluyla yeniden kullanıma izin verir.
  3. Bir birleşme noktasında çalıştırılacak kodu belirtmenin bir yolu. AspectJ bunu çağırır tavsiye ve birleştirme noktalarından önce, sonra ve çevresinde çalıştırabilir. Bazı uygulamalar, bir yöntemi başka bir sınıfta bir açıdan tanımlamak gibi şeyleri de destekler.

Birleşme noktası modelleri, açığa çıkan birleşme noktalarına, birleşme noktalarının nasıl belirlendiğine, birleştirme noktalarında izin verilen işlemlere ve ifade edilebilecek yapısal geliştirmelere göre karşılaştırılabilir.

AspectJ'nin birleşme noktası modeli

  • AspectJ'deki birleştirme noktaları, yöntem veya yapıcı çağrısı veya yürütme, bir sınıf veya nesnenin başlatılması, alan okuma ve yazma erişimi, istisna işleyicileri, vb.
  • Noktasal kesimler, ilkel nokta kesimi belirleyicileri (PCD'ler).

    "Türlenmiş" PCD'ler, belirli bir tür birleştirme noktasıyla eşleşir (örneğin, yöntem yürütme) ve Java benzeri bir imzayı girdi olarak alma eğilimindedir. Böyle bir nokta şuna benzer:

     yürütme (* set * (*))

    Yöntem adı "ile başlıyorsa, bu nokta kesimi bir yöntem yürütme birleştirme noktasıyla eşleşirAyarlamak"ve her türden tam olarak bir argüman vardır.

    "Dinamik" PCD'ler çalışma zamanı türlerini kontrol eder ve değişkenleri bağlar. Örneğin,

      bu nokta)

    Bu nokta, şu anda çalıştırılan nesne bir sınıf örneği olduğunda eşleşir Nokta. Bir sınıfın nitelenmemiş adının Java'nın normal tür araması yoluyla kullanılabileceğini unutmayın.

    "Kapsam" PCD'ler birleştirme noktasının sözcüksel kapsamını sınırlar. Örneğin:

     içinde (şirket. *)

    Bu nokta kesimi, içindeki herhangi bir türdeki herhangi bir birleştirme noktasıyla eşleşir. com.company paketi. * birçok şeyi tek bir imzayla eşleştirmek için kullanılabilen joker karakterlerin bir biçimidir.

    Noktalar yeniden kullanılmak üzere oluşturulabilir ve adlandırılabilir. Örneğin:

     nokta kesimi Ayarlamak() : icra(* Ayarlamak*(*) ) && bu(Nokta) && içinde(com.tr.şirket.*);
    Yöntem adı "ile başlıyorsa, bu nokta kesimi bir yöntem yürütme birleştirme noktasıyla eşleşirAyarlamak" ve bu türünün bir örneğidir Nokta içinde com.company paketi. Adı kullanılarak anılabilir "Ayarlamak()".
  • Tavsiye, bir birleştirme noktasında (nokta kesimiyle belirtilir) belirli bir kodda (bir yöntemdeki kod gibi belirtilir) çalıştırılacağını (öncesinde, sonrasında veya çevresinde) belirtir. AOP çalışma zamanı, nokta kesimi birleşme noktasıyla eşleştiğinde otomatik olarak Öneriyi çağırır. Örneğin: after (): set () {Display.update (); } Bu etkili bir şekilde belirtir: "eğer Ayarlamak() pointcut birleşme noktası ile eşleşir, kodu çalıştırın Display.update () birleştirme noktası tamamlandıktan sonra. "

Diğer potansiyel birleşme noktası modelleri

Başka tür JPM'ler de var. Tüm tavsiye dilleri JPM'lerine göre tanımlanabilir. Örneğin, varsayımsal bir görünüm dili UML şu JPM'ye sahip olabilir:

  • Birleşme noktalarının tümü model öğelerdir.
  • Nokta kesimleri, model öğelerini birleştiren bazı mantıksal ifadelerdir.
  • Bu noktalardaki etki araçları, eşleşen tüm birleşme noktalarının görselleştirilmesidir.

Türler arası bildirimler

Türler arası bildirimler modüllerin yapısını etkileyen kesişen endişeleri ifade etmenin bir yolunu sağlar. Ayrıca şöyle bilinir açık sınıflar ve uzatma yöntemleri Bu, programcıların, tipik olarak bir endişeyle ilgili tüm kodu bir yönden birleştirmek için, başka bir sınıfın üyelerini veya ebeveynlerini bir yerde beyan etmelerini sağlar. Örneğin, bir programcı bunun yerine ziyaretçileri kullanarak kesişen görüntü güncelleme endişesini uyguladıysa, ziyaretçi kalıbı AspectJ'de şöyle görünebilir:

  Görünüş DisplayUpdate {    geçersiz Nokta.kabul etmek(Ziyaretçi v) {      v.ziyaret etmek(bu);    }    // diğer kesişen kod ...  }

Bu kod parçacığı, kabul etmek yöntemi Nokta sınıf.

Herhangi bir yapısal eklemenin orijinal sınıfla uyumlu olması bir gerekliliktir, böylece AOP uygulaması tüm istemcileri her zaman kontrol etmeyi bekleyemezse, mevcut sınıftaki istemciler çalışmaya devam eder.

Uygulama

AOP programları, temel dillere ve ortamlara bağlı olarak diğer programları iki farklı şekilde etkileyebilir:

  1. orijinal dilde geçerli ve sıradan bir programdan nihai tercümana ayırt edilemeyen birleşik bir program üretilir
  2. nihai yorumlayıcı veya ortam, AOP özelliklerini anlamak ve uygulamak için güncellenir.

Ortamları değiştirmenin zorluğu, çoğu uygulamanın bir tür aracılığıyla uyumlu kombinasyon programları ürettiği anlamına gelir. program dönüşümü olarak bilinir dokuma. Bir açı dokumacı bakış açısına yönelik kodu okur ve entegre yönleriyle uygun nesne yönelimli kod üretir. Aynı AOP dili, çeşitli dokuma yöntemleriyle uygulanabilir, bu nedenle bir dilin anlambiliminin dokuma uygulaması açısından asla anlaşılmaması gerekir. Yalnızca bir uygulamanın hızı ve dağıtım kolaylığı, hangi kombinasyon yönteminin kullanıldığından etkilenir.

Sistemler, önişlemcileri kullanarak kaynak düzeyinde dokumayı uygulayabilir (C ++ orijinal olarak CFront ) program kaynak dosyalarına erişim gerektiren. Bununla birlikte, Java'nın iyi tanımlanmış ikili biçimi, bayt kodu dokumacılarının herhangi bir Java programıyla .class-dosya biçiminde çalışmasını sağlar. Bayt kodu örücüler, derleme işlemi sırasında veya örgü modeli sınıfa göre ise, sınıf yükleme sırasında konuşlandırılabilir. AspectJ 2001'de kaynak seviyesinde dokuma ile başladı, 2002'de sınıf başına bir bayt kodu dokumacı sundu ve entegrasyonundan sonra gelişmiş yükleme süresi desteği sundu. AspectWerkz 2005 yılında.

Programları çalışma zamanında birleştiren herhangi bir çözüm, programcının ayrılmış modelini korumak için onları uygun şekilde ayıran görünümler sağlamalıdır. Java'nın birden çok kaynak dosyası için bayt kodu desteği, herhangi bir hata ayıklayıcının bir kaynak düzenleyicide düzgün şekilde örülmüş bir .class dosyasında ilerlemesini sağlar. Bununla birlikte, bazı üçüncü taraf çözücüler, tüm desteklenen bayt kodu formları yerine Javac tarafından üretilen kodu bekledikleri için dokuma kodu işleyemezler (ayrıca bkz. § Eleştiri, altında).

Dağıtım zamanı dokuma başka bir yaklaşım sunar.[7] Bu temelde işlem sonrası anlamına gelir, ancak üretilen kodu yamamak yerine, bu dokuma yaklaşımı alt sınıflar mevcut sınıflar, böylece modifikasyonlar yöntemi geçersiz kılarak sunulur. Mevcut sınıflar, çalışma zamanında bile dokunulmadan kalır ve mevcut tüm araçlar (hata ayıklayıcılar, profil oluşturucular, vb.) Geliştirme sırasında kullanılabilir. Benzer bir yaklaşım, birçok uygulamanın uygulanmasında kendini zaten kanıtlamıştır. Java EE uygulama sunucuları, örneğin IBM 's WebSphere.

Terminoloji

Boyut odaklı programlamada kullanılan standart terminoloji şunları içerebilir:

Kesişen kaygılar
Bir OO modelindeki çoğu sınıf tek, belirli bir işlevi yerine getirecek olsa da, genellikle diğer sınıflarla ortak, ikincil gereksinimleri paylaşırlar. Örneğin, veri erişim katmanı içindeki sınıflara ve ayrıca bir iş parçacığı bir yönteme girdiğinde veya çıktığında UI katmanındaki sınıflara günlük kaydı eklemek isteyebiliriz. Diğer endişeler aşağıdaki gibi güvenlikle ilgili olabilir: giriş kontrolu [8] veya bilgi akışı kontrolü.[9] Her sınıfın çok farklı bir birincil işlevselliği olsa da, ikincil işlevi gerçekleştirmek için gereken kod genellikle aynıdır.
Tavsiye
Bu, mevcut modelinize uygulamak istediğiniz ek koddur. Örneğimizde bu, iş parçacığı bir yönteme her girdiğinde veya çıktığında uygulamak istediğimiz günlük kodudur.
Noktasal kesim
Bu, kesişen endişenin uygulanması gereken başvurudaki yürütme noktasına verilen terimdir. Örneğimizde, iş parçacığı bir yönteme girdiğinde bir noktaya ulaşılır ve iş parçacığı yöntemden çıktığında başka bir noktaya ulaşılır.
Görünüş
Nokta ve tavsiyenin birleşimi bir özellik olarak adlandırılır. Yukarıdaki örnekte, bir nokta kesimi tanımlayarak ve doğru tavsiyeyi vererek uygulamamıza bir günlük kaydı özelliği ekliyoruz.

Diğer programlama paradigmalarıyla karşılaştırma

Yönler ortaya çıktı nesne yönelimli programlama ve hesaplamalı yansıma. AOP dilleri benzer işlevlere sahiptir, ancak daha kısıtlıdır meta nesne protokolleri. Yönler, aşağıdaki gibi programlama kavramlarıyla yakından ilgilidir: konular, Mixins, ve delegasyon. Görünüm odaklı programlama paradigmalarını kullanmanın diğer yolları arasında Kompozisyon Filtreleri ve hiperslices yaklaşmak. En azından 1970'lerden beri, geliştiriciler, AOP için bazı uygulama yöntemlerine benzeyen durdurma ve gönderme-yama biçimlerini kullanıyorlar, ancak bunlar hiçbir zaman çapraz kesim özelliklerinin sağladığı anlamsallıklara tek bir yerde yazılmamıştı.[kaynak belirtilmeli ]

Tasarımcılar, kod ayrımını elde etmenin alternatif yollarını düşünmüşlerdir, örneğin C # kısmi türleri, ancak bu tür yaklaşımlar, tek bir bildirimsel deyimle kodun birkaç birleşme noktasına ulaşmaya izin veren bir niceleme mekanizmasından yoksundur.

Alakasız görünse de, testlerde taklitlerin veya taslakların kullanılması, tavsiye gibi AOP tekniklerinin kullanılmasını gerektirir. Burada işbirliği yapılan nesneler testin amacı içindir, kesişen bir endişe kaynağıdır. Böylece, çeşitli Mock Object çerçeveleri bu özellikleri sağlar. Örneğin, bir işlem bir bakiye tutarı almak için bir hizmeti çağırır. Miktarın nereden geldiğinin önemsiz olduğu süreç testinde sadece süreç bakiyeyi ihtiyaçlara göre kullanır.

Evlat edinme sorunları

Programcıların hataları önlemek için kodu okuyabilmesi ve neler olduğunu anlayabilmesi gerekir.[10]Doğru eğitimle bile, bir programın hem statik yapısını hem de dinamik akışını görselleştirmek için uygun destek olmadan kesişen endişeleri anlamak zor olabilir.[11] 2002'den başlayarak AspectJ, kesişen endişelerin görselleştirilmesini desteklemek için IDE eklentileri sağlamaya başladı. Bu özelliklerin yanı sıra en boy kodu yardımcı olur ve yeniden düzenleme artık yaygındır.

AOP'nin gücü göz önüne alındığında, bir programcı çapraz kesmeyi ifade etmede mantıksal bir hata yaparsa, yaygın program arızasına yol açabilir. Tersine, başka bir programcı bir programdaki birleşme noktalarını - örneğin, yöntemleri yeniden adlandırarak veya taşıyarak - görünüm yazarının beklemediği şekillerde değiştirebilir. Öngörülemeyen sonuçlar. Kesişen endişelerin modülerleştirilmesinin bir avantajı, bir programcının tüm sistemi kolayca etkilemesini sağlamaktır; sonuç olarak, bu tür sorunlar, belirli bir başarısızlık için iki veya daha fazla geliştirici arasında sorumluluk konusunda bir çatışma olarak ortaya çıkar. Bununla birlikte, bu sorunların çözümü, AOP'nin varlığında çok daha kolay olabilir, çünkü sadece yönün değiştirilmesi gerekir, oysa AOP'siz karşılık gelen sorunlar çok daha fazla yayılabilir.

Eleştiri

AOP'nin etkisinin en temel eleştirisi, kontrol akışının belirsiz olması ve bunun sadece çok kötü huylulardan daha kötü olmamasıdır. GİT ama aslında şakaya çok benziyor DAN GELİYORUM Beyan.[11] uygulamanın habersizliğiAOP'nin birçok tanımı için temel olan (söz konusu kodun, nokta kesiminde belirtilen bir tavsiyenin uygulanacağına dair bir göstergesi yoktur), açık bir yöntem çağrısının aksine tavsiyenin görünür olmadığı anlamına gelir.[11][12] Örneğin, COME FROM programını karşılaştırın:[11]

5GİRİŞX10YAZDIR"Sonuç:"15YAZDIRX20GELFROM1025X=X*X30DÖNÜŞ

benzer semantiğe sahip bir AOP parçası ile:

ana() {    giriş x    Yazdır(sonuç(x))}giriş sonuç(int x) { dönüş x }etrafında(int x): telefon etmek(sonuç(int)) && argümanlar(x) {    int temp = ilerlemek(x)    dönüş temp * temp}

Aslında, nokta kesimi çalışma zamanı koşullarına bağlı olabilir ve bu nedenle statik olarak belirleyici olmayabilir. Bu hafifletilebilir ancak statik analiz ve hangi tavsiyeleri gösteren IDE desteği ile çözülemez potansiyel olarak eşleşme.

Genel eleştiriler, AOP'nin "hem modülerliği hem de kod yapısını" iyileştirme iddiasında olduğu, ancak bazıları bunun yerine bu hedefleri baltaladığı ve "programların bağımsız gelişimini ve anlaşılabilirliğini" engellediği yönündedir.[13] Spesifik olarak, nokta kesimleri ile nicelleştirme modülerliği bozar: "genel olarak, görünüm odaklı bir programın dinamik olarak yürütülmesi hakkında akıl yürütmek için tüm program bilgisine sahip olunması gerekir."[14] Ayrıca, hedefleri (kesişen endişeleri modüler hale getirme) iyi anlaşılırken, gerçek tanımı net değildir ve diğer köklü tekniklerden açıkça ayırt edilememektedir.[13] Çapraz kesme, sıralama gibi bazı çözümleme mekanizmaları gerektiren potansiyel olarak birbirini kesen konularla ilgilidir.[13] Aslında, yönler kendi kendilerine uygulanabilir ve yalancı paradoksu.[15]

Teknik eleştiriler, nokta kesimlerinin nicelleştirilmesinin (tavsiyelerin nerede yürütüldüğünü tanımlayan) "programdaki değişikliklere son derece duyarlı" olduğunu içerir. kırılgan nokta kesimi problemi.[13] Nokta kesimleri ile ilgili problemler inatçı kabul edilir: eğer nokta kesimlerinin nicelleştirilmesi, açık ek açıklamalarla değiştirilirse, öznitelik odaklı programlama bunun yerine, bu sadece açık bir alt rutin çağrısıdır ve AOP'nin çözmek için tasarlandığı aynı saçılma problemini yaşar.[13]

Uygulamalar

Aşağıdaki Programlama dilleri dil içinde veya harici bir kitaplık olarak AOP'yi uygulamış olanlar:

Ayrıca bakınız

Notlar ve referanslar

  1. ^ Kiczales, G.; Lamping, J .; Mendhekar, A .; Maeda, C .; Lopes, C .; Loingtier, J. M .; Irwin, J. (1997). Boyut odaklı programlama (PDF). ECOOP '97. 11. Avrupa Nesne Tabanlı Programlama Konferansı Bildirileri. LNCS. 1241. s. 220–242. CiteSeerX  10.1.1.115.8660. doi:10.1007 / BFb0053381. ISBN  3-540-63089-9. Arşivlendi (PDF) 2016-01-12 tarihinde orjinalinden.
  2. ^ "Uyarlanabilir Nesne Yönelimli Programlama: Yayılma Modelleriyle Demeter Yaklaşımı" Karl Liebherr 1996 ISBN  0-534-94602-X esasen aynı şeyin iyi işlenmiş bir versiyonunu sunar (Lieberherr daha sonra bunu fark etti ve yaklaşımını yeniden çerçevelendirdi).
  3. ^ Don Kutusu; Chris Sells (4 Kasım 2002). Essential.NET: Ortak dil çalışma zamanı. Addison-Wesley Profesyonel. s.206. ISBN  978-0-201-73411-9. Alındı 4 Ekim 2011.
  4. ^ Roman, Ed; Sriganesh, Rima Patel; Brose Gerald (1 Ocak 2005). Kurumsal JavaBeans'ta Uzmanlaşma. John Wiley and Sons. s. 285. ISBN  978-0-7645-8492-3. Alındı 4 Ekim 2011.
  5. ^ Not: Bu makaledeki örnekler, yazınınkine benzeyen bir sözdiziminde görünür. Java dil.
  6. ^ "gnu.org". www.gnu.org. Arşivlendi 24 Aralık 2017'deki orjinalinden. Alındı 5 Mayıs 2018.
  7. ^ "Arşivlenmiş kopya" (PDF). Arşivlenen orijinal (PDF) 2005-10-08 tarihinde. Alındı 2005-06-19.CS1 Maint: başlık olarak arşivlenmiş kopya (bağlantı)
  8. ^ B. De Win, B. Vanhaute ve B. De Decker. "Yön odaklı programlama yoluyla güvenlik". İçinde Ağ ve Dağıtık Sistem Güvenliğindeki Gelişmeler (2002).
  9. ^ T. Pasquier, J. Bacon ve B. Shand. "FlowR: Ruby'de Bilgi Akışı Kontrolü için Boyut Odaklı Programlama". İçinde 13. uluslararası Modülerlik Konferansı ACM Bildirileri (Yöne Yönelik Yazılım Geliştirme) (2014).
  10. ^ Edsger Dijkstra, Yapılandırılmış Programlama Üzerine Notlar Arşivlendi 2006-10-12 Wayback Makinesi, sf. 1-2
  11. ^ a b c d Constantinides, Constantinos; Skotiniotis, Therapon; Störzer, Maximilian (Eylül 2004). AOP Zararlı Olarak Kabul Edilir (PDF). Yazılımda Yönler üzerine Avrupa Etkileşimli Çalıştayı (EIWAS). Berlin, Almanya. Arşivlendi (PDF) 23 Mart 2016 tarihinde orjinalinden. Alındı 5 Mayıs 2018.
  12. ^ C2: ComeFrom
  13. ^ a b c d e Steimann, F. (2006). "Görünüm odaklı programlamanın paradoksal başarısı". ACM SIGPLAN Bildirimleri. 41 (10): 481–497. CiteSeerX  10.1.1.457.2210. doi:10.1145/1167515.1167514., (slaytlar Arşivlendi 2016-03-04 at Wayback Makinesi,slaytlar 2 Arşivlendi 2015-09-23 de Wayback Makinesi, Öz Arşivlendi 2015-09-24 de Wayback Makinesi ), Friedrich Steimann, Gary T. Leavens, OOPSLA 2006
  14. ^ "Boyut Odaklı Programlar İçin Daha Modüler Akıl Yürütme". Arşivlendi 12 Ağustos 2015 tarihinde orjinalinden. Alındı 11 Ağustos 2015.
  15. ^ "AOP ve Yalancının Antinomisi" (PDF). fernuni-hagen.de. Arşivlendi (PDF) 9 Ağustos 2017'deki orjinalinden. Alındı 5 Mayıs 2018.
  16. ^ Sayısız:Sonradan Arşivlendi 2016-03-15 Wayback Makinesi, LOOM.NET Arşivlendi 2008-08-27 de Wayback Makinesi, Enterprise Library 3.0 İlke Enjeksiyon Uygulama Bloğu Arşivlendi 2007-01-19 Wayback Makinesi, AspectDNG Arşivlendi 2004-09-29 Wayback Makinesi, DinamikProxy Arşivlendi 2015-12-05 de Wayback Makinesi, Oluştur * Arşivlendi Wikiwix'te 2005-08-21, PostSharp Arşivlendi 2016-05-03 at Wayback Makinesi, Seasar.NET Arşivlendi 2006-07-25 Wayback Makinesi, DotSpect (.SPECT) Arşivlendi 2006-03-31 Wayback Makinesi, Spring.NET Arşivlendi 2006-04-02 de Wayback Makinesi (işlevselliğinin bir parçası olarak), Wicca ve Phx.Morph Arşivlendi 2006-12-07 de Wayback Makinesi, SetPoint Arşivlendi 2008-10-07 de Wayback Makinesi
  17. ^ "As3-commons-bytecode'a hoş geldiniz". as3commons.org. Arşivlendi 3 Ekim 2014 tarihinde orjinalinden. Alındı 5 Mayıs 2018.
  18. ^ "Ada2012 Gerekçesi" (PDF). adacore.com. Arşivlendi (PDF) 18 Nisan 2016'daki orjinalinden. Alındı 5 Mayıs 2018.
  19. ^ "İşlev Kancaları". autohotkey.com. Arşivlenen orijinal 17 Ocak 2013. Alındı 5 Mayıs 2018.
  20. ^ Birkaç: AspectC ++, FeatureC ++, AspectC Arşivlendi 2006-08-21 de Wayback Makinesi, AspeCt odaklı C Arşivlendi 2008-11-20 Wayback Makinesi, Aspicere
  21. ^ "Arnavut kaldırımı". vub.ac.be. Alındı 5 Mayıs 2018.[kalıcı ölü bağlantı ]
  22. ^ "AspectCocoa". neu.edu. Arşivlenen orijinal 26 Ekim 2007'de. Alındı 5 Mayıs 2018.
  23. ^ "ColdSpring Çerçevesi: Hoş Geldiniz". 5 Kasım 2005. 5 Kasım 2005 tarihinde orjinalinden arşivlendi.. Alındı 5 Mayıs 2018.CS1 bakimi: BOT: orijinal url durumu bilinmiyor (bağlantı)
  24. ^ "Daha Yakın Proje: AspectL". Arşivlendi 23 Şubat 2011 tarihli orjinalinden. Alındı 11 Ağustos 2015.
  25. ^ "infra - Delphi için Integrados Çerçeveleri - Google Proje Barındırma". Arşivlendi 9 Eylül 2015 tarihinde orjinalinden. Alındı 11 Ağustos 2015.
  26. ^ "meaop - MeSDK: MeObjects, MeRTTI, MeAOP - Delphi AOP (Yöne Dayalı Programlama), MeRemote, MeService ... - Google Proje Barındırma". Arşivlendi 10 Eylül 2015 tarihinde orjinalinden. Alındı 11 Ağustos 2015.
  27. ^ "Google Proje Barındırma". Arşivlendi 25 Aralık 2014 tarihinde orjinalinden. Alındı 11 Ağustos 2015.
  28. ^ "RemObjects Cirrus". codegear.com. Arşivlenen orijinal 23 Ocak 2012'de. Alındı 5 Mayıs 2018.
  29. ^ "Emacs Önerisi İşlevleri". gnu.org. Arşivlendi 24 Ekim 2011 tarihinde orjinalinden. Alındı 5 Mayıs 2018.
  30. ^ Monadlar kodunu değiştirmeden programın türünü değiştirerek program anlamının değiştirilmesine izin verin: De Meuter, Wolfgang (1997). "Monadlar AOP için teorik bir temel olarak". ECOOP'da Boyut Odaklı Programlama Uluslararası Çalıştayı. CiteSeerX  10.1.1.25.8262. Tabareau, Nicolas; Figueroa, Ismael; Tanter, Éric (Mart 2013). "Yönlerin Tipik Monadik Yerleştirilmesi". 12. Yıllık Uluslararası Boyut Odaklı Yazılım Geliştirme Konferansı Bildirileri: 171–184. doi:10.1145/2451436.2451457. ISBN  9781450317665. S2CID  27256161. Tip sınıfları bir türe eklenecek ek yeteneklere izin verin: Sulzmann, Martin; Wang, Meng (Mart 2007). "Tür sınıfları ile görünüm odaklı programlama". Boyut Odaklı Dillerin Temelleri Üzerine 6. Çalıştay Bildirileri: 65–74. doi:10.1145/1233833.1233842. ISBN  978-1595936615. S2CID  3253858..
  31. ^ Çok sayıda diğerleri: Sezar Arşivlendi 2008-12-19 Wayback Makinesi, Oluştur * Arşivlendi Wikiwix'te 2005-08-21, Dynaop Arşivlendi 2007-07-24 Wayback Makinesi, JAC Arşivlendi 2004-06-19 Wayback Makinesi, Google Guice (işlevselliğinin bir parçası olarak), Javassist Arşivlendi 2004-09-01 de Wayback Makinesi, JAsCo (ve AWED) Arşivlendi 2005-04-11 Wayback Makinesi, JAML Arşivlendi 2005-04-15 Wayback Makinesi, JBoss AOP Arşivlendi 2006-10-17 Wayback Makinesi, LogicAJ Arşivlendi 2006-05-04 de Wayback Makinesi, Nesne Takımları Arşivlendi 2005-08-31 Wayback Makinesi, NESİR Arşivlendi 2007-01-24 de Wayback Makinesi, AspectJ (abc) için AspectBench Derleyicisi Arşivlendi 2014-12-16 Wayback Makinesi, Bahar çerçevesi (işlevselliğinin bir parçası olarak), Seasar, JMangler Projesi Arşivlendi 2005-10-28 Wayback Makinesi, Enjekte J Arşivlendi 2005-04-05 Wayback Makinesi, GluonJ Arşivlendi 2007-02-06'da Wayback Makinesi, Steamloom Arşivlendi 2007-08-18 Wayback Makinesi
  32. ^ Birçok: Uygun Arşivlendi 2008-07-04 de Wayback Makinesi, Ajaxpect Arşivlendi 2016-07-09 at Wayback Makinesi, jQuery AOP Eklentisi Arşivlendi 2008-01-13 Wayback Makinesi, Yönler Arşivlendi Wikiwix'te 2006-05-08, AspectJS Arşivlendi 2008-12-16 Wayback Makinesi, Cerny.js Arşivlendi 2007-06-27 de Wayback Makinesi, Dojo Araç Seti Arşivlendi 2006-02-21 de Wayback Makinesi, Humax Web Çerçevesi Arşivlendi 2008-12-09'da Wayback Makinesi, Joose Arşivlendi 2015-03-18 de Wayback Makinesi, Prototip - Prototip İşlevi # wrap Arşivlendi 2009-05-05 de Wayback Makinesi, YUI 3 (Y.Do) Arşivlendi 2011-01-25 de Wayback Makinesi
  33. ^ Kategoriler için yerleşik desteği kullanma (görünüm kodunun kapsüllenmesine izin verir) ve olay odaklı programlama ( önce ve sonra Etkinlik işleyiciler).
  34. ^ "AspectLua". Arşivlendi 17 Temmuz 2015 tarihinde orjinalinden. Alındı 11 Ağustos 2015.
  35. ^ "MAKAO, re (verse) -engineering build systems". Arşivlenen orijinal 24 Temmuz 2012 tarihinde. Alındı 11 Ağustos 2015.
  36. ^ "McLab". Arşivlendi 24 Eylül 2015 tarihinde orjinalinden. Alındı 11 Ağustos 2015.
  37. ^ "AspectML - Görünüşe yönelik İşlevsel Programlama Dili Araştırması". Arşivlendi 5 Aralık 2010'daki orjinalinden. Alındı 11 Ağustos 2015.
  38. ^ Adam Kennedy. "Görünüm - Perl için Görünüşe Dayalı Programlama (AOP) - metacpan.org". Arşivlendi 31 Ağustos 2013 tarihinde orjinalinden. Alındı 11 Ağustos 2015.
  39. ^ Birkaç: PHP-AOP (AOP.io) Arşivlendi Wikiwix'te 2014-08-18, Git! AOP çerçevesi Arşivlendi 2013-03-01 de Wayback Makinesi, PHPaspect Arşivlendi 2016-08-22 de Wayback Makinesi, Seasar.PHP Arşivlendi 2005-12-26 Wayback Makinesi, PHP-AOP, Akış Arşivlendi 2018-01-04 de Wayback Makinesi, AOP PECL Uzantısı Arşivlendi 2017-04-11 de Wayback Makinesi
  40. ^ "bigzaphod.org yakında geliyor". www.bigzaphod.org. Arşivlendi 20 Nisan 2016'daki orjinalinden. Alındı 5 Mayıs 2018.
  41. ^ Birkaç: ZİRVE Arşivlendi 2005-04-09 Wayback Makinesi, Aspyct AOP, Hafif Python AOP Arşivlendi 2004-10-09 Wayback Makinesi, Logilab'ın en boy modülü Arşivlendi 2005-03-09 Wayback Makinesi, Pythius Arşivlendi 2005-04-08 de Wayback Makinesi, Spring Python'un AOP modülü Arşivlendi 2016-03-04 at Wayback Makinesi, Pytilities'in AOP modülü Arşivlendi 2011-08-25 de Wayback Makinesi, boylib Arşivlendi 2014-11-05 at Wayback Makinesi
  42. ^ "PLaneT Paket Deposu: PLaneT> dutchyn> Subjectscheme.plt". Arşivlendi 5 Eylül 2015 tarihinde orjinalinden. Alındı 11 Ağustos 2015.
  43. ^ "AspectR - Ruby'de basit görünüm odaklı programlama". Arşivlendi 12 Ağustos 2015 tarihinde orjinalinden. Alındı 11 Ağustos 2015.
  44. ^ Dean Wampler. "Ev". Arşivlenen orijinal 26 Ekim 2007'de. Alındı 11 Ağustos 2015.
  45. ^ "gcao / aspector". GitHub. Arşivlendi 4 Ocak 2015 tarihinde orjinalinden. Alındı 11 Ağustos 2015.
  46. ^ "Boyutlar". tu-ilmenau.de. Arşivlenen orijinal 6 Ocak 2006. Alındı 5 Mayıs 2018.
  47. ^ "MetaclassTalk: Smalltalk'ta Yansıma ve Meta Programlama". Arşivlenen orijinal 29 Temmuz 2015 tarihinde. Alındı 11 Ağustos 2015.
  48. ^ "WEAVR". iit.edu. Arşivlendi 12 Aralık 2008'deki orjinalinden. Alındı 5 Mayıs 2018.
  49. ^ "en-boyxml - Görünüşe Dayalı XML Dokuma Motoru (AXLE) - Google Proje Barındırma". Arşivlendi 12 Eylül 2015 tarihinde orjinalinden. Alındı 11 Ağustos 2015.

daha fazla okuma

Dış bağlantılar