Saat membaca artikel tentang ISP, tampaknya ada dua definisi yang bertentangan tentang ISP:
Menurut definisi pertama (lihat 1 , 2 , 3 ), ISP menyatakan bahwa kelas yang mengimplementasikan antarmuka tidak boleh dipaksa untuk mengimplementasikan fungsionalitas yang tidak mereka butuhkan. Dengan demikian, antarmuka yang gemukIFat
interface IFat
{
void A();
void B();
void C();
void D();
}
class MyClass: IFat
{ ... }
harus dibagi menjadi antarmuka yang lebih kecil ISmall_1
danISmall_2
interface ISmall_1
{
void A();
void B();
}
interface ISmall_2
{
void C();
void D();
}
class MyClass:ISmall_2
{ ... }
karena dengan cara ini saya MyClass
hanya dapat mengimplementasikan metode yang diperlukan ( D()
dan C()
), tanpa dipaksa juga menyediakan implementasi dummy untuk A()
, B()
dan C()
:
Tetapi menurut definisi kedua (lihat 1 , 2 , jawaban oleh Nazar Merza ), ISP menyatakan bahwa MyClient
memanggil metode MyService
tidak boleh menyadari metode MyService
yang tidak diperlukan. Dengan kata lain, jika MyClient
hanya membutuhkan fungsionalitas C()
dan D()
, maka alih-alih
class MyService
{
public void A();
public void B();
public void C();
public void D();
}
/*client code*/
MyService service = ...;
service.C();
service.D();
kita harus memisahkan MyService's
metode menjadi antarmuka khusus klien :
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();
Jadi dengan definisi sebelumnya, tujuan ISP adalah untuk " membuat kehidupan kelas yang mengimplementasikan antarmuka IFat lebih mudah ", sedangkan dengan yang terakhir tujuan ISP adalah untuk " membuat kehidupan klien yang memanggil metode MyService lebih mudah ".
Manakah dari dua definisi berbeda ISP yang benar?
@MARJAN VENEMA
1.
Jadi ketika Anda akan membagi IFat menjadi antarmuka yang lebih kecil, metode mana yang berakhir di mana antarmuka kecil IS harus diputuskan berdasarkan seberapa kohesifnya para anggota.
Meskipun masuk akal untuk menempatkan metode kohesif dalam antarmuka yang sama, saya pikir dengan pola ISP kebutuhan klien lebih diutamakan daripada "keterpaduan" antarmuka. Dengan kata lain, saya pikir dengan ISP kita harus menggumpal dalam antarmuka yang sama metode-metode yang dibutuhkan oleh klien tertentu, bahkan jika itu berarti meninggalkan antarmuka itu metode-metode yang seharusnya, demi keterpaduan, juga dimasukkan ke dalam antarmuka yang sama?
Jadi, jika ada banyak klien yang hanya perlu dihubungi CutGreens
, tetapi tidak juga GrillMeat
, maka untuk mematuhi pola ISP kita hanya harus memasukkan ke CutGreens
dalam ICook
, tetapi tidak juga GrillMeat
, meskipun kedua metode ini sangat kohesif ?!
2.
Saya pikir bahwa kebingungan Anda berasal dari asumsi tersembunyi dalam definisi pertama: bahwa kelas-kelas pelaksana sudah mengikuti prinsip tanggung jawab tunggal.
Dengan "menerapkan kelas yang tidak mengikuti SRP" apakah Anda merujuk ke kelas yang menerapkan IFat
atau ke kelas yang menerapkan ISmall_1
/ ISmall_2
? Saya menganggap Anda merujuk ke kelas yang menerapkan IFat
? Jika demikian, mengapa Anda menganggap mereka belum mengikuti SRP?
Terima kasih