Kategoriler
Design Patterns

Interface Segregation Principle

Herkese merhaba, software design principles anlatmaya devam ediyorum. Daha ├Ânce Single Responsibility , Open-Closed ve Liskov Substitution prensiplerini anlatm─▒┼čt─▒m.

Genel tan─▒m olarak ┼ču s├Âylenmektedir:


Clients should not be forced to depend on methods that they do not use.

Yani istemciler kullanmad─▒klar─▒ metotlara ba─čl─▒ kalmaya zorlanmamal─▒d─▒rlar. K─▒sacas─▒ Bir interface yazacak olursak cohesion a dikkat etmemiz gerekir ve asl─▒nda dolayl─▒ olarak interface in de single responsibility principle ye uymas─▒ gerekir.

├ľrne─čin bir interface yaz─▒yorsunuz , ilk ba┼čta akl─▒n─▒za gelen her metodu yazd─▒─č─▒n─▒z─▒ d├╝┼č├╝n├╝n. 5 adet metot yazd─▒─č─▒n─▒z─▒ varsayal─▒m. ┼×imdi bir classta bu metotlar─▒ kullanmak i├žin implement ediyorsunuz. Sadece bu interface de yaz─▒lan 1 yada 2 metoda ihtiyac─▒n─▒z─▒n oldu─ču bir durum d├╝┼č├╝n├╝n. ─░┼čte tam burada siz interface segregation principle ye uygun olarak yazmad─▒─č─▒n─▒z i├žin implement etti─činiz metotlar─▒ silemiyorsunuz(├ž├╝nk├╝ hata veriyor) yada o metotlar─▒ bo┼č ge├žmek zorunda kal─▒yorsunuz bu da kod kalabal─▒─č─▒na sebep oluyor ve dolayl─▒ olarak sizin bu class─▒n─▒z single responsibility principle ye de uygun olmam─▒┼č oluyor.

┼či┼čman interfacelerden ka├ž─▒n─▒n

Bu prensip den anla┼č─▒lmas─▒ gereken ; olabildi─čince ba─člant─▒l─▒ metotlar─▒ bir interface i├žine yaz─▒n .(high cohesion)

┼×imdi bir ├Ârnekte a├ž─▒klamaya ├žal─▒┼čal─▒m.

Akl─▒ma ┼č├Âyle bir senaryo geldi: Bir NewWorker classa sahibiz ve bu class─▒ implement eden bir IWorker interface var. IWorker interface in i├žinde ┼ču metotlar var; addToDatabase(),giveSomeGifts(),giveAdvance(),assignIntern().

┼×imdi normal bir ┼čekilde NewWorker class─▒nda bu metotlar─▒ doldurmaya ba┼člad─▒─č─▒n─▒z─▒ d├╝┼č├╝n├╝n. Ama bizim baz─▒ ┼čartlar─▒m─▒z olsun mesela her NewWorker a intern(stajer) atamayal─▒m veya bir di─čer ┼čart , NewWorker yeni i┼če ba┼člam─▒┼čsa gift verelim yada Fark etti─činiz gibi burada alakas─▒z metotlar var , mesela yeni i┼če ba┼člayan birine Intern atamak istemiyorsunuz ama implement etti─činiz IWorker i├žinde assignIntern() metotdu var yani mecburen bu metodu bo┼č ge├žmek zorunda kal─▒yorsunuz. ┼×imdi ne anlatmak istedi─či a┼ča─č─▒da g├Âstermek istiyorum.

,giveAdvance(),assignIntern(). ┼×imdi normal bir ┼čekilde NewWorker class─▒nda bu metotlar─▒ doldurmaya ba┼člad─▒─č─▒n─▒z─▒ d├╝┼č├╝n├╝n. Ama bizim baz─▒ ┼čartlar─▒m─▒z olsun mesela her NewWorker a intern(stajer) atamayal─▒m veya bir di─čer ┼čart , NewWorker yeni i┼če ba┼člam─▒┼čsa gift verelim yada Fark etti─činiz gibi burada alakas─▒z metotlar var , mesela yeni i┼če ba┼člayan birine Intern atamak istemiyorsunuz ama implement etti─činiz IWorker i├žinde assignIntern() metotdu var yani mecburen bu metodu bo┼č ge├žmek zorunda kal─▒yorsunuz. ┼×imdi ne anlatmak istedi─či a┼ča─č─▒da g├Âstermek istiyorum.

package interfaceSegregation;

public interface IWorker {

	public void addToDatabase();
	public void giveSomeGifts();
	public void giveAdvance();
	public void assignIntern();
}
package interfaceSegregation;
public class NewWorker implements IWorker{
	
    private String name;
    private int id;
    
    public NewWorker(String name,int id) {
    	this.name = name ;
    	this.id = id; 	
    }
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}

	@Override
	public void addToDatabase() {
		System.out.println("added to Database");
	}

	@Override
	public void giveSomeGifts() {
		System.out.println("gift was given");
	}

	@Override
	public void giveAdvance() {		
		
	}

	@Override
	public void assignIntern() {
		
	}      
}

G├Ârd├╝─č├╝n├╝z gibi NewWorker ‘─▒n 2 metodu nu bo┼č ge├žmek zorunda kald─▒k ├ž├╝nk├╝ bizim senaryomuza g├Âre uymuyor. Bu yap─▒ya birde tecr├╝beliWorker eklemek isteyelim ve senaryomuzda tecr├╝beli workerlara gift vermedi─čimizi d├╝┼č├╝n├╝n.

package interfaceSegregation;

public class ExperiencedWorker implements IWorker{

	@Override
	public void addToDatabase() {
		
	}

	@Override
	public void giveSomeGifts() {
		// TODO Auto-generated method stub
	}

	@Override
	public void giveAdvance() {
		System.out.println("Advabce was given to the experienced worker");
		
	}

	@Override
	public void assignIntern() {
		System.out.println("Intern was assigned to the experienced worker");
		
	}
}

G├Ârd├╝─č├╝n├╝z gibi giveSomeGift() metodunu bo┼č ge├žmek zorunda kald─▒k hatta addToDatabase metoduna da bo┼č ge├žebiliriz ├ž├╝nk├╝ bu worker tecr├╝beli olmadan ├Ânce new olarak de─čerlendirip new worker iken database ye eklemi┼č olabiliriz bu durumda sadece uptadeDatabase() gibi bir metoda ihtiyac─▒m─▒z olacakt─▒r.

Bu durumun ├Ân├╝ne ge├žmek i├žin Interface Segregation Principle kullan─▒l─▒r . Yani herbir alakas─▒z metodu ayr─▒ bir interface in i├žine koyar─▒z. ExperiencedWorker i├žin a┼ča─č─▒daki gibi olacakt─▒r.

package interfaceSegregation;
public interface IgivableAdvance {
	
	public void giveAdvance();
}
package interfaceSegregation;
public interface IassignableIntern {

	public void assignIntern();
}
package interfaceSegregation;

public class ExperiencedWorker implements IgivableAdvance, IassignableIntern{

	@Override
	public void giveAdvance() {
	System.out.println("Advance was given to experienced worker");
		
	}

	@Override
	public void assignIntern() {
	System.out.println("Intern was assigned to experienced worker");
		
	}
}

G├Ârd├╝─č├╝n├╝z gibi art─▒k ExperiencedWorker class─▒ i├žinde override edilipte bo┼č b─▒rak─▒lmam─▒┼č metot bulunmuyor.

Daha fazla ├Ârnek i├žin:

https://www.turkayurkmez.com/interface-segregation-principle-isp-arayuzlerin-ayrimi-prensibi/

stackify

https://codeburst.io/understanding-solid-principles-interface-segregation-principle-b2d57026cf6c

bayramucuncu