簡體   English   中英

通過使用lambda避免空檢查

[英]Avoid Null Checking by using lambdas

在本文中, 通過將出納員替換為出納員來避免空檢查,作者提供了一個Ruby示例來避免空檢查,如果返回了對象,則運行該塊,否則返回。

 data_source.person(id) do |person|
  person.phone_number = phone_number
  data_source.update_person person
end

我想使用Lambda函數在C#中執行相同的操作,但是想出一個執行相同類型操作的示例時遇到麻煩。 您是否將創建對象工廠以接受ID號以及lambda函數?

好吧,我不了解Ruby,也不了解給出的確切示例,但我懷疑這會是這樣的:

dataSource.Update(id, person => person.PhoneNumber = phoneNumber);

其中DataSource.Update將:

  • 具有類似void Update(string id, Action<Person> updateAction (或可能返回bool以指示是否找到該人)之類的簽名
  • 實施為:
    • 查找具有給定ID的人
    • 如果不存在,請立即返回
    • 否則,執行給定的操作,並使用修改后的對象更新后備存儲

或更籠統(更接近原始Ruby):

dataSource.WithPerson(id, person => {
    person.PhoneNumber = phoneNumber;
    dataSource.UpdatePerson(person);
};

就我個人而言,我更喜歡第一種形式:它更加詳細地說明了要實現的目標,但這很可能有助於實現更好的實現,並且在調用代碼中肯定更干凈。

另一種方法是使用Maybe monad

這將允許您保持現有的API不變,即,您仍然可以具有dataSource.GetPersonById(id)

使用Maybe monad的代碼如下所示:

dataSource.GetPersonById(id)
          .Maybe()
          .Do(person => {
                            person.PhoneNumber = phoneNumber;
                            dataSource.UpdatePerson(person);
                        });

為了能夠使用Maybe monad,您需要在以下段落中具有代碼。
它的基礎是Daniel Earwicker鏈接的博客文章中的代碼。
我對其進行了擴展,以添加Maybe擴展方法並進行編譯。

public struct MaybeMonad<T> where T : class
{
    private readonly T _value;

    public MaybeMonad(T value)
    {
        _value = value;
    }

    public MaybeMonad<TResult> Select<TResult>(Func<T, TResult> getter)
        where TResult : class
    {
        var result = (_value == null) ? null : getter(_value);
        return new MaybeMonad<TResult>(result);
    }  

    public TResult Select<TResult>(Func<T, TResult> getter,
                                   TResult alternative)
    {
        return (_value == null) ? alternative : getter(_value);
    }

    public void Do(Action<T> action)
    {
        if (_value != null)
            action(_value);
    }
}

public static class Maybe
{
    public static MaybeMonad<T> From<T>(T value) where T : class
    {
        return new MaybeMonad<T>(value);
    }
}

public static class MaybeMonadExtensions
{
    public static MaybeMonad<T> Maybe<T>(this T value) where T : class
    {
        return new MaybeMonad<T>(value);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM