我听说Liskov替换原则(LSP)是面向对象设计的基本原则.它是什么以及它的使用例子是什么?
oop liskov-substitution-principle definition design-principles solid-principles
在C#泛型之前,每个人都会通过创建实现IEnumerable的集合库来为其业务对象编写集合
IE:
public class CollectionBase : IEnumerable
Run Code Online (Sandbox Code Playgroud)
然后从中派生出他们的Business Object集合.
public class BusinessObjectCollection : CollectionBase
Run Code Online (Sandbox Code Playgroud)
现在使用通用列表类,是否有人只使用它?我发现我使用了两种技术的妥协:
public class BusinessObjectCollection : List<BusinessObject>
Run Code Online (Sandbox Code Playgroud)
我这样做是因为我喜欢强类型名称而不是仅仅传递列表.
你的方法是什么?
类似的还有这与正确的输入和输出类型涉及几个问题是这样.我的问题更多的是正确的做法,方法命名,选择参数类型,事故等维护中的唤醒IEnumerable.
Linq几乎所有地方都处理,IEnumerable而这不是它,但它也引入了一些我们称之为延迟执行的异类.现在,当我们认为最好的想法是采用最基本的类型时,我们可能在设计我们的方法(特别是扩展方法)时出错了.所以我们的方法看起来像:
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> lstObject)
{
foreach (T t in lstObject)
//some fisher-yates may be
}
Run Code Online (Sandbox Code Playgroud)
显而易见的危险是当我们将上述功能与懒惰混合Linq并且如此易受影响时.
var query = foos.Select(p => p).Where(p => p).OrderBy(p => p); //doesn't execute
//but
var query = foos.Select(p => p).Where(p => p).Shuffle().OrderBy(p => p);
//the second line executes up to a point.
Run Code Online (Sandbox Code Playgroud)
澄清上面这一行 - 我的问题不是关于第二个表达没有得到评估,严重不是.程序员都知道.我担心的是Shuffle到目前为止实际执行查询的方法.查看第一个查询,其中没有任何内容被执行.现在类似于构造另一个Linq表达式(应该稍后执行)时,我们的自定义函数正在播放spoilsport.换句话说,如何让调用者知道Shuffle并不是他们在Linq表达点上想要的那种功能.我希望这一点被带回家.道歉!:)虽然它就像去检查方法一样简单,但我问你们通常如何防御性地编程......
上面的例子可能没那么危险,但你明白了.这是某些(自定义)函数与Linq延迟执行的想法不相符.问题不仅在于性能,还在于意外的副作用. …
c# ×2
.net ×1
class-design ×1
collections ×1
definition ×1
generics ×1
ienumerable ×1
linq ×1
liskov-substitution-principle ×1
oop ×1
parameters ×1