我不知道如何决定如何重构某些生产代码。此代码用作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
代码:
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或其他操作)
如果你进行这个代码块重构,你会怎么做?
谢谢。
答案 0 :(得分:0)
使用你的重构思想......这就是我编码的方式:
这是一个大纲:
为行为
创建一个继承行为的动作类
然后你可以像这样编码来触发欲望“行动”。 请注意我如何覆盖“发送”行为以将其自定义为“特殊发送”。
这是小提琴: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");
}
}