Uyum ve kuplaj arasındaki fark nedir?
Bağlama ve uyum, iyi veya kötü yazılım tasarımına nasıl yol açabilir?
İkisi arasındaki farkı ve bunların genel kod kalitesi üzerindeki etkisini özetleyen bazı örnekler nelerdir?
Uyum ve kuplaj arasındaki fark nedir?
Bağlama ve uyum, iyi veya kötü yazılım tasarımına nasıl yol açabilir?
İkisi arasındaki farkı ve bunların genel kod kalitesi üzerindeki etkisini özetleyen bazı örnekler nelerdir?
Yanıtlar:
Uyum , sınıfın (veya modülün) neler yapabileceğini ifade eder. Düşük uyum, sınıfın çok çeşitli eylemler yaptığı anlamına gelir - geniş, ne yapması gerektiğine odaklanmamıştır. Yüksek uyum, sınıfın ne yapması gerektiğine, yani yalnızca sınıfın niyetiyle ilgili yöntemlere odaklandığı anlamına gelir.
Düşük Uyum Örneği:
-------------------
| Staff |
-------------------
| checkEmail() |
| sendEmail() |
| emailValidate() |
| PrintLetter() |
-------------------
Yüksek Uyum Örneği:
----------------------------
| Staff |
----------------------------
| -salary |
| -emailAddr |
----------------------------
| setSalary(newSalary) |
| getSalary() |
| setEmailAddr(newEmail) |
| getEmailAddr() |
----------------------------
İçin olduğu gibi bağlantı , bu iki sınıf / modüller birbirine doğru ne kadar ilgili ya da bağımlı belirtmektedir. Düşük çiftli sınıflar için, bir sınıfta önemli bir şeyi değiştirmek diğerini etkilememelidir. Yüksek bağlantı kodunuzu değiştirmeyi ve korumayı zorlaştıracaktır; sınıflar birbirine sıkı sıkıya bağlı olduğundan, bir değişiklik yapmak tüm sistemin yenilenmesini gerektirebilir.
İyi yazılım tasarımı yüksek kohezyona ve düşük bağlantıya sahiptir .
set
& get
Fonksiyonları "Çalışanlar" ortamla daha özeldir işlevsellik göstermek - yüksek özgüllük verdikleri örnek daha yüksek uyum.
Uyum , bir modül içindeki ilişkinin göstergesidir .
Bağlantı , modüller arasındaki ilişkilerin göstergesidir .
yapışma
Kavrama
Modüller içinde yüksek uyum ve modüller arasında düşük bağlantı genellikle OO programlama dillerinde yüksek kalite ile ilgili olarak kabul edilir.
Örneğin, her Java sınıfının içindeki kodun yüksek iç bütünlüğü olmalıdır, ancak diğer Java sınıflarındaki koda olabildiğince gevşek bağlanmış olmalıdır.
Meyer'ın Nesneye Yönelik Yazılım Yapısı (2. baskı) 3. Bölümü bu konuların güzel bir açıklamasıdır.
Uyum , bir yazılım öğesinin sorumluluklarının ne kadar ilgili ve odaklanmış olduğunun bir göstergesidir.
Kuplaj , bir yazılım elemanının diğer elemanlara ne kadar güçlü bağlandığını ifade eder.
Yazılım öğesi sınıf, paket, bileşen, alt sistem veya bir sistem olabilir. Ve sistemleri tasarlarken, Yüksek kohezyona sahip ve Düşük kuplajı destekleyen yazılım elemanlarına sahip olmanız önerilir .
Düşük kohezyon , bakımı, anlaşılması zor ve yeniden kullanılabilirliği azaltan monolitik sınıflarla sonuçlanır. Benzer şekilde Yüksek Kuplaj , sıkı sıkıya bağlı sınıflar ile sonuçlanır ve değişiklikler yerel değildir, değiştirilmesi zordur ve yeniden kullanımı azaltır.
ConnectionPool
Aşağıdaki gereksinimlere sahip tipik bir monitör tasarladığımız varsayımsal bir senaryo alabiliriz . Bunun gibi basit bir sınıf için çok fazla görünebileceğini unutmayın, ConnectionPool
ancak temel amaç sadece basit bir örnekle düşük birleşme ve yüksek uyumu göstermek ve yardımcı olması gerektiğini düşünüyorum.
Düşük uyum ile ConnectionPool
tüm bu işlevleri / sorumlulukları aşağıdaki gibi tek bir sınıfa zorla doldurarak bir sınıf tasarlayabiliriz . Bu tek sınıfın bağlantı yönetiminden, veritabanı ile etkileşimden ve bağlantı istatistiklerini korumaktan sorumlu olduğunu görebiliriz.
Yüksek uyum ile bu sorumluluğu sınıflara atayabilir ve daha sürdürülebilir ve tekrar kullanılabilir hale getirebiliriz.
Düşük bağlantıyı göstermek için ConnectionPool
yukarıdaki yüksek uyum diyagramıyla devam edeceğiz . Yukarıdaki şemaya yüksek uyumu desteklese de bakarsak, sınıfla ConnectionPool
sıkı sıkıya bağlıdır ConnectionStatistics
ve PersistentStore
onlarla doğrudan etkileşime girer. Kuplajı azaltmak yerine, bir ConnectionListener
arayüz ekleyebilir ve bu iki sınıfın arayüzü uygulamasına izin verebilir ve ConnectionPool
sınıfla kaydolmalarına izin verebiliriz . Ve ConnectionPool
bu dinleyiciler aracılığıyla yineleme yapacak ve bağlantı alma ve bırakma olaylarını bildirecek ve daha az eşleşmeye izin verecektir.
Not / Kelime veya Dikkat: Bu basit senaryo için aşırıya kaçma gibi görünebilir, ancak uygulamamızın bir işlemi tamamlamak için birden fazla üçüncü taraf hizmetiyle etkileşime girmesi gereken gerçek zamanlı bir senaryo hayal edersek: Kodumuzu doğrudan üçüncü taraf hizmetlerine bağlamak üçüncü taraf hizmetindeki herhangi bir değişikliğin kodumuzda birden çok yerde değişikliklere yol açabileceği anlamına gelir, bunun yerine Facade
bu birden çok hizmetle dahili olarak etkileşime girebilir ve hizmetlerde yapılan herhangi bir değişiklik Facade
üçüncü taraf için yerel olur ve üçüncü tarafla düşük bağlantıyı zorunlu kılar Hizmetler.
Artan kohezyon ve azalan kuplaj iyi yazılım tasarımına yol açar.
Uyum, işlevselliğinizi, ilgili verilerle özlü ve en yakın olacak şekilde bölümlere ayırırken, ayırma işlevi, işlevsel uygulamanın sistemin geri kalanından izole edilmesini sağlar.
Ayrıştırma , yazılımınızın diğer bölümlerini etkilemeden uygulamayı değiştirmenize olanak tanır.
Uyum , uygulamanın işlevselliğe daha spesifik olmasını ve aynı zamanda bakımının daha kolay olmasını sağlar.
Bağlanmayı azaltmanın ve uyumu artırmanın en etkili yöntemi arayüz ile tasarımdır .
Bu, temel işlevsel nesnelerin birbirlerini yalnızca uyguladıkları arabirim (ler) aracılığıyla 'bilmesi' gerektiğidir. Bir arayüzün uygulanması doğal bir sonuç olarak uyumu beraberinde getirir.
Bazı senaryolarda gerçekçi olmasa da, üzerinde çalışmak için bir tasarım hedefi olmalıdır.
Örnek (çok kabataslak):
public interface IStackoverFlowQuestion
void SetAnswered(IUserProfile user);
void VoteUp(IUserProfile user);
void VoteDown(IUserProfile user);
}
public class NormalQuestion implements IStackoverflowQuestion {
protected Integer vote_ = new Integer(0);
protected IUserProfile user_ = null;
protected IUserProfile answered_ = null;
public void VoteUp(IUserProfile user) {
vote_++;
// code to ... add to user profile
}
public void VoteDown(IUserProfile user) {
decrement and update profile
}
public SetAnswered(IUserProfile answer) {
answered_ = answer
// update u
}
}
public class CommunityWikiQuestion implements IStackoverflowQuestion {
public void VoteUp(IUserProfile user) { // do not update profile }
public void VoteDown(IUserProfile user) { // do not update profile }
public void SetAnswered(IUserProfile user) { // do not update profile }
}
Bazıları kod tabanınızda başka yerlerde nerede olduklarına bakılmaksızın soruları işleyen bir modül olabilir:
public class OtherModuleProcessor {
public void Process(List<IStackoverflowQuestion> questions) {
... process each question.
}
}
Uyumun en iyi açıklaması Bob Amca'nın Temiz Kodundan gelir:
Sınıfların az sayıda örnek değişkeni olmalıdır. Sınıf yöntemlerinin her biri bu değişkenlerden birini veya daha fazlasını değiştirmelidir. Genel olarak, bir yöntem ne kadar çok değişken yönetirse, bu yöntem sınıfına o kadar bağlı olur . Her bir değişkenin her bir yöntem tarafından kullanıldığı bir sınıf, maksimum düzeyde birleştiricidir.
Genel olarak, bu tür maksimum derecede uyumlu sınıflar oluşturmak ne tavsiye edilebilir ne de mümkün; diğer yandan, uyumun yüksek olmasını istiyoruz . Uyum yüksek olduğunda, sınıfın yöntem ve değişkenlerinin birbirine bağımlı olduğu ve mantıksal bir bütün olarak birbirine asıldığı anlamına gelir.
İşlevleri küçük tutma ve parametre listelerini kısa tutma stratejisi bazen bir yöntem alt kümesi tarafından kullanılan örnek değişkenlerin çoğalmasına neden olabilir. Bu olduğunda, neredeyse her zaman daha büyük sınıftan çıkmaya çalışan en az bir sınıf olduğu anlamına gelir. Değişkenleri ve yöntemleri yeni sınıfların daha uyumlu olması için iki veya daha fazla sınıfa ayırmaya çalışmalısınız.
basitçe Uyum , bir kod tabanının bir bölümünün mantıksal olarak tek bir atomik birimi oluşturma derecesini temsil eder. Diğer yandan, kuplaj , tek bir birimin diğerlerinden bağımsız olma derecesini temsil eder. Başka bir deyişle, iki veya daha fazla birim arasındaki bağlantı sayısıdır. Sayı ne kadar az olursa kaplin o kadar düşük olur.
Özünde, yüksek uyum, kod tabanının birbiriyle ilişkili kısımlarını tek bir yerde tutmak anlamına gelir. Düşük bağlantı, aynı zamanda, kod tabanının ilgisiz kısımlarını mümkün olduğunca ayırmakla ilgilidir.
Birleşme ve birleşme perspektifinden kod türleri:
İdeal , kılavuzu izleyen koddur. Gevşek bağlanmış ve yüksek oranda yapışkandır. Bu kodu bu resim ile gösterebiliriz:
Tanrı Nesnesi , yüksek uyum ve yüksek bağlantının getirilmesinin sonucudur. Bu bir anti-desendir ve temel olarak tüm işi bir kerede yapan tek bir kod parçasını temsil eder: kötü seçilmiş , farklı sınıflar veya modüller arasındaki sınırlar zayıf seçildiğinde gerçekleşir
Yıkıcı ayırma en ilginç olanıdır. Bazen bir programcı bir kod tabanını o kadar çok ayırmaya çalıştığında, kod odağını tamamen kaybeder:
burada daha fazlasını okuyun
Yazılım mühendisliğindeki uyum , belirli bir modülün öğelerinin bir arada olma derecesidir. Dolayısıyla, bir yazılım modülünün kaynak kodu tarafından ifade edilen her bir işlevsellik parçasının ne kadar güçlü ilişkili olduğunun bir ölçüsüdür.
Basit bir ifadeyle eşleştirme , bir bileşenin (bir sınıfın mutlaka zorunlu olmasa da, ne kadar hayal edilse de) bir diğerinin iç işleyişini ya da iç öğelerini ne kadar çok bilmesi, yani diğer bileşen hakkında ne kadar bilgiye sahip olduğudur.
Örnekler ve çizimlerle biraz daha ayrıntılı olarak okumak isterseniz, bu konuda bir blog yazısı yazdım . Sanırım sorularınızın çoğuna cevap veriyor.
uyum, tek bir sınıfın nasıl tasarlandığı ile ilgilidir. Uyum, bir sınıfın tek, iyi odaklanmış bir amaç ile tasarlandığından emin olmakla en yakından ilişkili Nesne Odaklı ilkedir. Bir sınıf ne kadar odaklanmışsa, o sınıfın bağlılığı da o kadar fazla olur. Yüksek kohezyonun avantajları, bu tür sınıfların sürdürülmesinin düşük kohezyonlu sınıflara göre çok daha kolay (ve daha az sıklıkta değiştirilmiş) olmasıdır. Yüksek kaynaşmanın bir diğer yararı da, iyi odaklanmış bir amaca sahip sınıfların diğer sınıflardan daha çok yeniden kullanılabilir olma eğilimindedir.
Yukarıdaki görüntüde, düşük uyumda, ortak olmayan birçok işin yürütülmesinden sadece bir sınıfın sorumlu olduğunu görebiliriz ki bu da yeniden kullanılabilirlik ve bakım şansını azaltır. Ancak yüksek uyumda, tüm işlerin belirli bir işi yürütmesi için ayrı bir sınıf vardır, bu da daha iyi kullanılabilirlik ve bakım sağlar.
Uyum (Uyum): Eş anlamı birlikte , hezyon hangi araçları sopa . Farklı maddelerin parçacıklarının birbirine yapışması sistemi.
Gerçek hayat için örnek: img Nezaket
Bütün parçaların toplamından daha büyük -Aristotle.
Kohezyon , sıralı bir ölçüm türüdür ve genellikle “yüksek kohezyon” veya “düşük kohezyon” olarak tanımlanır. Yüksek kohezyona sahip modüller tercih edilebilir, çünkü yüksek kohezyon, sağlamlık, güvenilirlik, tekrar kullanılabilirlik ve anlaşılabilirlik gibi çeşitli arzu edilen yazılım özellikleriyle ilişkilidir. Buna karşılık, düşük uyum, sürdürülmesi, test edilmesi, tekrar kullanılması ve hatta anlaşılması zor olan istenmeyen özelliklerle ilişkilidir. wiki
Kuplaj genellikle kohezyonla kontrast oluşturur . Düşük kuplaj genellikle yüksek kohezyon ile korelasyon gösterir veya bunun tersi de geçerlidir. Düşük bağlantı genellikle iyi yapılandırılmış bir bilgisayar sisteminin ve iyi bir tasarımın bir işaretidir ve yüksek uyumla birleştirildiğinde, yüksek okunabilirlik ve sürdürülebilirliğin genel hedeflerini destekler. wiki
Bence farklılıklar aşağıdaki gibi konulabilir:
Bu blog yazısında daha ayrıntılı olarak yazıyorum.
Uyum , bir modülün göreli işlevsel gücünün bir göstergesidir.
View Geleneksel görünüm:
bir modülün “tek görüşlülüğü”
ViewOO görünümü:
uyum, bir bileşenin veya sınıfın yalnızca birbiriyle ve sınıf veya bileşenin kendisiyle yakından ilişkili öznitelikleri ve işlemleri kapsadığı anlamına gelir
Ev Uyum seviyeleri
Functional
Layer
Communicational
Sequential
Procedural
Temporal
utility
Birleştirme , modüller arasındaki göreli bağımlılığın bir göstergesidir.
Kuplaj, modüller arasındaki arayüz karmaşıklığına, bir modüle giriş veya referansın yapıldığı noktaya ve arayüzden hangi verilerin geçtiğine bağlıdır.
Geleneksel Görünüm: Bir bileşenin diğer bileşenlere ve dış dünyaya bağlanma derecesi
OO görüşü: sınıfların birbirine bağlanma derecesinin nitel bir ölçüsü
Bağlantı seviyesi
Content
Common
Control
Stamp
Data
Out Rutin çağrı
UseTip kullanımı
CDahil veya içe aktarma
#Dış #
Kuplaj = iki modül arasındaki etkileşim / ilişki ... Uyum = bir modül içindeki iki eleman arasındaki etkileşim.
Bir yazılım birçok modülden oluşur. Modül elemanlardan oluşur. Bir modülün bir program olduğunu düşünün. Program içindeki bir işlev bir öğedir.
Çalışma zamanında, bir programın çıktısı başka bir program için girdi olarak kullanılır. Buna modül-modül etkileşimi veya iletişimi işlemek için süreç denir. Buna Kuplaj da denir.
Tek bir programda, bir fonksiyonun çıkışı başka bir fonksiyona geçirilir. Buna bir modül içindeki elemanların etkileşimi denir. Buna Uyum da denir.
Misal:
Eşleşme = 2 farklı ailede iletişim ... Uyum = bir aile içinde baba-anne-çocuk arasındaki iletişim.
Basitçe söylemek gerekirse, uyum bir sınıfın tek bir kavramı temsil etmesi gerektiği anlamına gelir.
Tüm sınıf özellikleri, sınıfın temsil ettiği kavramla ilgiliyse, sınıfın genel arabirimi uyumludur. Örneğin, CashRegister sınıfına sahip olmak yerine, CashRegister ve Coin özelliklerinin birbirine bağlı olması onu 2 sınıfa dönüştürür - CashRegister ve Coin sınıfı.
Olarak bağlantı bu sınıfının nesneleri kullanmaktadır olarak, bir sınıf bir bağlıdır.
Yüksek kuplajdaki sorun, yan etkiler yaratabilmesidir. Bir sınıftaki bir değişiklik diğer sınıfta beklenmeyen bir hataya neden olabilir ve tüm kodu kırabilir.
Genel olarak, yüksek kohezyon ve düşük kuplaj, yüksek kaliteli OOP olarak kabul edilir.
Vadeli uyum gerçekten de yazılım tasarımı ne anlama geldiğini için sezgisel biraz sayaç olduğunu.
Uyumun ortak anlamı, birbirine iyi yapışan, moleküler çekim gibi güçlü bağ ile karakterize edilen bir şeyin birleştirilmesidir. Bununla birlikte, yazılım tasarımında, ideal olarak sadece bir şey yapan bir sınıf için çabalamak anlamına gelir, bu nedenle çoklu alt modüller bile dahil değildir.
Belki de bu şekilde düşünebiliriz. Bir parça, tek parça olduğunda en fazla kaynağa sahiptir (sadece bir şey yapar ve daha fazla parçalanamaz). Yazılım tasarımında istenen budur. Uyum, "tek sorumluluk" veya "endişelerin ayrılması" için başka bir isimdir.
Eldeki kuplaj terimi oldukça sezgiseldir, yani bir modül çok fazla modüle bağlı olmadığında ve bağlandığı modüller kolayca değiştirilebilir, örneğin liskov ikame ilkesine uyun .
1. Tesadüfi 2. Mantıksal 3.Temporal 4.İşlemsel 5.İletişim 6. Sıralı 7.Fonksiyonel