2

我需要幫助重構下面的類,如何避免長時間開關..need幫助重構

以下是與開關各種操作的一類操作: 我想避免statement.I閱讀幾篇文章的開關在使用多態性和狀態模式。但當我重構類我不能訪問許多變量,屬性
我困惑於是否使用操作作爲抽象類或實現一個接口。
只想知道哪種類型的重構將有助於在這種情況下
多態性或狀態模式?
何時使用它們?

public class Operation 
    { 
     public enum OperationType 
     { 
      add, 
      update, 
      delete, 
      retrieve 
     } 
     public enum OperationStatus 
     { 
      Success, 
      NotStarted, 
      Error, 
      Fail, 
      InProcess, 
      Free 
     } 

    // raise this event when operation completes 
    public delegate void OperationNotifier(Operation operation); 
    public event OperationNotifier OperationEvent=null;   

    private OperationStatus _status=OperationStatus.Free; 
    public OperationStatus Status 
    { 
     get { return _status; } 
     set { _status = value; } 
    }  


    private string _fileName = null; 

    public string FileName 
    { 
     get { return _fileName; } 
     set { _fileName = value; } 
    } 

    private string _opnid = null; 

    public string OperationId 
    { 
     get { return _opnid; } 
     set { _opnid = value; } 
    } 

    private OperationType _type; 
    public OperationType Type 
    { 
     get { return _type; } 
     set { _type = value; } 
    } 

    public void performOperation(OperationType type, string parameters) 
    { 

     switch (type) 
     { 
      case OperationType.add: 
       _status = addOperation(parameters);     
       break; 
      case OperationType.update: 
       _status = updateOperation(parameters); 
       break; 
      case OperationType.delete: 
       _status = deleteOperation(parameters); 
       break; 
      case OperationType.retrieve: 
       _status = retrieveOperation(parameters); 
       break; 
      default: 
       break; 
     } 
     if (OperationEvent != null) 
      OperationEvent(this);   
     // return true; 
    } 


    public OperationStatus addOperation(string parameters) 
    {   
     DateTime start = DateTime.Now; 
     //Do SOMETHING BIG 
     TimeSpan timeTaken = DateTime.Now - start; 
     System.Diagnostics.Debug.WriteLine("addOperation:-" + _opnid + "-" + _fileName + "--" + timeTaken.Milliseconds); 
     return OperationStatus.Success; 

     } 
...other operations here.... 

調用代碼類似於:

Operation oprnObj; 
       Operation.OperationType operationType; 

oprnObj = new Operation(); 
oprnObj.FileName = String.Concat("myxmlfile",".xml"); 
oprnObj.OperationId = oprnid; 
oprnObj.OperationEvent += new Operation.OperationNotifier(oprnObj_OperationEvent); 
operation="add"; //get From Outside function getOperation() 
operationType = (Operation.OperationType)Enum.Parse(typeof(Operation.OperationType), operation.ToLower(), true); 
oprnObj.Type = operationType; 
oprnObj.performOperation(operationType, parameters); 

參考主題:
Link
Link
..many更多。

回答

2

在C#中,你可以使用函數的策略,並使用擴展方法有需要時和功能使您能夠添加操作的能力:

public enum OperationStatus 
{ 
    Success, NotStarted, Error, Fail, InProcess, Free 
} 

public class Operation 
{ 
    // raise this event when operation completes 
    public delegate void OperationNotifier(Operation operation, OperationStatus status); 
    public event OperationNotifier OperationEvent = null; 

    public string FileName { get; set; } 
    public string OperationId { get; set; } 

    public Func<string, OperationStatus> Function { get; set; } 

    public void PerformOperation(string parameters) 
    { 
     OperationStatus status = Function(parameters); 

     if (OperationEvent != null) 
      OperationEvent(this, status); 
    } 
} 

static class AddOp 
{ 
    public static OperationStatus AddOperation(this Operation op, string parameters) 
    { 
     DateTime start = DateTime.Now; 
     //Do SOMETHING BIG 
     TimeSpan timeTaken = DateTime.Now - start; 
     System.Diagnostics.Debug.WriteLine("addOperation:-" + op.OperationId + "-" + op.FileName + "--" + timeTaken.Milliseconds); 
     return OperationStatus.Success; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Operation oprnObj = new Operation(); 
     oprnObj.FileName = String.Concat("myxmlfile", ".xml"); 
     oprnObj.OperationId = "oprnid"; 
     oprnObj.OperationEvent += new Operation.OperationNotifier(oprnObj_OperationEvent); 
     string parameters = "fish"; 
     oprnObj.Function = oprnObj.AddOperation; 
     oprnObj.PerformOperation(parameters); 
    } 

    public static void oprnObj_OperationEvent(Operation op, OperationStatus status) 
    { 
     Console.WriteLine("{0} returned {1}", op.Function.Method.Name, status); 
    } 
} 

您也可以通過OperationEvent的功能如果你想要中間狀態更新。

+0

我目前使用.net 2.0嗎?我認爲擴展方法在3.0。 可以在2.0中做一些事情。 – Amitd 2009-12-23 13:09:04

+0

您可以使用.Net 2.0的擴展方法。只要你使用C#3(你可以如果你有VS2008) – philsquared 2009-12-23 13:34:09

+0

暫時仍然使用VS2005.但thx的信息:) – Amitd 2009-12-26 19:09:37

1

我想你在嘗試在這裏使用多態性是正確的軌道。這應該引導你到Strategy模式。 將特定的操作重構爲子類(AddOperation等),但也是(這是你可能缺少的步驟),將數據(文件名等)分解爲一個單獨的對象,傳遞給每個操作。

我會創建一個Operation接口,以及一個可以保存狀態的OperationBase。

+0

做調用代碼初始化OperationBase類的成員? 或者該類應該在接口中作爲方法參數嗎? – Amitd 2009-12-23 13:04:01

+0

需要初始化的唯一類成員將在您的,現在分開的數據類中 - 不需要多態。我看到的操作類需要的唯一狀態是狀態標誌 - 應該在內部初始化 – philsquared 2009-12-23 13:31:00

+0

我仍然感到困惑,但thx我會嘗試一下......我認爲這個時候我會更接近。 – Amitd 2009-12-26 19:08:31

0

我想讓你檢查這個開關盒是否可能在多個地方產卵。如果它只是隔離在一個地方,你可以選擇與此生活在一起。 (替代品更復雜)。

但是,如果你確實需要做出改變,
訪問以下鏈接 - http://refactoring.com/catalog/index.html
搜索「替換類型代碼」,有3和,你可以使用可能的重構。恕我直言,策略之一是你需要的。