ISS ile ilgili makaleleri okurken, ISS'nin birbiriyle çelişen iki tanımı var gibi görünüyor:
İlk tanıma göre (bkz. 1 , 2 , 3 ), ISS, arabirimi uygulayan sınıfların ihtiyaç duymadıkları işlevleri uygulamaya zorlanmaması gerektiğini belirtir. Böylece, yağ arayüzüIFat
interface IFat
{
void A();
void B();
void C();
void D();
}
class MyClass: IFat
{ ... }
daha küçük arayüzlere bölünmeli ISmall_1veISmall_2
interface ISmall_1
{
void A();
void B();
}
interface ISmall_2
{
void C();
void D();
}
class MyClass:ISmall_2
{ ... }
Bu yolla beri benim MyClasstek yöntemlerini ihtiyacı (uygulamak mümkün olan D()ve C()aynı zamanda kukla uygulamaları sağlamak zorunda olmadan,) A(), B()ve C():
Ancak ikinci tanıma göre (bkz. 1 , 2 , Nazar Merza'nın cevabı ), ISS MyClientçağırma yöntemlerinin ihtiyaç duymadığı MyServiceyöntemlerin farkında MyServiceolmaması gerektiğini belirtir. Diğer bir deyişle, eğer MyClientyalnızca işlevselliğini ihtiyacı C()ve D()daha sonra yerine
class MyService
{
public void A();
public void B();
public void C();
public void D();
}
/*client code*/
MyService service = ...;
service.C();
service.D();
MyService'syöntemleri istemciye özgü arabirimlere ayırmalıyız :
public interface ISmall_1
{
void A();
void B();
}
public interface ISmall_2
{
void C();
void D();
}
class MyService:ISmall_1, ISmall_2
{ ... }
/*client code*/
ISmall_2 service = ...;
service.C();
service.D();
Böylece eski tanımla, ISP'nin amacı " IFat arayüzünü uygulayan sınıfların yaşamını kolaylaştırmak " iken, ISP'nin amacı " MyService yöntemlerini çağıran müşterilerin hayatını kolaylaştırmak " tır .
İSS'nin iki farklı tanımından hangisi gerçekten doğrudur?
@MARJAN VENEMA
1.
Bu yüzden IFat'ı daha küçük bir arayüze ayıracağınız zaman, hangi yöntemlerin üyelerin ne kadar uyumlu olduğuna bağlı olarak ISmallinterface'e karar vermesi gerekir.
Birbirine bağlı yöntemleri aynı arayüz içine koymak mantıklı olsa da, ISS modeli ile müşterinin ihtiyaçları bir arabirimin "yapışabilirliği" ne göre öncelik kazanıyor diye düşündüm. Başka bir deyişle, ISP ile belirli müşteriler için ihtiyaç duyulan yöntemleri aynı arayüzde toplamalıyız diye düşündüm.
Böylece, sadece hiç çağrısına ihtiyaç olacak istemcilerin bir sürü olsaydı CutGreens, ama aynı zamanda değil GrillMeat, o zaman ISS desen biz sadece koymalıyız uymaları CutGreensiçeride ICookdeğil, aynı zamanda GrillMeat, iki yöntem son derece yapışkan olmasına rağmen ?!
2.
Karışıklıklarınızın ilk tanımdaki gizli bir varsayımdan kaynaklandığını düşünüyorum: uygulayıcı sınıflar zaten tek sorumluluk ilkesini izliyor.
"SRP takip etmiyor uygulayan sınıflar" yle, uygulamak bu sınıflara kastediyoruz IFatveya uygulamak sınıflara ISmall_1/ ISmall_2? Uygulayan sınıflara atıfta bulunduğunuzu varsayıyorum IFat? Öyleyse, neden SRP'yi takip etmediklerini varsayıyorsunuz?
Teşekkürler