31天重构学习笔记1. 封装集合

摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接过去的。记得当时一口气看完了整个系列并没有多少感觉,因为这些基本上项目都在使用,只是我们没有专门把它标示和整理出来,所以也没有引起多大的重视。现在突然接手这个重构项目,由于团队成员技术和经验参差不齐,所以有必要专门整理一个重构的纲要,当然这个系列也非常适合做新系统的代码规范参考,只要有代码的地方,这个重构规范就很有价值。周末也不想出去闲逛,因为在刚到这个美丽的城市,没有亲戚或者朋友,所以才能静下心来两天时间写完这个重构参考规范。同时也感受了Windows Live writer写文章的快感。当然重构的整体架构得另当别论(整体架构在我的这篇文章有专门的讲解(http://www.cnblogs.com/zenghongliang/archive/2010/06/23/1763438.html)。大的架构设计好了以后,这些重构细节点就成了东风之后的大火,对整个项目也是至关重要。31天重构这个系列和《代码大全》、《重构:改善既有代码的设计》比较起来最大的特点就是比较简单、浅显易懂。那么我这些文章也都是学习Sean Chambers的31天重构的笔记整理,所以如果大家对这个笔记有任何异议也可以指出。

具体也可以通过http://www.lostechies.com/blogs/sean_chambers/archive/2009/07/31/31-days-of-refactoring.aspx查看原文。

概念:本文所讲的封装集合就是把集合进行封装,只提供调用端需要的接口。

正文:在很多时候,我们都不希望把一些不必要的操作暴露给调用端,只需要给它所需要的操作或数据就行,那么做法就是封装。这个重构在微软的代码库也经常遇到。比如最经典的属性对字段的封装就是一个很好的例子,那么下面我们将看到对集合的封装,如下代码所示,调用端只需要一个集合的信息,而我们则提供了一个IList的集合,大家都知道IList具有对集合的所有操作,所以这会带来很多隐患,最好的做法就是对它进行重构。

using System.Collections.Generic;

namespace LosTechies.DaysOfRefactoring.EncapsulateCollection.Before
{
    public class Order
    {
        private List<OrderLine> _orderLines;
        private double _orderTotal;

        public IList<OrderLine> OrderLines
        {
            get { return _orderLines; }
        }

        public void AddOrderLine(OrderLine orderLine)
        {
            _orderTotal += orderLine.Total;
            _orderLines.Add(orderLine);
        }

        public void RemoveOrderLine(OrderLine orderLine)
        {
            orderLine = _orderLines.Find(o => o == orderLine);

            if (orderLine == null)
                return;

            _orderTotal -= orderLine.Total;
            _orderLines.Remove(orderLine);
        }
    }

    public class OrderLine
    {
        public double Total { get; private set; }
    }
} 

那么重构之后,我们把IList换成了IEnumerable,大家都知道只包括一个返回值为IEnumerator的GetEnumerator()方法,所以这样只能遍历取出它的值,而不能对这个集合做出改变,这正是我们所需要的结果,具体代码如下:

using System.Collections.Generic;

namespace LosTechies.DaysOfRefactoring.EncapsulateCollection.After
{
    public class Order
    {
        private List<OrderLine> _orderLines;
        private double _orderTotal;

        public IEnumerable<OrderLine> OrderLines
        {
            get { return _orderLines; }
        }

        public void AddOrderLine(OrderLine orderLine)
        {
            _orderTotal += orderLine.Total;
            _orderLines.Add(orderLine);
        }

        public void RemoveOrderLine(OrderLine orderLine)
        {
            orderLine = _orderLines.Find(o => o == orderLine);

            if (orderLine == null)
                return;

            _orderTotal -= orderLine.Total;
            _orderLines.Remove(orderLine);
        }
    }

    public class OrderLine
    {
        public double Total { get; private set; }
    }
}

总结:这个例子很容易让我们想到以前系统间耦合常喜欢用数据库。每个系统都会操作数据库,并且有些系统还会对数据库的表结构或字段进行修改,那么这很容易就会造成维护的地狱,很明智的一个做法就是使用SOA来隔开这些耦合,让一些只需要数据展示的系统得到自己需要的数据即可。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沃趣科技

2018英特尔数据中心渠道峰会| 沃趣科技荣获英特尔2018行业突破奖

“砥砺奋进 再攀高峰-2018英特尔中国区数据中心渠道峰会”于12月11日至14日在成都隆重召开。本次峰会的主题涵盖了拥抱新机遇、业务战略分享以及总结与展望等。...

19830
来自专栏全栈数据化营销

数据增长案例:中原地产用数据挽留22%流失用户,赋能6万经纪人

最近在思考大宗高价产品的营销增长案例,看到了中原地产营销增长负责人在增长大会的分享,觉得还是比较全面和充分的,下面就分享大致的演讲内容:

18910
来自专栏探码科技

2018年全球大数据公司全景画像汇总

伟大的力量,伟大的责任,2018年全球大数据公司全景画像汇总。未来的公司,都可以称为数据公司;不掌握数据的公司,如盲人般看不到未来。所以,从互联网巨头到创业新贵...

51000
来自专栏数据库新发现

Oracle Database 19c 的10大新特性早知道

在 ACOUG 年会的活动上,分享了一些从前未曾分享过的内容,想起,今年还欠下一篇文章,就整理和回顾一下,分享我所见到的Oracle 19c的一些重要改变(本文...

2.3K10
来自专栏黑泽君的专栏

如何创建/修改远程仓库 + 如何删除远程仓库 + 如何删除远程仓库中的某个文件或文件夹 + 如何使用git将本地仓库连接到多个远程仓库

首先我们来区分一些概念、术语、名词。不然脑子一锅粥,总是晕!!! 博主对此深有体会!从中学到了没事要多总结、多归类!

32220
来自专栏aoho求索

MySQL探秘(八):InnoDB的事务

 事务是数据库最为重要的机制之一,凡是使用过数据库的人,都了解数据库的事务机制,也对ACID四个基本特性如数家珍。但是聊起事务或者ACID的底层实现原理,往往言...

9430
来自专栏编程微刊

小程序云开发四:向云数据库插入一条数据

上一篇的文章里,有提到像数据库里面插入一条数据,今天主要是把《小程序云开发:向云数据库插入一条数据》单独拉出来写个小的demo,方便记忆和理解。 参考文档: ...

58230
来自专栏分布式系统进阶

使用多数据中心部署来应对Kafka灾难恢复(一)使用多数据中心部署来应对灾难恢复

数据中心宕机和数据丢失能导致企业损失很多收入或者完全停摆。为了将由于事故导致的宕机和数据丢失带来的损失最小化,企业需要制定业务可持续性计划和灾难恢复策略。

18220
来自专栏IT大咖说

非常全的Web开发学习总结(4张高清大图)

内容来源:原作者——amranahmedse,原文——https://github.com/kamranahmedse/developer-roadmap;译者...

11340
来自专栏生信宝典

AnimalTFDB 3.0 | 动物转录因子注释和预测的综合资源库

转录因子(Transcription factor,TF)是一类能够以序列特异性方式结合DNA并对基因转录起关键调控作用的蛋白质,在各种生物过程和疾病发生中起非...

1.5K30

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励