空对象模式
在开发业务层数据的时候,我总是担心数据层给我返回的对象实例为null。
所以,每次使用数据层返回的对象实例我都要判断下是否为null
UserRepository respository = new UserRepository(); var user = respository.GetById("008"); if (user!=null) { user.SayHello(); }
虽然这样是避免了因为空值引发异常的问题,但是这样增加了客户端代码的很多工作量,而且一旦某个地方忘记判断,我的代码就会出现空异常;为了解决这个问题,我们引入了空对象模式,将空对象扼杀在数据的源头
public interface IUser { void SayHello(); }
public class User : IUser { public string Id { get; private set; } public User(string id) { Id = id; } public void SayHello() { Console.WriteLine("{0}:Hello", Id); } }
public class NullUser : IUser { public void SayHello() { //对于空对象实例来说,它的任何方法都应该不用做任何处理 } }
public class UserRepository { private ICollection<User> users; public UserRepository() { users = new List<User>() { new User("001"), new User("002"), new User("003"), new User("004"), new User("005") }; } public IUser GetById(string userId) { IUser user = users.SingleOrDefault(s => s.Id == userId); if (user == null)//检查User的实例是否为null,如果是返回一个特殊的Iuser { user = new NullUser(); } return user; } }
在上面的代码中,我们在数据层中直接就判断了user实例是不是为null,如果为null,就返回一个用作null值处理的对象实例
static void Main(string[] args) { UserRepository respository = new UserRepository(); var user = respository.GetById("008"); user.SayHello(); user = respository.GetById("003"); user.SayHello(); Console.ReadLine(); }
现在妈妈再也不用担心我调用数据层的对象实例报空引用了,当然这种方式并不仅限于在数据层使用