使用SQL Server操作重构基于C#事件
本文关键字:事件 重构 SQL Server 操作 使用 | 更新日期: 2023-09-27 18:24:22
我不知道如何决定如何重构一些生产代码。这段代码的工作原理是从数据库中选择记录top 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或其他操作)创建相同的类
如果你进行代码块重构,你会怎么做?
谢谢。
使用您的重构思想。。。这就是我的编码方式:
以下是一个概要:
-
为Behavior 创建一个抽象类
-
创建一个继承Behavior 的操作类
-
然后你可以用这样的代码来触发欲望"行动"。请注意我是如何覆盖"发送"行为以将其自定义为"特殊发送"的。
这是小提琴: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");
}
}