惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Blog — PlanetScale
Blog — PlanetScale
Y
Y Combinator Blog
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LangChain Blog
S
SegmentFault 最新的问题
J
Java Code Geeks
V
Visual Studio Blog
H
Help Net Security
Stack Overflow Blog
Stack Overflow Blog
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - Franky
B
Blog RSS Feed
The Cloudflare Blog
MyScale Blog
MyScale Blog
月光博客
月光博客
Microsoft Security Blog
Microsoft Security Blog
美团技术团队

博客园 - henry

Smark.Net.Tcp.XmlService性能测试程序 基于Flex的http简易文件管理工具 性能的瓶颈到底在那呢? 运用Smark.SocketAsyncs扩展基于XML的TCP服务 运用Smark.SocketAsyncs方便实现数据交互服务 实现分布式对象锁 发布一个C#实现的Asterisk的管理系统 asterisk使用SIP相互对接 开源一个基于Flex4+C#的个人信息管理程序 FlashBuilder4试用 Asterisk2B用户管理逻辑设计 用JQuery UI dialog实现Alert和Confirm功能 - henry Asterisk发起电话预约回拔 WOW工会DKP管理系统 我的分页控件设计 实现一个JavaScript验证的Asp.net Helper - henry - 博客园 Smark.Data 实体属性值描述 Smark.Data实体成员数据验证 Smark.Data Part1
这样的重构是否有必要呢?
henry · 2010-01-19 · via 博客园 - henry

       在写数据查询的业务逻辑里,经常需要对查询条件进行合并;对于条件的构造是否有必要构造一个新的类把条件构造分离出来提供其条件的重用性呢?首先看下代码:

        public IList<Balances> BalancesList(

           [Bind(Convert = typeof(ToEnum<BalanceState>))]BalanceState? state, DateTime? from, DateTime? to)

        {

            Expression exp = new Expression();

            if (state != null)

            {

                exp &= Balances.state == state;

            }

            else

            {

                exp &= Balances.state == new BalanceState[] { BalanceState.等待发工资, BalanceState.已发放工资, BalanceState.已发放虚拟货币 };

            }

            if (from != null)

                exp &= Balances.timeCreated >= from;

            else

                exp &= Balances.timeCreated >= DateTime.Parse(DateTime.Now.ToShortDateString());

            if (to != null)

                exp &= Balances.timeCreated <= to;

            return exp.List<Balances>(new Region(0, 1000), Balances.timeCreated.Desc);

        }

这是一个非常典型的数据查询逻辑,根据参数来组件查询条件。在构造条件组合类前写一个接口好规范所有条件组合类。

    public interface IExpressionBuilder

    {

        Expression Execute();

    }

直下来对上面那个数据查询方法进行简单的重构,把条件分离出来:

    public class TestBuiler : IExpressionBuilder

    {

      public  BalanceState? State{get;set;}

        public  DateTime? From{get;set;}

        public DateTime? To { get; set; }

        public Expression Execute()

        {

            Expression exp = new Expression();

            if (State != null)

            {

                exp &= Balances.state == State;

            }

            else

            {

                exp &= Balances.state == new BalanceState[] { BalanceState.等待发工资, BalanceState.已发放工资, BalanceState.已发放虚拟货币 };

            }

            if (From != null)

                exp &= Balances.timeCreated >= From;

            else

                exp &= Balances.timeCreated >= DateTime.Parse(DateTime.Now.ToShortDateString());

            if (To != null)

                exp &= Balances.timeCreated <= To;

            return exp;

        }

    }

分离之后的逻辑方法相对就简洁很多

        public IList<Balances> BalancesList(

           [Bind(Convert = typeof(ToEnum<BalanceState>))]BalanceState? state, DateTime? from, DateTime? to)

        {

            TestBuiler builder = new TestBuiler();

            builder.State = state;

            builder.From = from;

            builder.To = to;

            return builder.Execute().List<Balances>(new Region(0, 1000), Balances.timeCreated.Desc);

        }

从代码简洁性来看似乎没有多大的改变,紧紧是提高了基于这条件复用性。在某些情况可以减少部分代码的编写:

        public IList<Balances> BalancesList(

   [Bind(Convert = typeof(ToEnum<BalanceState>))]BalanceState? state, DateTime? from, DateTime? to)

        {

            TestBuiler builder = new TestBuiler();

            builder.State = state;

            builder.From = from;

            builder.To = to;

            return (builder.Execute()& Balances.userid==loginer).List<Balances>(new Region(0, 1000), Balances.timeCreated.Desc);

        }

对于重构的价值有时真的很难衡量,很多时候到了后期你会发现,原来的重构并没有带来什么得益。

如果重构能使代码变得更简洁和方便维护那重构是必须的,但从复用性上来对代码进行重构就要看情况来考虑一下,不是所有代码都有很高的复用价值。