【问题标题】:How to reduce my redundant code, creating generic methods?如何减少我的冗余代码,创建泛型方法?
【发布时间】:2019-07-19 22:50:27
【问题描述】:

我有一个插入和更新实体的代码,但是逻辑非常相似:实例化一个控制器,验证de请求,如果错误,返回失败,否则执行操作。


        /// <summary>
        /// Method Add with similar code in Update method
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public PersonResponse Add(PersonInsertRequest item)
        {
            var result = new PersonResponse();

            var controller = new PersonController(classmates);

            result.Messages = controller.ValidateInsert(item);

            if (result.Messages != null && result.Messages.Any())
            {
                result.Status = "failed";
            }
            else
            {
                result = controller.ExecuteInsert(item);
            }

            return result;
        }

        /// <summary>
        /// Method Update with similar code in Add method
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public PersonResponse Update(PersonUpdateRequest item)
        {
            var result = new PersonResponse();

            var controller = new PersonController(classmates);

            result.Messages = controller.ValidateUpdate(item);

            if (result.Messages != null && result.Messages.Any())
            {
                result.Status = "failed";
            }
            else
            {
                result = controller.ExecuteUpdate(item);
            }

            return result;
        }

- 我曾尝试使用委托,但我无法使用它们,因为我无法将委托分配给 controller.ValidateInsert(item);

public class BaseLogic
    {
        public delegate List<Message> Validator(BaseRequest request);

        public delegate BaseResponse Executor(BaseRequest request);

        public BaseResponse Execute(BaseRequest request, Validator funcValidator, Executor funcExecutor)
        {
            var result = new BaseResponse();

            result.Messages = funcValidator(request);

            if (result.Messages != null && result.Messages.Any())
            {
                result.Status = "failed";
            }
            else
            {
                result = funcExecutor(request);
            }

            return result;
        }
    }

我想将 Add 方法和 Update 方法简化为另一个更通用的方法。

【问题讨论】:

  • 您可以做的一件事是摆脱冗余代码,将函数组合到 AddOrUpdate() 中
  • 我有很多继承的类具有相同的行为,以及更多的操作:验证执行
  • 我会做什么来制作一些允许您指定操作的枚举参数。这样您的代码就易于阅读和使用。
  • “生产”代码是一个 API Rest,有很多具有最佳实践模式的方法:验证执行
  • 我不明白你为什么要回答你自己的问题...你是在培养声誉吗?!

标签: c# delegates func


【解决方案1】:
using System;
using System.Collections.Generic;
using System.Linq;

class Test
{
    private object classmates;

public PersonResponse Add(PersonInsertRequest item)
{
    var controller = new PersonController(classmates);
    return ValidateAndExecute(() => controller.ValidateInsert(item),
    () => controller.ExecuteInsert(item));
}

public PersonResponse Update(PersonUpdateRequest item)
{
    var controller = new PersonController(classmates);
    return ValidateAndExecute(() => controller.ValidateUpdate(item),
    () => controller.ExecuteUpdate(item));
}

private PersonResponse ValidateAndExecute(Func<IEnumerable<string>> validator,
Func<PersonResponse> execute)
{
    var result = new PersonResponse();

    result.Messages = validator();

    if (result.Messages != null && result.Messages.Any())
    {
        result.Status = "failed";
    }
    else
    {
        result = execute();
    }

    return result;
}

}

【讨论】:

  • 让我实现它
  • 当我在使用 BaseResponse 的 clases 中实现时,会导致很多“强制转换”错误。
【解决方案2】:

使用基类中的泛型方法,我可以重构我的方法

/// <summary>
        /// Method Add with similar code in Update method
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public PersonResponse Add(PersonInsertRequest item)
        {

            var controller = new PersonController(classmates);

            Validator myValidator = request => controller.ValidateInsert((PersonInsertRequest)request);
            Executor myExecutor = request => controller.ExecuteInsert((PersonInsertRequest)request);

            var result = Execute(item, myValidator, myExecutor);

            return result as PersonResponse;
        }

        /// <summary>
        /// Method Update with similar code in Add method
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public PersonResponse Update(PersonUpdateRequest item)
        {
            var controller = new PersonController(classmates);

            Validator myValidator = request => controller.ValidateUpdate((PersonUpdateRequest)request);
            Executor myExecutor = request => controller.ExecuteUpdate((PersonUpdateRequest)request);

            var result = Execute(item, myValidator, myExecutor);

            return result as PersonResponse;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多