2

我正在考虑构建一些通用扩展,这些扩展将采用所有这些 null、抛出检查和断言的方式,而是使用流畅的 API 来处理这个问题。

所以我正在考虑做这样的事情。

Shall() - Not quite sure about this one yet
    .Test(...) - Determines whether the contained logic executed without any errors
    .Guard(...) - Guards the contained logic from throwing any exception
    .Assert(...) - Asserts before the execution of the code
    .Throw(...) - Throws an exception based on a certain condition
    .Assume(...) - Similar to assert but calls to Contract.Assume

用法:father.Shall().Guard(f => f.Shop())

问题是我不想在运行时进行这些额外的调用,而且我知道 AOP 可以为我解决这个问题,我想将这些调用直接内联给调用者,如果你有更好的方法,请告诉我。

现在,在我研究或做任何事情之前,我想知道是否有人已经做过或者知道正在做这件事的工具吗?

我真的很想构建类似的东西并将其发布给公众,因为我认为它可以节省大量时间和头痛。

一些例子。

DbSet<TEntity> set = Set<TEntity>();

if (set != null)
{
    if (Contains(entity))
    {
        set.Remove(entity);
    }
    else
    {
        set.Attach(entity);

        set.Remove(entity);
    }
}

对以下内容进行更改。

Set<TEntity>().Shall().Guard(set =>
{
    if (Contains(entity))
    {
        set.Remove(entity);
    }
    else
    {
        set.Attach(entity);

        set.Remove(entity);
    }
});

与其搞笑和取笑别人,有些人真的可以学到一些关于成熟的东西,你可以分享你的经验,告诉我这有什么好的或坏的,我会接受的。

我不是试图重新创建代码合同,我知道我每天都在使用它,我试图将编写的样板代码移动到一个地方。

有时您的方法对于每个调用都必须检查返回的对象而不是您的代码,因此您无法确保被调用者不会导致 null 因此在调用者中您必须对返回的对象执行 null 检查所以我想到了一些可以让我在链接调用时轻松执行这些检查的方法。

更新:我将不得不再考虑一下并更改 API 以使意图清晰并且代码更具可读性。

我认为这个想法根本没有完善,而且我确实在所有这些方法上走得太远了。

不管怎样,我暂时放下它。

4

2 回答 2

6

听起来您在描述类似代码合同的内容:http: //msdn.microsoft.com/en-us/devlabs/dd491992

于 2011-12-26T23:38:13.717 回答
0

如果我了解您要查找的内容,那么我想出的最接近的方法是扩展方法:

public static Chain<T>(this T obj, Action<T> act)
{
    act(obj);
    return obj;
}

这允许您执行以下操作:

Set.Remove(Set.FirstOrDefault(entity) ?? entity.Chain(a => Set.Add(a)));

但是,正如您所看到的,这不是最易读的代码。这并不是说链式扩展方法不好(它肯定有它的用处),但链式扩展方法肯定会被滥用,所以谨慎使用,否则编程过去的鬼魂会再次困扰你。

于 2013-04-16T16:02:48.427 回答