2011-01-25 18 views
8
Arabulucu desen aşina olanlar için

almadan Delphi Arabulucu desen uygulamak, ancak Delphi derleyici dairesel başvurular işleyemez gereklidir.<p></p> Ben Delphi Arabulucu desen uygulamak istiyorum ... dairesel referanslar

'Tasarım Kalıpları' orijinal GOF diyagramı bakıldığında, Aracı her çalışan bir referans vardır, ama meslektaşı objelerin çoğu geri Arabulucu bir referans vardır.

çoğu dilde

Bu değil bir sorun, ama benim Delphi derleyici bana

this approach, arayüzleri kullanarak, herhangi bir kullanım olurdu 'olarak ... F2047 Dairesel birimi başvuru' veriyor? Ben

[çözümün Özeti]

Hemen kabul cevabı özetlemek Delphi 2010 kullanıyorum

(karmaşık gibi görünüyor): Dairesel başvurular izin dillerde, soyut Arabulucu sınıfı atlayabilirsiniz (GoF'un "Uygulama" bölümünde anlatıldığı gibi, sayfa 278). Eğer soyut Arabulucu sınıfında olmadan Delphi Arabulucu uygulamak tek yolu bir Birimi tüm Sınıfları sahip olmaktır.

Aksi takdirde, beton alt sınıfta ek olarak ekstra bir soyut Arabulucu temel sınıfını gerekir. Üç Birimleri için

Kişisel Kullanımları maddeleri şu şekilde görünecektir:

ConcreteColleage1 ConcreateColleague1
Arabulucu

yok dairesel başvurular (ya kullanmaz),
ConcreteMediator Arabulucu kullanır arabulucu kullanır!

cevap

5

görmüyorum. Eğer derslerinizi this diagram takip ederseniz, böyle bir şey yapılmamalıdır.

Delphi bu diyagram uygulamak için, gerçekten

  • bir Mediator arayüzü ya yazmak gerekecek (ve ConcreteMediator sınıfı bu arabirimini uygulayan) (
  • veya sanal yöntemlerle bir baz Mediator sınıf, ve ConcreteMediator sınıfınızın Mediator'dan türetilmesini sağlayın ve bu yöntemleri geçersiz kılın).
+0

GoF tarafından Tasarım Kalıpları kitabında açıklandığı gibi Aracı modeline başvuruyorum. Özellikle, sayfa 274'teki şema. 'AButton', 'aFontDialogDirector' için bir referansa sahiptir ve tersine, 'aFontDialogDirector', 'aButton' için bir referansa sahiptir. Yani Delphi'de, bu iki sınıfın aynı Birim içerisinde olması gerekir. – awmross

+0

Cevabınızı daha dikkatli okuduktan sonra, şimdi bunun doğru olduğunu görüyorum. Bir Birimde temel bir Mediator sınıfı oluşturmalı ve bunu başka bir Birimde sınıflandırmam gerekiyor. Eğer cevabınızı düzenlerseniz, aşağı çekimi bir vahiyle değiştirebilirim :-) – awmross

7

kullanma arayüzleri kesinlikle birimleri arasında bağımlılıkları azaltmak için yardımcı olabilir. Başka bir yaklaşım ise, sınıflar arasındaki etkileşim yöntemlerini tanımlayan ve daha sonra somut torunları ayrı birimlere yerleştiren soyut temel sınıflara sahip olmaktır.

Bkz: Delphi circulare başvuruları önlemek konusunda daha fazla bilgi için How to avoid circular unit reference?. dikkate almak

2

Diğer bir seçenek aynı birimde Arabulucu ve Meslektaşım yerleştirmektir. Birçok durumda, dairesel referanslardan kaçınmak için deyimsel Delphi yolu budur.

interfaces kullanılması genellikle sorunu bu tür için iyi bir yaklaşımdır ama bazen hiçbir gerçek kazanç için ekstra karmaşıklık neden olabilir.

Bir yaklaşım genel bir kural olarak diğerinden daha iyi olduğunu ifade etmek istemem bu yüzden ödünleşmeler kodunuz için düşecekti nerede olduğunu bilmek zor. Dairesel bağımlılıklar ortaya nerede

+0

5000 satırlık bir dosya ayırmaya çalıştığım için, sınıfları aynı birimde tutmak çok fazla yardımcı olmaz. Ancak diğer durumlarda bu olası bir çözüm olabilirdi. – awmross

+2

@awmross 5000 satırları ?! Bu hiçbir şey, en büyük 32.000 satır. Daha ciddi olarak, büyük dosyaları bölmek genellikle iyi bir fikirdir, ancak her zaman birbirleriyle yakından ilişkili olan şeyleri koruyarak işleri daha da kötüleştirdiği bir nokta vardır. Her neyse, eminim bunun farkındasınızdır. –

İlgili konular