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

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
PCI Perspectives
PCI Perspectives
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V2EX - 技术
V2EX - 技术
Google DeepMind News
Google DeepMind News
量子位
博客园_首页
S
SegmentFault 最新的问题
S
Secure Thoughts
F
Full Disclosure
H
Hacker News: Front Page
博客园 - 三生石上(FineUI控件)
U
Unit 42
H
Heimdal Security Blog
N
News and Events Feed by Topic
A
About on SuperTechFans
C
CERT Recently Published Vulnerability Notes
Cyberwarzone
Cyberwarzone
Help Net Security
Help Net Security
The Hacker News
The Hacker News
L
LINUX DO - 最新话题
Application and Cybersecurity Blog
Application and Cybersecurity Blog
罗磊的独立博客
N
News | PayPal Newsroom
Spread Privacy
Spread Privacy
C
Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
云风的 BLOG
云风的 BLOG
A
Arctic Wolf
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Simon Willison's Weblog
Simon Willison's Weblog
B
Blog
人人都是产品经理
人人都是产品经理
TaoSecurity Blog
TaoSecurity Blog
博客园 - 【当耐特】
C
Cyber Attacks, Cyber Crime and Cyber Security
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
I
InfoQ
D
DataBreaches.Net
大猫的无限游戏
大猫的无限游戏
Apple Machine Learning Research
Apple Machine Learning Research
L
LINUX DO - 热门话题
Google Online Security Blog
Google Online Security Blog
V
Visual Studio Blog
V
Vulnerabilities – Threatpost
Know Your Adversary
Know Your Adversary
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
B
Blog RSS Feed

博客园 - 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);

        }

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

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