为了账号安全,请及时绑定邮箱和手机立即绑定

如何减少冗余代码,创建通用方法?

如何减少冗余代码,创建通用方法?

C#
守着星空守着你 2023-07-09 14:56:52
我有一个插入和更新实体的代码,但逻辑非常相似:实例一个控制器,验证请求,如果错误,返回失败,否则执行操作。        /// <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);我想减少另一个更通用的 Add 方法和 Update 方法。
查看完整描述

2 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

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;

}

}


查看完整回答
反对 回复 2023-07-09
?
杨魅力

TA贡献1811条经验 获得超5个赞

通过基类中的通用方法,我可以重构我的方法


/// <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;

        }


查看完整回答
反对 回复 2023-07-09
  • 2 回答
  • 0 关注
  • 64 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信