关于封装的思考

原创 2007年09月12日 21:33:00
我们一直都在谈“封装”,这个概念理解起来很容易,但是真正实践起来却很困难。

.......
       if(mClients.ContainsKey(clientID))
             return;
       ResponseNotification(clientID);
.......

private void ResponseNotification(string clientID)
{
      .........
      ClientType = GetClient(clientID);
      .........
}

在上面这段代码中,关于clientID的检查,是应该在ResponseNotification之中还是在ResponseNotification之前?

还有下面一段代码:

        public void RefreshClientInfoByReservations(OpenActivity.Contract.Reservation.ReservationType[] reservations)

        {

            if (reservations == null || reservations.Length == 0)

                return;//这个判断应放在函数之外还是函数里面

 

            //get clientid from resevation

            List<long> newClientIDs = new List<long>(4);

            foreach (OpenActivity.Contract.Reservation.ReservationType reservation in reservations)

            {

                if (!mClientInfo.ContainsKey(reservation.ClientID)

                    && !newClientIDs.Contains(reservation.ClientID))

                {

                    newClientIDs.Add(reservation.ClientID);

                }

            }

 

            if (newClientIDs.Count == 0)

                return;

 

            //search the client with the new client

            AddClientInfoToCache(newClientIDs.ToArray(), mClientInfo);

 

        }
关于对reservations数组的检查,应该放在函数的外面还是函数的里面?
对于这个问题,我自己也很矛盾。
将reservations的检查放在函数里面的理由:
保证在函数被调用时,不会因为reservations为空而抛出异常;并且从调用者的角度来看,在客户将reservations交给这个函数处理的时候,客户也不用考虑reservations是否为空,这也符合了一个原则,让调用变得简单。

将reservations的检查放在函数的外面的理由:
或者说是不在函数里对reservations数据进行检查,函数假定交给它处理的数据都是不为空的。那么我们按照这种假设来写代码,如果在测试的过程中,这个函数抛出了reservations为空的异常,那么这时问题出在什么地方呢?难道问题处在函数在使用reservations值的时候没有对reservations数据做检查吗?如果我们这样思考的话,就有点犯头疼医头,脚疼医脚的毛病了。我们要做的是找出让reservations为空的原因。当我们找到原因后,我们要做一个判断:这个原因是合法的吗?如果是合法的,那么我们在调用这个函数的时候,就要对reservations进行判断;如果是非法的,呵呵,那我们就发现bug了,然后我们要改掉这个bug;如果将reservations的判断放在函数里面,那么这个bug就被这个函数吞掉了,然后会随着程序控制流,传到程序后面的调用中。

讨论到这里,这让我想起了另外的一个问题:什么是健壮的程序?


关于这个问题,我认为我没有思考清楚。还请各位多多指教。

Rtrofit 2.0 封装 借鉴和思考。

我这里借鉴了许多博客。 在这里谢谢各位博主,但是我真的是不好找你们的链接。如果下次遇上了,在添加进来。希望你们不要见怪。0.怎么封装比较好 0.1 怎么封装Heads Token,自定义参数。...
  • IT_peng
  • IT_peng
  • 2016年08月18日 15:15
  • 447

【JAVA语言程序设计基础篇】--图形-- 绘制封装表格类的思考

开始用的方法没有体现类的封装性 没有类的普遍性 package chapter15; import java.awt.*; import javax.swing.*; @SuppressWar...

Go游戏服务器开发的一些思考(二十四):命令行库封装技巧

为什么使用命令行通常,游戏开发时,服务器端会使用配置文件,如json文件来配置启动时的程序参数。这样做有一个问题,配置文件会导致 Docker Swarm编排脚本变的复杂,难写。相反Docker Sw...

像计算机科学家一样思考Python

  • 2017年11月24日 17:16
  • 48.39MB
  • 下载

ThinkonyourFeet驻足思考

  • 2017年11月23日 14:42
  • 2.69MB
  • 下载

深度思考Java成员变量的初始化

上次同学问我Java的初始化问题时,我只是简单的告诉了他答案,今天参考CSDN博主 luohuacanyue (博客地址见参考)写的 深度思考Java成员变量的初始化 ,谈谈自己对这个的理解。 ...

大数据思考

  • 2017年05月26日 17:08
  • 1.57MB
  • 下载

版本管理-SVN爆红详细解决方案及可能带来的隐患思考附录(三)

SVN冲突爆红后如何通过颜色和快捷键准确无误地合并代码(一) 和 版本管理-SVN爆红详细解决方案及可能带来的隐患思考(二),代码合并后的文件,SVN文件,想合并到SVN文件作为附录放到这里。...

对陷门单向函数模型的新思考

  • 2016年02月16日 18:33
  • 104KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于封装的思考
举报原因:
原因补充:

(最多只允许输入30个字)