Döngüsel bağımlılık - Circular dependency

İçinde yazılım Mühendisliği, bir döngüsel bağımlılık düzgün çalışması için doğrudan veya dolaylı olarak birbirine bağlı olan iki veya daha fazla modül arasındaki bir ilişkidir. Bu tür modüller ayrıca karşılıklı yinelemeli.

Genel Bakış

Döngüsel bağımlılıklar birçok durumda doğaldır etki alanı modelleri aynı etki alanındaki belirli nesnelerin birbirine bağlı olduğu yerlerde.[1] Ancak yazılım Tasarımı, daha büyük yazılım modülleri arasındaki döngüsel bağımlılıklar bir desen karşıtı olumsuz etkilerinden dolayı.[1] Bu tür döngüsel (veya döngüsel) bağımlılıkların gerçek dünya yazılımlarının kaynak dosyaları arasında yaygın olduğu görülmüştür.[2] Karşılıklı özyinelemeli modüller, ancak, biraz yaygındır fonksiyonel programlama, tümevarımlı ve yinelemeli tanımların sıklıkla teşvik edildiği yerlerde.

Problemler

Döngüsel bağımlılıklar, yazılım programlarında birçok istenmeyen etkiye neden olabilir. Yazılım tasarımı açısından en sorunlu, sıkı bağlantı tek bir modülün ayrı ayrı yeniden kullanımını azaltan veya imkansız kılan karşılıklı bağımlı modüllerin

Döngüsel bağımlılıklar bir Domino etkisi bir modüldeki küçük bir yerel değişiklik diğer modüllere yayıldığında ve istenmeyen genel etkilere sahip olduğunda (program hataları, derleme hataları). Döngüsel bağımlılıklar ayrıca sonsuz özyinelemelere veya diğer beklenmedik hatalara neden olabilir.

Döngüsel bağımlılıklar da neden olabilir bellek sızıntıları bazı çok ilkel otomatik çöp toplayıcıları (kullananlar referans sayma ) kullanılmayan nesnelerin serbest bırakılmasından.

Sebepler ve çözümler

Çok büyük yazılım tasarımlarında, yazılım mühendisleri bağlamı kaybedebilir ve yanlışlıkla döngüsel bağımlılıklar ortaya çıkarabilir. Yazılımları analiz etmek ve istenmeyen döngüsel bağımlılıkları bulmak için araçlar vardır.[3]

Döngüsel bağımlılıklar uygulanırken tanıtılabilir geri çağırmak işlevsellik. Bu, uygulayarak önlenebilir tasarım desenleri gibi gözlemci deseni.

C ++ Örneği

C / C ++ 'da döngüsel bağımlılıkların uygulanması biraz zor olabilir, çünkü herhangi bir yapı veya sınıf tanımının aynı dosyadaki kullanımının üzerine yerleştirilmesi gerekir. Sınıflar arasında döngüsel bir bağımlılık Bir ve B bu nedenle her ikisi de tanımını gerektirecek Bir üstüne yerleştirilmek Bve tanımı B üstüne yerleştirilmek Bir, tabii ki imkansızdır. Bir ileriye dönük beyan bu nedenle bunu başarmak için gereklidir.

Aşağıdaki örnek, bunun nasıl yapıldığını göstermektedir.

  • Dosya Ah:
#ifndef A_H#define A_Hsınıf B;	// ileri bildirimsınıf Bir {halka açık:	B* b;};#endif //AH
  • Dosya b.h:
#ifndef B_H#define B_H sınıf Bir;	// ileri bildirimsınıf B {halka açık:	Bir* a;};#endif // B_H
  • Dosya main.cpp:
#Dahil etmek "Ah"#Dahil etmek "b.h" int ana() {	Bir a;	B b;	a.b = &b;	b.a = &a;}

Bir isim olmasına rağmen (ör. Bir) olabilir beyan ileriye dönük bildirimlerde olduğu gibi birden çok kez, yalnızca tanımlı bir kere Tek Tanım Kuralı ).

Kendi kendine referans örneği

Aşağıda, uygulama, çalışma zamanı sırasında kendisinden nesneler ekleyip çıkarabilen kendi kendini sürdüren bir nesne dizisine ihtiyaç duyuyorsa yararlı olabilecek başka bir ileri bildirim örneğidir:

  • Dosya Ah:
sınıf Bir {halka açık:    statik Bir *ilk, *son;    Bir *önceki, *Sonraki;    Bir();    ~Bir();};

statik değişkenler ilk ve son tanımlanmalıdır, çünkü bildirimleri onlar için bellek alanı ayırmaz. Not: Statik değişkenler nesneden nesneye değişmez ve bu sınıf için aynı kalır.

Ayrıca 0 veya NULL olarak başlatılmaları gerekir, böylece ne ile başlayacaklarını biliyoruz.

  • Dosya a.cpp:
#Dahil etmek "Ah"Bir *Bir::ilk=0, *Bir::son=0; // buraya statik kelimesini koymayın, bu bir hataya neden olurBir::Bir() {    Eğer (ilk == 0) ilk=bu; // ilk A oluşturuldu    önceki = son;    Eğer (önceki != 0) önceki->Sonraki = bu;    son = bu;    Sonraki = 0;}Bir::~Bir() {    Eğer (önceki != 0) önceki->Sonraki = Sonraki;    Eğer (Sonraki != 0) Sonraki->önceki = önceki;}

Ayrıca bakınız

Referanslar

  1. ^ a b Lakos, John (1996-07-20). Büyük Ölçekli C ++ Yazılım Tasarımı (1. baskı). Boston: Addison-Wesley. ISBN  9780201633627.
  2. ^ Melton, Hayden; Tempero, Ewan (2007-01-12). "Java'daki sınıflar arasındaki döngülerin deneysel bir çalışması". Ampirik Yazılım Mühendisliği. 12 (4): 389–415. CiteSeerX  10.1.1.141.5362. doi:10.1007 / s10664-006-9033-1. ISSN  1382-3256.
  3. ^ JDepend için Java

Dış bağlantılar