En boy yönelimli programlama dışında kesişen kaygılar için hangi alternatifler var? [kapalı]


19

Açı yönelimli programlama, kesişen endişelerle başa çıkmayı vaat ediyor, ancak henüz tamamen satılmadım. Bu sorunla başa çıkmak için başka bir girişim var mı?


Ziyaretçi kalıbı şu anda AOP ile çözülen birçok durumla başa çıkabilir.
Steven Evers

@SnOrfus: Java için DJ kütüphanesi hakkında konuştuğum aşağıdaki yanıtı da görebilirsiniz: Ziyaretçi kalıbını kullanmanın dinamik bir yolu! Kontrol etmeye değer. (Aynı zamanda Yansıma ile kendi başınıza kullanabileceğiniz genel bir tekniktir.)
Macneil

Yanıtlar:


7

Mümkün olduğunda, kesişen endişeleri daha sonra bağımlılık enjeksiyonu yoluyla uygulama boyunca kullanılan ayrı modüllere kapsülleyebilirsiniz. Bu, çapraz kesim kaygısı uygulamasını kod boyunca kullanımından bir şekilde ayırmanızı sağlar.

Bu her zaman zarif bir şekilde çalışmaz. İnsanların sorunu AOP gibi şeylerle çözmeye çalışmasının nedeni budur.


6

Henüz keşfetmediğim diğer iki seçenek:

Monad ve Oklarla Fonksiyonel Programlama

FP'de, başka herhangi bir şey gibi kesişen bir endişeyi temsil edersiniz: bir işlev çağrısında geçirdiğiniz bir şey olarak. Bunu yapmak sıkıcı bir hal aldığından, geçilen ek bilgileri gizlemek için Monad'ları (veya belki Okları) kullanabilirsiniz.

En yaygın AOP örneği günlüğe kaydetmedir. Monads ile mesajların listesini tutan bir "Logger" monad'ı oluşturacaksınız. LoggerMonad aracılığıyla gerçekleştirdiğiniz tüm işlevler bir günlük mesajı yayınlayabilir. Arrows ile uygulamanın tüm veri akışını modellersiniz ve gerektiğinde modele bir günlük kaydı rutini uygularsınız. Bence. Oklar oldukça karmaşıktır.

Varlık / Bileşen Tabanlı Programlama

Bir oyun motoru için araştırdığım ve denediğim bir şey. OOP'deki gibi "nesneler" yerine, her şeyi bir tür bileşen üzerinde çalışan veri paketlerine ve bileşenlere ayırırsınız. Bileşenler, ilişkisel bir veritabanında olduğu gibi ortak kimlikler ile birlikte gruplandırılır ve bağlantılı bileşen grupları Varlıklardır. Böyle bir sisteme günlük eklemek için, hangi bileşenlerin içinden geçirildiğine bağlı olarak tetikleyicilere yeni bir günlük hizmeti eklersiniz.

Her iki yöntem de kesişen bir değişikliği çok kolay bir şekilde kolayca çalıştırmanıza izin verir, ancak her ikisi de üst düzey mimari modellerdir. Bu yüzden muhtemelen onları en baştan kullanmanız gerekir. Bileşen modeli teorik olarak mevcut bir OOP sistemi üzerinde çalışılabilir. Eğer diliniz yeterince güçlü olursa, monadlar da olabilir.


Monads ve Arrows hakkında konuşurken, aynı zamanda Functor'lardan da bahsetmelisiniz.
Waquo

3

Kesişen konularla ilgili sorunları çözmenin birkaç yolu vardır:

  • Daha İyi Tasarım Desenleri, Deyimler veya Soyutlama Mekanizmaları Kullanın : Modüler hale getirilse bile kod kesişebilir. Kodu korumak için, onu modüle edebilecek tasarım tekniğini kullanmak için yeniden düzenleme yapmanız gerekecektir. Bu tür yeniden düzenleme, farklı türde bir kesime neden olabilir, ancak umarım hangi kesimlerin kararlı olduğu ve değişmesi muhtemel değildir.

  • Daha Zengin Dil Özellikleri Geliştirin : Çapraz kesimin birçok tezahürü daha iyi soyutlama mekanizmalarıyla çözülebilir ve bazen yeni dil özellikleri gereklidir. Örneğin, işlevsel ve nesneye yönelik özellikler içeren daha gelişmiş diller, çoğu zaman gerekli olmadığı için çok fazla tasarım deseni kullanmazlar. Tasarım desenlerinin kendilerinin doğada çapraz kesişebileceğini unutmayın , çünkü birkaç farklı nesne ve sınıfın rollerini tanımlarlar. Java'da, daha yüksek çalışma zamanı maliyeti olsa da, yansıma genellikle bir özellik yerine kullanılabilir. Örneğin, yansıma kullanarak, sadece birkaç satır kodla yüzlerce sınıfın ziyaretçi kalıbını destekleyebilirsiniz. DJ kütüphanesiNortheastern, bunu yapan yansıtıcı bir çözümdür. Mixins , C ++ (Java değil) için kullanılabilen güçlü bir tekniktir ve size bir yön olarak aynı kullanım durumlarından bazılarını verebilir.

  • Daha İyi Takım Desteği Sağlayın : grepYeniden düzenleme işlemlerini kullanma ve gerçekleştirme gibi teknikler , çapraz kodlama ile ilgili sorunlarla başa çıkabilir. Örneğin, bir arabirimde bildirilen bir yöntemin adı program boyunca kesilebilir. (Buradaki teknik farklılığa dikkat edin: Bu, kesişen yöntemin uygulaması değil, yöntemin adıdır.) Bu genellikle Eclipse gibi bir IDE'de, tüm bunları değiştirmek için "yeniden adlandırmayı yeniden adlandır" ı kullanabileceğiniz bir sorun değildir. kodunuzda adı kullanan yerler. Bu şekilde, programlama ortamı sizin için yeterince etkileyici olduğunda dil özelliklerine ihtiyaç duyulmaz.

  • Etki Alanına Özgü Dilleri Kullan : AspectJ'den önce gelen ilk yön dilleri, etki alanına özgüdür ve işlev bileşimlerini verimli bir şekilde birleştirmek için iş parçacığı eşitleme veya veri akışı analizi gibi belirli sorunlara uygulanır. Bu diller deneyseldi, ancak aksi halde kesişen endişeleri modülerleştirmede oldukça başarılı görünüyordu.

  • Üretken Programlama Tekniklerini Kullanın : Meta seviyesine adım atmak, en boy yönelimli programlama için bir uygulama tekniği olarak düşünülebilir, ancak basit yönleri aşacak kadar büyük bir alandır. Üretken teknikler (bir programın başka bir program için kaynak kodu oluşturduğu yerlerde), etki alanına özgü dillerle de ilgilidir.

Tüm bunlar için bence AOP okumak uygun. AOP, AOP dili kullanmasanız bile kod anlayışınızı genişletmenize yardımcı olabilir.


2

Genel olarak, kodlayıcıları bildirici bir özelliğe, özellikle C # /. NET / Mono dünyasındaki Öznitelik sistemine sahip etiketleme .


Daha spesifik olabilir misiniz? Açıkladığınız şey bazı AOP sistemlerinin nasıl çalıştığıdır.
Steven Evers

2
Bu hemen hemen AOP.
Matt H

Tipik / klasik anlamda AOP, onu büyük ölçekte yapmak için bir destekleyici araç (IDE dokuma en-boylu) gerektirir. AOP, yalnızca birincil kaynak koddaki kod hakkında akıl yürütmeyi zorlaştırır. Programınız en boy zombiler tarafından sızdığında bileşenlerinizin davranışını tahmin etmek daha zordur. Nitelikler veya etiketler benzer işlevsellik sağlar, ancak kaynak kodunda açıkça temsil edilir.

Sorunumun tam olarak AOP yolunun çözdüğü sorunlarla ilgili olmadığını unutmayın. Tek endişem AOP ile kaynak kodumun programımın davranışını tahmin etmek için yeterli bir kaynak olmaması.

@mumtaz: Tüm bir ad alanına özellikler uygularken durumun nasıl olacağını görebiliyorum. AOP'nin diğer yöntemi: ilişkilendirme yöntemleri / özellikleri / vb. veçheleri ona uygulamak, tarif ettiğinizle aynıdır.
Steven Evers

2

AOP konusunda uzman değilim, ancak yıllar boyunca bunu okurken, Lisp tarafından sunulan metaprogramlamanın , özellikle de metaobject protokolü gibi parçaların her zaman daha zayıf bir formu gibi görünüyordu .

Sanırım bu sürpriz olmamalı: Gregor Kiczales AMOP'un yazarlarından biriydi ve daha sonra Java için AspectJ yazdı!

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.