.......
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就被这个函数吞掉了,然后会随着程序控制流,传到程序后面的调用中。
讨论到这里,这让我想起了另外的一个问题:什么是健壮的程序?
关于这个问题,我认为我没有思考清楚。还请各位多多指教。