اصل Interface Segregation چیست؟
در سري پست هاي تعريف اصول SOLID با
آشنا شديم در اين پست چهارمین اصل يعني Interface Segregation رو برسي ميكنيم.
همنطور که قبلا اشاره کردم هدف این اصل اینه که اینترفیس بزرگ رو براساس استفاده کننده های اون اینترفیس و اهداف مختلف به اینترفیس های کوچکتر تبدیل کنیم و در نتیجه یک استفاده کننده از اون اینترفیس (مثلا یک کلاس) رو مجبور به پیاده سازی متدهای که بهشون نیاز نداره نکنیم و کلاس های پیچیده هم بجای استفاده از یک اینترفیس بزرگ از چندین اینترفیس استفاده کنن. توجه کنید که اگه ما کلاسی رو مجبور کنیم مثلا یک متد رو که اصلا بهش نیاز نداره پیاده سازی کنه و برای مثال بیاد تو اون متد NULL برگردونه یا مثلا Exception صادر کنه علاوه بر نقض اصل Interface Segregation ;در ارث بری ما اصل Liskov Substitution رو هم نقض کردیم.
به عکس زیر توجه کنید فرض کنید تو یک پروژه Web بخواهید ASP.NET Membership رو شخصی سازی کنید و مثلا قسمت بازیابی با ایمیل رو تغییر بدید تقریبا میشه گفت بیخیال این کار میشید
و اما براي مثال عملي فرض كنيد اینترفیسی بنام IAuthorizationProvider داریم و کارش مدیریت مجوز و نقش ها در سیستم هست.
public interface IAuthorizationProvider { IMyIdentity GetRolesFor(IIdentity identity); MembershipInfo GetRoleMembershipInfo(string role); IEnumerableRoles { get; } void AddRole(RoleInfo roleInfo); void AddSubjectToRole(string role, IIdentity identity); }
با نگه به بدنه این اینترفیس 2 نوع مصرف کننده برا این اینترفیس میتوان متصور شد
- مصرف کننده های که میخوان بدونن آیا یک فرد مجاز به انجام کاری هست
- مصرف کننده های که میخوان مجوزها و نقش ها رو مدیریت کنن و بدون یک فرد چه مجوز و نقش های داره
مشکلی که پیش میاد فرض کنید مصرف کننده ی میخواد فقط اطلاعات مربوط به مجوزهای یک عضو رو داشته باشه. با اینترفیس موجود ما مصرف کننده رو مجبور به پیاده سازی متد های کردیم که ازشون استفاده نمیکنه (در اینجا متدهای اضافه کردن نقش و…) و با این نوع تعریف اینترفیس ما اصل Interface Segregation رو نقض کردیم.
و اما برای رفع این مشکل و رعایت کردن Interface Segregation به کد زیر توجه کنید
public interface IAuthorizationProvider { IMyIdentity GetAuthorizations(IIdentity identity); } public interface IRoleManager { MembershipInfo GetRoleMembershipInfo(string role); IEnumerableRoles { get; } void AddRole(RoleInfo roleInfo); void AddSubjectToRole(string role, IIdentity identity); }
با این اینترفیس در واقع ما براساس نیازهای مصرف کننده اومدیم اینترفیس رو شکستیم به دو اینترفیس تا مصرف کننده رو مجبور به پیاده سازی متد های که نیازی بهشون نداره نکنیم.
ادامه دارد …
نظرات
ارسال یک نظر