使用SQL Server操作重构C#事件

时间:2015-11-24 18:23:09

标签: c# sql-server refactoring

我不知道如何决定如何重构某些生产代码。此代码用作db中前1位的选择记录,并决定在下面包含值的列。

switch(column_value):
   case send_email:
        send_email.DoIt();
   case enable_somexx:
        enable_somexx.DoIt();
   case response_email:
        response_email.DoIt(); 

显示以下示例,为每个事件(记录)创建了类,包括DoIt()方法(SendMail,DecideMail,ResponseMail,MailXXX,enable_somexx)。这些类包括3个子文件夹动作,分别命名为action,decision,response(实际上这些类与其他类不相关,因为代码选择了前1条记录)

我正在考虑重构这样的代码逻辑:

  • 创建名为Behaviour
  • 的基类
  • 其他3个主要类将继承自此基类

代码:

public abstract Behaviour
{
     public virtual void DoIt(string type) {
     }
}

--Also another classes Decision, Response will inherit from Behaviour. 
public class Action : Behaviour
{
    override void DoIt(string type) {
    }
}

public class Email : Action 
{
    override void DoIt(string type)
    {
        if(type == SEND)
             call_sendmethod
        else if(xxx_operation_about_mail)
             call_xxx_operation_about_mail
    } 
}

但是我无法处理(实际上我不喜欢我的解决方案,因为我不想在每次操作中创建相同的类,如EmailAction,EmailResponse,EmailDecision或其他操作)

如果你进行这个代码块重构,你会怎么做?

谢谢。

1 个答案:

答案 0 :(得分:0)

使用你的重构思想......这就是我编码的方式:

这是一个大纲:

  1. 为行为

  2. 创建一个抽象类
  3. 创建一个继承行为的动作类

  4. 然后你可以像这样编码来触发欲望“行动”。 请注意我如何覆盖“发送”行为以将其自定义为“特殊发送”。

  5. 这是小提琴:https://dotnetfiddle.net/m3tjWl

      

    块引用

    public class Program : Action
    {
     public static void Main()
     {
        Console.WriteLine("Hello World");
        var command = Console.ReadLine();
    
        //trigger send from Action class
        Action x = new Action();
        x.DoIt(command);
    
        //trigger send from behavior class
        //the lines below are added to show how you can still access the parent behavior, remove or use where appropriate
        Behaviour y = x;
        y.Send();
     }
    }
    
    public abstract class  Behaviour 
    {
        public virtual void Send()
        {
            Console.WriteLine("sent");
        }
    
        public virtual void EnableX()
        {
            Console.WriteLine("enabled");
        }
    
        public virtual void Reply()
        {
            Console.WriteLine("replied");
        }
    
        public abstract void DoIt(string type);
    }
    
    public class Action : Behaviour
    {
     public override void DoIt(string type)
     {
        if(type.ToUpper() == "SEND")
            this.Send();
        else if (type.ToUpper() == "ENABLEX")
            this.EnableX();
        else if (type.ToUpper() == "REPLY")
            this.Reply();
        else
            Console.WriteLine("Unknown Command");   
     }
    
     new public void Send()
     {
        Console.WriteLine("Special Sent");
     }
    }