我正在考虑构建一些通用扩展,这些扩展将采用所有这些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,所以在调用者你必须执行空检查返回的对象所以我想到了一些可以让我在链接电话时轻松执行这些检查的东西。
更新:我将不得不考虑更多内容并更改API以使意图明确,代码更具可读性。
我认为这个想法根本没有完善,而且我确实用这些方法走得太远了。
无论如何,我现在就离开它。
答案 0 :(得分:6)
听起来您正在描述代码合同:http://msdn.microsoft.com/en-us/devlabs/dd491992
答案 1 :(得分: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)));
然而,正如您所看到的,这不是最易读的代码。这并不是说Chain扩展方法很糟糕(它肯定有它的用途),但是这种Chain扩展方法肯定会被滥用,所以谨慎使用或者编程过去的鬼魂会回来困扰你。