Açıya yönelik programlama nedir?


231

Nesneye yönelik programlamayı anlıyorum ve uzun süredir OO programları yazıyorum. İnsanlar en boy yönelimli programlama hakkında konuşuyor gibi görünüyor, ama bunun ne olduğunu veya nasıl kullanılacağını hiç öğrenmedim. Temel paradigma nedir?

Bu soru ilgili, ancak tam olarak sormuyor:

En Boy Odaklı Programlama ve Nesne Odaklı Programlama


5
IMAO, soruda verilen bağlantı, burada kabul edilenden daha net ve kapsamlı bir cevaba sahiptir. Bu soruyu okuyan insanlar önce okuyabilir.
David Chen

Yanıtlar:


198

AOP , farklı yöntemlerle tekrarlanan ve normalde kendi modülüne kaydedilemeyen veya her zamanki gibi yeniden kodlanamayan her türlü kod olabilecek kesişen endişeler sorununu giderir . Böylece, AOP ile bu şeyleri ana kodun dışında bırakabilir ve dikey olarak tanımlayabilirsiniz:

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();
       }
    }
 }

Ve sonra kodu bu duruma derlemek için bir en-boylu dokumacı kullanılır:

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;
} 

14
Bunun için dil desteğine mi ihtiyacınız var? Örneğiniz hangi dilde?
Sophie

8
Bu sahte koddur, ancak en iyi bilinen örnek, kesme noktaları adı verilen benzer bir tekniği kullanan Java'nın AOP modifikasyonu olan AspectJ'dir.
Mark Cidade

71
Voodoo. Ve OOP'un aşırı dolu olduğunu düşündüm.
Aiden Bell

17
Mark, bu bir yöntemin giriş ve çıkış noktalarını süslemek gibi mi?
Filip Dupanović

3
@AidenBell Uzaktan görünmeyen eylem voodoo olarak kabul edilebilirse, o zaman evet, bu vudu. Moose metaprogamming altında, yöntem değiştiricileri daha önce, sonra, etrafında, iç, büyütme gibi tam olarak bunu yapar. Programın yürütme akışını gizler. Bunların izini sürmek neredeyse imkansız olabilir, özellikle de sistemin rol olarak adlandırdığı yönlerin versiyonundan türetildiklerinde . Tüm bunlarla şaşırtıcı karmaşıklık sistemleri oluşturulabilir.
tchrist

13

Ne yazık ki, normal orta büyüklükteki bir organizasyonda AOP'yi gerçekten kullanışlı hale getirmek şaşırtıcı derecede zor gibi görünüyor. (Editör desteği, kontrol duygusu, kod çürümesine yol açan çok önemli olmayan şeylerle başlamanız, insanların ailelerine evlerine gitmeleri vb.)

Umutlarımı kompozit odaklı programlamaya koyuyorum , daha gerçekçi bir şey olan . Birçok popüler fikre bağlanır ve size gerçekten harika bir şey verir.

Burada yaklaşan bir uygulamaya bakın: qi4j.org/

PS. Aslında, AOP ile gelen güzelliklerden birinin de aşil topuğu olduğunu düşünüyorum: Müdahaleci olmayan, insanların mümkünse görmezden gelmesine izin veren, bu nedenle çoğu organizasyonda ikincil bir endişe olarak değerlendirilecek.


8

Tamlık için bir kopyadan kopyalandı (Einstein):

Klasik örnekler güvenlik ve günlüğe kaydetmedir. X'in oluşumunu günlüğe kaydetmek veya güvenlik erişim kontrolü için z nesnesini kontrol etmek için uygulamanızda kod yazmak yerine, sistematik olarak güvenliği enjekte edebilen veya doğal olarak bunlara sahip olmayan rutinlere giriş yapabilen normal kodun "bant dışı" bir dil ihlali vardır. Böyle bir şekilde kodunuz bunu sağlamıyor olsa bile - halledilir.

Daha somut bir örnek, bir dosyaya erişim kontrolleri sağlayan işletim sistemidir. Bir yazılım programının erişim kısıtlamalarını kontrol etmesi gerekmez, çünkü temel sistem bu işe yarar.

Deneyimlerime göre AOP'ye ihtiyacınız olduğunu düşünüyorsanız, gerçekten iyi düşünülmüş yapısal / sistem tasarımına odaklanarak sisteminizdeki uygun meta veri yönetimine daha fazla zaman ve çaba harcamalısınız.


7

Spring in Action'dan kopyalandı

AOP genellikle bir yazılım sistemindeki endişelerin ayrılmasını destekleyen bir teknik olarak tanımlanır. Sistemler, her biri belirli bir işlevsellikten sorumlu olan birkaç bileşenden oluşur. Ancak çoğu zaman bu bileşenler temel işlevlerinin ötesinde ek sorumluluklar da taşırlar. Günlüğe kaydetme, işlem yönetimi ve güvenlik gibi sistem hizmetleri genellikle temel sorumlulukları başka bir şey olan bileşenlere girer. Bu sistem hizmetleri, genellikle bir sistemdeki birden çok bileşeni kesme eğiliminde olduklarından, kesişen konular olarak adlandırılır.


6

Tamlık için bir kopyadan kopyalandı (Buzzer):

.NET'teki sınıf ve yöntem öznitelikleri, en boy yönelimli programlama biçimidir. Sınıflarınızı / yöntemlerinizi niteliklerle süslersiniz. Sahne arkasında bu öznitelik belirli işlevleri gerçekleştiren sınıf / yöntem kodu ekler. Örneğin, serileştirilebilir bir sınıfı işaretlemek, depolama veya başka bir sisteme iletilmek üzere otomatik olarak serileştirilmesine izin verir. Diğer öznitelikler belirli özellikleri serileştirilemez olarak işaretleyebilir ve bunlar serileştirilmiş nesneden otomatik olarak çıkarılır. Diziselleştirme, sistemdeki diğer kodlar tarafından uygulanan ve "yapılandırma" özniteliği (dekorasyon) uygulayarak sınıfınıza uygulanan bir özelliktir.


5

AOP, günlüğe kaydetme, önbelleğe alma vb. Gibi uygulamanızın iş mantığıyla ilgili olmayan işlemleri gerçekleştirmek için kullanılabilir. Bu eylemler, uygulamanızın ayrı bir bölümüne yerleştirilebilir ve daha sonra uygulama boyunca yeniden kullanılabilir. Bunu başarmanın genellikle iki yolu vardır. Bir yöntemden önce / sonra bir önişlemci tarafından otomatik olarak kod enjekte etmek veya bir yöntem çağrısını kesen ve daha sonra bir yöntem çağrısından önce / sonra bir şeyler yürütmek için proxy sınıfları eklemek.

İşte .Net'te bir örnek. Proxy çağrılarını durdurmak ve kodu saif yöntem çağrılarından önce yürütmek için proxy sınıflarını kullanır.

AutoFac ve DynamicProxy kullanarak .NET Core ve C # 'da Unsur Odaklı Programlama (AOP)


4

Bir AOP örneği var, örnek olarak bahar AOP kullandı. Örneği anlamak oldukça kolaydır.

Bahar AOP (En Boy Odaklı programlama) çerçevesi, kesişen endişeleri yönleriyle modüle etmek için kullanılır. Basitçe söylemek gerekirse, örneğin, bir yöntem yürütüldüğünde, Spring AOP yürütme yöntemini ele geçirebilir ve yöntem yürütmeden önce veya sonra ekstra işlevsellik ekleyebilir.

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


Bilgi işlemde, en boy yönelimli programlama (AOP), kesişen endişelerin ayrılmasını sağlayarak modülerliği artırmayı amaçlayan bir programlama paradigmasıdır.
RF

3

AOP, birden fazla sınıra yayılan işlevsellik için uygulamanızı daha iyi modüle etmenin bir yoludur. AOP, bu özellikleri kapsamanın ve bu kesişen endişeleri (günlük kaydı, hata işleme, vb.) Uygulamanızın ana bileşenlerinden çıkararak Tek Sorumluluk'u izlemenin başka bir yoludur. Uygun şekilde kullanıldığında AOP, uygulamanızda zaman içinde daha yüksek düzeyde sürdürülebilirlik ve genişletilebilirlik sağlayabilir.

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.