文章出處

  在開發業務層數據的時候,我總是擔心數據層給我返回的對象實例為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();
 }

  現在媽媽再也不用擔心我調用數據層的對象實例報空引用了,當然這種方式并不僅限于在數據層使用


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()