【问题标题】:How to refactor this template method implemetation如何重构此模板方法实现
【发布时间】:2015-03-20 17:20:00
【问题描述】:

我有一个混蛋模板方法实现。它不是具有子类实现的基类,而是 util 类上的静态方法,它接受它委托的接口。我想将其重构为更常见的模式,这样我就可以停止传递 Domain 类。

我认为第一步是将模板转换为对象方法,但是对于如何将我的 5 个 Helper 实现(未显示)移动到新模板对象的子类中,我失去了灵感。

public interface Helper
{
    void doFirstThing(Domain d);
    void doSecondThing(String id);
}

public class UtilClass
{
    public static void  template(Domain d,  Helper h, String who)
    {
        //begin database transaction
        try
        {
            //some logic
            h.doFirstThing(d);
            //more computation

            h.doSecondThing(d.getId());
            //database commit();
        }
        finally
        {
            //if transaction open database rollback();
        }
    }
}

public class Domain
{

    public String getId()
    {
        return "value";
    }

}

【问题讨论】:

    标签: design-patterns refactoring


    【解决方案1】:

    类似下面的...

    public abstract class TemplateX
        {
            protected Domain _domain;
    
            protected TemplateX(Domain domain)
            {
                _domain = domain;
            }
            protected abstract void DoFirstThing();
            protected abstract void DoSecondThing();
    
            public void DoIt(string who)
            {
    
                //begin database transaction
                try
                {
                    //some logic
                    DoFirstThing();
                    //more computation
    
                    DoSecondThing();
                    //database commit();
                }
                finally
                {
                    //if transaction open database rollback();
                }
            }
        }
    
        public class Implementation1 : TemplateX
        {
            public Implementation1(Domain domain) : base(domain)
            {
    
            }
    
            protected override void DoFirstThing()
            {
                //code from helper class here
            }
    
            protected override void DoSecondThing()
            {
                //code from helper class here
            }
        }
    

    【讨论】:

    • 这正是我想去的地方。我正在寻找的是实现目标的重构步骤。
    • 去 TDD。为新类应该做什么构建单元测试,并确保他们这样做。围绕现有代码使用此功能的位置创建集成测试,然后确保在您换入新代码时它们保持绿色。
    【解决方案2】:

    我想了想,想出了以下步骤。

    1. 用方法对象替换方法。将助手排除在构造函数参数之外。我也跳过了关于制作局部变量字段的部分。当我希望它完成时,自动重构做得很好。
    2. 内联静态方法。
    3. 使实现成为新 MethodObject 的子类。 这涉及添加/修改一个/构造函数。
    4. 方法对象在哪里创建并与实现一起调用,只需创建实现并调用模板方法即可。

      new MethodObject(d, who).template(new Implementation(d, who));

    变成

    Implementation impl = new Implementation(d, who);
    impl.template(impl);
    
    1. 对其他实现重复步骤 3 和 4。
    2. 将 MethodObject/Baseclass 抽象化,并将接口中的方法添加为抽象方法。
    3. 更新 MethodObject/Baseclass 以使用抽象方法。
    4. 现在将 Helper 接口作为参数删除,因为它没有被使用。
    5. 从子类中删除接口声明。
    6. 删除帮助界面。
    7. 可以删除先前在接口上定义的方法的参数,这些方法是父类上的字段。 这可以扩展到从字段中获取的值。由于 d 是一个字段,因此 d.getId() 不需要传递。 doSecondThing(d.getId());

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多