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_1
veISmall_2
interface ISmall_1
{
void A();
void B();
}
interface ISmall_2
{
void C();
void D();
}
class MyClass:ISmall_2
{ ... }
Bu yolla beri benim MyClass
tek 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ığı MyService
yöntemlerin farkında MyService
olmaması gerektiğini belirtir. Diğer bir deyişle, eğer MyClient
yalnı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's
yö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ı CutGreens
içeride ICook
değ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 IFat
veya 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