Bazıları, arkadaş kullanarak işlerin kontrolden çıkabileceğini öne sürdü. Kabul ediyorum, ama bu onun yararlılığını azaltmaz. Arkadaşınızın OO paradigmasını tüm sınıf üyelerinizi herkese açık hale getirmekten daha fazla incittiğinden emin değilim. Elbette dil, tüm üyelerinizi herkese açık hale getirmenize izin verecektir, ancak bu tür tasarım desenlerinden kaçınan disiplinli bir programcıdır. Benzer şekilde, disiplinli bir programcı, arkadaşının mantıklı olduğu belirli durumlar için kullanımını ayıracaktır. Bazı durumlarda içsel açılımları çok fazla hissediyorum. Neden bir sınıf veya yöntemi derlemedeki her şeye maruz bırakalım?
Kendi temel sayfamı devralan bir ASP.NET sayfası var, bu da System.Web.UI.Page devralır. Bu sayfada, korumalı bir yöntemde uygulama için son kullanıcı hata bildirimini işleyen bazı kodlar var
ReportError("Uh Oh!");
Şimdi, sayfada bulunan bir kullanıcı denetimim var. Kullanıcı denetiminin sayfadaki hata raporlama yöntemlerini çağırabilmesini istiyorum.
MyBasePage bp = Page as MyBasePage;
bp.ReportError("Uh Oh");
ReportError yöntemi korunuyorsa bunu yapamazsınız. Dahili yapabilirim, ancak montajdaki herhangi bir koda maruz kalır. Sadece geçerli sayfanın bir parçası olan UI öğelerine (alt denetimler dahil) maruz kalmasını istiyorum. Daha spesifik olarak, temel kontrol sınıfımın aynı hata raporlama yöntemlerini tanımlamasını ve sadece temel sayfada yöntemleri çağırmasını istiyorum.
protected void ReportError(string str) {
MyBasePage bp = Page as MyBasePage;
bp.ReportError(str);
}
Arkadaş gibi bir şeyin dili daha az "OO" yapmadan, belki de nitelikler gibi yapmadan faydalı olabileceğini ve uygulanabileceğine inanıyorum, böylece sınıfların veya yöntemlerin belirli sınıflara veya yöntemlere arkadaş olabilmesi, geliştiricinin özel erişim. Belki de ... (sahte kod)
[Friend(B)]
class A {
AMethod() { }
[Friend(C)]
ACMethod() { }
}
class B {
BMethod() { A.AMethod() }
}
class C {
CMethod() { A.ACMethod() }
}
Benim önceki örneğimde belki aşağıdaki gibi bir şey var (biri anlambilim tartışabilir, ama ben sadece fikri karşılamaya çalışıyorum):
class BasePage {
[Friend(BaseControl.ReportError(string)]
protected void ReportError(string str) { }
}
class BaseControl {
protected void ReportError(string str) {
MyBasePage bp = Page as MyBasePage;
bp.ReportError(str);
}
}
Gördüğüm gibi, arkadaş kavramının bunun için bir şeyleri herkese açık hale getirmekten veya üyelere erişmek için genel yöntemler veya mülkler oluşturmaktan daha fazla riski yoktur. Herhangi bir arkadaş, verilerin erişilebilirliğinde başka bir ayrıntı düzeyine izin veriyorsa ve bu erişilebilirliği dahili veya genel olarak genişletmek yerine daraltmanıza izin veriyorsa.