必会重构技巧(三):提取接口
生活随笔
收集整理的這篇文章主要介紹了
必会重构技巧(三):提取接口
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
提取接口:當有多余一個類使用另外一個類中的方法時,可以考慮引入接口,解除這種依賴。 舉例理解:比如說類A中有個方法為Call(Type T),類B和類C中都有方法都要調用Call這個方法,那么我們推薦引入一個接口,這樣傳參時可以直接new一個接口,可以解除調用方法和實現方法之間的耦合關系。面向接口編程也算是OO中比較重要的吧。 項目實例:一般而言在設計的時候,對于比較可能擴展的部分都會用接口或者是抽象方法來處理,對于接口,個人并不是很喜歡,因為接口寫好了要修改就很困難,只能再加新的接口,這對設計的要求很高,抽象方法相對好用點。下面的代碼擴展于原文的Demo Code,希望可以講得稍微詳細點。提取接口:當有多余一個類使用另外一個類中的方法時,可以考慮引入接口,解除這種依賴。
舉例理解:比如說類A中有個方法為Call(Type T),類B和類C中都有方法都要調用Call這個方法,那么我們推薦引入一個接口,這樣傳參時可以直接new一個接口,可以解除調用方法和實現方法之間的耦合關系。面向接口編程也算是OO中比較重要的吧。
項目實例:一般而言在設計的時候,對于比較可能擴展的部分都會用接口或者是抽象方法來處理,對于接口,個人并不是很喜歡,因為接口寫好了要修改就很困難,只能再加新的接口,這對設計的要求很高,抽象方法相對好用點。下面的代碼擴展于原文的Demo Code,希望可以講得稍微詳細點。
先來看看原始的未經過重構的代碼:
?
實現類 public class ClassRegistration{
public void CreateAdmin()
{
// create registration code
}
public void CreateUser()
{
// create registration code
}
public decimal Total { get; private set; }
}
public class RegistrationProcessor
{
public decimal ProcessRegistrationAdmin(ClassRegistration registration)
{
registration.CreateAdmin();
return registration.Total;
}
public decimal ProcessRegistrationUser(ClassRegistration registration)
{
registration.CreateUser();
return registration.Total;
}
}
?
?
?
調用方法 protected void CreateAdmin_Click(object sender, EventArgs e){
RegistrationProcessor registrationProcessor = new RegistrationProcessor();
registrationProcessor.ProcessRegistrationAdmin(new ClassRegistration());
}
protected void CreateUser_Click(object sender, EventArgs e)
{
RegistrationProcessor registrationProcessor = new RegistrationProcessor();
registrationProcessor.ProcessRegistrationUser(new ClassRegistration());
}
?
上面的偽代碼實現了創建Admin和User的主要類和主要實現方法及調用事件,這樣的代碼看似沒問題,其實是非常不方便擴展的。請大家想想,如果我現在要添加一個創建Viewer用戶的事件,需要改幾個方法?我整理如下: (1)在類ClassRegistration中增加一個CreateViewer()的方法; (2)在類RegistrationProcessor中增加一個處理注冊Viewer用戶的方法ProcessRegistrationViewer(); (3)在CreateViewer的Button事件中添加代碼; 如上,改的地方實在太多了,這里對于創建用戶的這個方法完全可以抽象出來,把它作為一個接口方法處理,重構后的代碼如下: 重構后的實現類 public interface IClassRegistration{
void Create();
decimal Total { get; }
}
public class ClassRegistrationAdmin : IClassRegistration
{
public void Create()
{
// create registration code
}
public decimal Total { get; private set; }
}
public class ClassRegistrationUser : IClassRegistration
{
public void Create()
{
// create registration code
}
public decimal Total { get; private set; }
}
public class RegistrationProcessor
{
public decimal ProcessRegistration(IClassRegistration registration)
{
registration.Create();
return registration.Total;
}
}
?
重構后的調用方法 protected void Create_Click(object sender, EventArgs e){
var btn = sender as Button;
if (btn != null)
{
RegistrationProcessor registrationProcessor = new RegistrationProcessor();
IClassRegistration registration;
switch (btn.CommandArgument)
{
case "CreateAdmin":
registration = new ClassRegistrationAdmin();
registrationProcessor.ProcessRegistration(registration);
break;
case "CreateUser":
registration = new ClassRegistrationUser();
registrationProcessor.ProcessRegistration(registration);
break;
}
}
}
?
如上,提取接口后,對于新類型用戶的創建就方便多了,新建一個基于接口的創建新用戶的類,然后在Button的事件中加個分支就好了。并且我們只需要實現接口中的方法Create()就OK了。 面向接口編程,能大大提高程序的可擴展性和可維護性,對于程序的模塊化很有幫助,非常適合用于多模塊,多團隊合作的項目。轉載于:https://www.cnblogs.com/flashbar/archive/2010/07/12/1775834.html
總結
以上是生活随笔為你收集整理的必会重构技巧(三):提取接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好果子在哪里还款
- 下一篇: .NET智能客户端(SmartClien