Bu tekniği, arayüz ayırma prensibi olarak adlandırabiliriz. Uygulamalarımızda bağlı kalmaya çalıştığımız soyut nesnelerle çalışma ilkesi, bazı yanlış hamleler sonucu başımıza iş açabilir. Soyutluk kavramını da bazı kurallara göre işletmeliyiz. Bize soyut nesne sağlayan 3 tane metodu olan bir interface ürettiğimizi varsayalım. Bu interface den türeyen bir de sınıf oluşturalım. Benzer şekilde bir sınıf daha türetelim. İkinci sınıfımız interface nesnemizin tek bir metodunu kullanıyor ve diğer iki metodu işe yaramıyorsa, doğru yolda değiliz demektir.
Cümlelerden ziyade bir örnek üzerinden anlatmak daha isabetli olacaktır.
Örneğimizde aşağıdaki gibi IUser tipinden iki seviyeli LowLevelUser ve HighLevelUser kullanıcı tipleri oluşturuyoruz. LowLevelUser sadece programları update edebilir. HighLevelUser ise hesap oluşturup hesap silebilir. Ancak LowevelUser tipinin CreateAccount metodu tetiklendiğinde NotImplementedException hatası ile karşılaşırız.
public interface IUser { void UpdateProgram(string programme); void CreateAccount(string accountName); void DeletaAccount(string accountName); } public class LowLevelUser : IUser { public void UpdateProgram(string programme) { // Start update service } public void CreateAccount(string accountName) { throw new NotImplementedException(); } public void DeletaAccount(string accountName) { throw new NotImplementedException(); } } public class HighLevelUser : IUser { public void UpdateProgram(string programme) { // Start update service } public void CreateAccount(string accountName) { // Start create service } public void DeletaAccount(string accountName) { // Start delete service } }
IUser arayüzünü parçalayarak işimize yarar hale getirmeliyiz. Yani alt arayüzler oluşturmalıyız.
Bu ayrımı şu şeklide yapabiliriz:
public interface IUpdater { void UpdateProgram(string programme); } public interface IAccountManager { void CreateAccount(string accountName); void DeletaAccount(string accountName); } public class LowLevelUser : IUpdater { public void UpdateProgram(string programme) { // Start update service } } public class HighLevelUser : IUpdater, IAccountManager { public void UpdateProgram(string programme) { // Start update service } public void CreateAccount(string accountName) { // Start create service } public void DeletaAccount(string accountName) { // Start delete service } }
LowevelUser seviyeli kullanıcı tipinin sadece update işlemlerine yetkili olduğu için UpdateProgram metodunu içeren IUpdater arayüzünden türetilmiştir. Aynı şekilde HighLevelUser ise hesap yönetimlerinden sorumlu olduğu için CreateAccount ve DeleteAccount metodlarını içeren IAccountManager arayüzünden türetilmiştir.
Bu sayede arayüz ayırım tasarım prensibinin amacına ulaşabilmiş oluyoruz.