使用lambdas避免Null检查

Mic*_*ael 1 c# ruby lambda null-check

在本文中,通过使用计数器替换finders来避免Null Checks, 作者给出了一个Ruby示例以避免空检查,如果返回该对象则运行该块,如果不是则则不运行.

 data_source.person(id) do |person|
  person.phone_number = phone_number
  data_source.update_person person
end
Run Code Online (Sandbox Code Playgroud)

我想在C#中使用lambda函数做同样的事情,但是遇到一个做相同类型事情的例子时遇到了麻烦.你会创建对象工厂来接受id号和lambda函数吗?

Jon*_*eet 5

好吧,我不知道Ruby并且不理解给出的确切示例,但我怀疑它会是这样的:

dataSource.Update(id, person => person.PhoneNumber = phoneNumber);
Run Code Online (Sandbox Code Playgroud)

会在哪里DataSource.Update:

  • 有一个像void Update(string id, Action<Person> updateAction(或可能返回一个bool表示是否找到该人)的签名
  • 实施为:
    • 找到具有给定ID的人
    • 如果不存在,请立即返回
    • 否则,执行给定操作,并使用修改后的对象更新后备存储

或者更普遍(并且更接近原始Ruby):

dataSource.WithPerson(id, person => {
    person.PhoneNumber = phoneNumber;
    dataSource.UpdatePerson(person);
};
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢第一种形式:它更具体地说明它正在尝试实现的目标,但这很可能有助于实现更好的实现,并且它在调用代码中肯定更清晰.