SORU
24 EKİM 2008, Cuma


Nesne tabanlı Programlama vs boy Yönelimli Programlama

Dünyanın en geliştiriciler gibi burada ve yazılım sistemleri uzun yıllar nesne yönelimli programlama (OOP) teknikleri kullanarak geliştiriyorum. Boy-yönelimli programlama (H) geleneksel OOP tamamen veya doğrudan çözmez, problemleri gideren okuduğum zaman, duraklama ve sanırım bu yüzden, bu gerçek mi?

Birçok bilgi bu SOP paradigmanın anahtarları öğrenmek ve aynı yerde Sohbet etmeye okudum, daha iyi gerçek dünya Uygulama Geliştirme faydaları anlamak istedim.

Biri cevap var mı?

CEVAP
24 EKİM 2008, Cuma


"Vs" neden? Değil "vs". Nesne Yönelimli ile birlikte fonksiyonel programlama ile, ama aynı zamanda birlikte Boy Yönelimli programlama kullanabilirsiniz. Değil "vs", "Boy Yönelimli ProgramlamaileNesne Tabanlı Programlama".

Beni SOP için bir tür "meta-programlama". SOP yaptığı her şey de sadece daha fazla kod ekleyerek olmadan yapılabilir. SOP sadece bu kod yazma kaydeder.

Vikipedi meta-programlama bunun için en iyi örneklerden biri. Birçok grafik bir sınıf varsayalım "... ()" metodu. Her set yöntemi sonra, grafik veriler grafik değişti ve böylece grafik ekranda güncelleştirilmesi gerekmektedir böylece değişti. "Görüntüler.çağırmalısınız grafik çizilecek varsayıyorum() güncelleme". Klasik yaklaşım ekleyerek bunu çözmek içindaha fazla kod. Her set yöntemi sonunda yazıyorsun

void set...(...) {
    :
    :
    Display.update();
}

3-yöntemler kümesi varsa, bu bir sorun değildir. Eğer 200 olursa (farazi), bu her yerde eklemek için gerçekten acı verici oluyor. Ayrıca yeni bir set-yöntem eklediğinizde, sonuna bu eklemeyi unutmamak için emin olmanız gerekir, aksi takdirde sadece bir hata yarattı.

SOP kodu ton eklemeden bu sorunu çözer, yerine bir yönü ekleyin:

after() : set() {
   Display.update();
}

Ve işte bu! Güncelleme kodu kendiniz yazmak yerine, sadece bir gösteriden sonra sistem söyle() pointcut ulaşıldı, bu kodu çalıştırmak gerekir ve bu kod çalışacaktır. Hayır 200 yöntemleri, bir dizi yeni yöntemi bu kodu eklemeyi unutmayın emin olun gerek güncelleme gerek. Ayrıca sadece bir pointcut gerekir:

pointcut set() : execution(* set*(*) ) && this(MyGraphicsClass) && within(com.company.*);

Bu ne anlama geliyor? Bunun anlamı eğer bir yöntemdir "adlı set*" (* anlamına gelir, herhangi bir ad olabilir izleyin sonra set), ne olursa olsun, hangi yöntemi döndürür (ilk yıldız) veya hangi parametreleri alır (üçüncü yıldız)veMyGraphicsClass bir yöntemdirvebu sınıf paketi "com.parçasıdır.* şirket", o zaman bu bir dizi() pointcut. Ve ilk kodumuzu " diyorsonraset bir pointcut herhangi bir yöntem çalışan, aşağıdaki kodu çalıştırın".

Zarif bir şekilde sorun çözer. Aslında her şey burada anlatılan derleme zamanında yapılabilir. SOP basit sadece (Görüntü ekleme örn.kaynağınızı değiştirebilirsiniz() update set-pointcut her yöntem için sınıfın kendisi derlemeden önce bile.

Ancak, bu örnekte de VOP büyük dezavantajlarından biri gösterir. SOP aslında birçok programcı bir düşünün böyle bir şey yapıyor "Anti-Pattern". Tam desen denir "Action at a distance".

Bir mesafeden bir eylem. -desen anti bir durum olarak kabul hangi bir bölümünde davranış hata) bir programın çılgınca göre değişir zor ya da tanımlamak için imkansız bu başka bir operasyon program.

Bir proje için bir acemi olarak, sadece görüntü değil güncelleme gibi görünüyor, herhangi bir set-yöntem kodunu okumak ve kırık düşünün, olabilir. Bilmiyorumbakınsadece idam sonra, başka bir kod, bu yöntem bir dizi kod bakarak, "sihirli" güncelleme için yürütülecek ekran. Bu ciddi bir dezavantaj olarak görüyorum! Bir yöntem değişiklikleri yaparak, garip böcekleri tanıttı olabilir. Bazı şeyler düzgün çalışmıyor gibi görünüyor, ama bariz değil (dediğim gibi, onlar sadece büyülü bir şekilde... ... bir şekilde çalışmak) nerede daha fazla kod kod akışını anlamak, gerçekten zor.

Güncelleme

Sadece netleştirmek için: Bazı insanlar SOP kötü bir şey olduğunu söylüyorum izlenim olabilir ve kullanılmamalıdır. Söylemek istediğim bu değil! SOP aslında çok hoş bir özellik. Ben sadece "dikkatli". SOP sadece normal kod karıştırın ve servis operatörleri, sorunlara neden olurYönü. Yukarıdaki örnekte, grafik nesnesinin değerlerini güncellemek ve güncelleştirilmiş nesne resim Yönü var. Aslında tek bir yönüdür. Normal kod ve görünüş olarak diğer yarısı olarak yarısını kodlama sorunu ekler.

Eğer tamamen farklı bir açıdan SOP kullanırsanız, örneğin günlük, anti-desen sorun haline çalışacaktır. Bu durumda proje için bir acemi "tüm bu mesajları nereden geliyor diye düşünülebilir. Kodu herhangi bir günlük çıkış görmüyorum", ama büyük bir sorun değil. Program mantığı için yaptığı değişiklikler pek günlük tesis ve değişiklikler günlük tesisine yapılan pek program mantığı kıracak kıracak - bu yönleri tamamen ayrılır. Kullanarak projeler için oturum avantajı, bu programın kodunu tam olarak konsantre yapıyor ne yapmalıyım ve hala şansın var gelişmiş günlüğü " sahip olmadan kodunuzu olmak darmadağın ederek yüzlerce günlük mesajlar her yerde. Yeni bir kod giriliyor da, sihirli bir şekilde günlük mesajlarını doğru içerik ile doğru zamanda görünür. Acemi programcı değil anlamak neden vardır ya da geldikleri yerde, ama onlar günlük "doğru olanı" de "doğru zaman", o sadece mutlu kabul aslında onlar orada devam etmek için başka bir şey.

Benim örnekte SOP iyi bir kullanım durumunda herhangi bir değer kümesi yöntemi ile güncelleştirildi hep günlük olur. Bu anti-desen oluşturmak ve hemen hemen hiç herhangi bir sorun neden olmaz.

Denebilir, eğer kolayca SOP çok sorun yaratmak için suistimal varsa, bunu kullanmak kötü bir fikirdir. Ancak hangi teknoloji kötüye kullanılabilir mi? Veri saklama taciz, istismar miras. Hemen hemen her faydalı programlama teknolojisi kötüye kullanılabilir. Programlama dili sadece kötü olamaz özelliklerini içeren çok sınırlı düşünün; özellikler sadece onlar olarak kullanılabilir bir dil başlangıçta kullanılmak üzere tasarlanmıştır. Böyle bir dil varsa bile gerçek dünya programlama için kullanılabilir varsa tartışılabilir o kadar sınırlı olacaktır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • infiniTuts

    infiniTuts

    18 Ocak 2012
  • kremosakhaz

    kremosakhaz

    25 AĞUSTOS 2006
  • Sergio Fernandez

    Sergio Ferna

    1 EKİM 2009