模板方法 - 强制方法调用另一个方法

时间:2016-07-13 15:58:17

标签: c# oop

我们假设我们有以下课程:

public class Employee
{
  public string Name { get; private set; } 
  public string Team { get; private set; }

  public Employee(string name, string team)
  {
    this.Name = name;
    this.Team = team;
  }

  public void UpdateName(string newName, string updatedBy)
  {
    this.Name = newName;

    this.Update(updatedBy);
  }

  public void UpdateTeam(string newTeam, string updatedBy)
  {
    this.Team = newTeam;

    this.Update(updatedBy);
  }

  private void Update(string updatedBy)
  {
    // and do something with updatedBy
  }
}

C#中是否有更好的方法我可以强制执行某种方法(例如UpdateTeam调用Update方法并将其传递给字符串参数 - 例如updatedBy)?

当然没有这样的语法,只是为了说明我的意思:

public class Employee
{
  // ...

  public void UpdateTeam(string newTeam, string updatedBy) : Update(updatedBy)
  {
    this.Team = newTeam;
  }

  private void Update(string updatedBy)
  {
    // and do something with updatedBy
  }
}

编辑:我知道'模板'模式,它不是我需要的。

4 个答案:

答案 0 :(得分:1)

我认为模型应该是轻量级的,并且模型类中没有业务逻辑的位置。您应该考虑在单独的类中提取业务逻辑。这个概念可能有所帮助:

public class UpdateNameCommand : ICommand<UpdateNameContext>
{
    public void Execute(UpdateNameContext context)
    {
        UpdateEmployeeName(context.NewName);
        UpdateTeam(context.UpdatedBy);
    }

    private void UpdateEmployeeName(string name)
    {
        // ...
    }

    private void UpdateTeam(string updatedBy)
    {
        // ...
    }
}

public interface ICommand<TContext>
{
    void Execute(TContext context);
}

其中命令上下文是一个简单的类,负责将数据传递给命令,并且(如果需要)在命令执行后接收结果。

它不一定是命令,而是任何负责业务案例的单独类。其他程序员应该使用它来执行这个特定的操作。这个类(或方法)应该封装必要的逻辑并公开简单的接口以便从外部调用。

关于SOLID principles的好读物。所描述的方法至少涵盖2个原则,可能更多,具体取决于您的应用需求:

  

S - 单一责任
  O - 开放/封闭原则

答案 1 :(得分:0)

将代码添加到NameTeam的设置者,它将设置内部属性,然后调用Update

UpdatedBy应该在另一个班级。你现在把2个职责混合成一个班级。

答案 2 :(得分:0)

不,没有比你建议的更好的方法了。 :)

当然还有其他一些方法可以做到这一点(设置属性而不是调用方法,甚至可能调用一个事件,但在所有情况下都需要手动添加该调用。)

您可能需要考虑AOP。 AOP允许您定义一个特殊属性,该属性可以在调用公共方法之前或之后调用方法。当然,您仍然需要手动添加该属性。

有关AOP的更多信息,请查看:https://www.postsharp.net/

答案 3 :(得分:0)

也许您可以尝试使用面向方面编程。似乎AOP可以帮助你。其中一个定义是:

  

一个方面是一个通常分散的常见特征   方法,类,对象层次结构,甚至整个对象模型。它   是看起来和闻起来应该有结构的行为,但是   你无法在代码中找到表达这种结构的方法   传统的面向对象技术。

因此,您需要通过更改姓名或团队来完成额外的工作。那&#34;额外的工作&#34;不应该与你的代码混在一起,因为你的设计很干净。

这里有一篇非常好的帖子: What is aspect-oriented programming?