2012-12-18 34 views
0

当没有任何实现细节可用于代码的当前范围时,应使用接口。为什么要抽象数据访问层?

当您可以使用一些实现细节时,应该使用摘要。

查询 - 为什么仍然需要这些条款?为什么Business对象不能直接与DataAccess.SqlServer Layer进行通信?

+3

更好的分层,更好的抽象,更松散的耦合 - 需要我继续吗? – duffymo

+2

对不起老兄...这太开放了...你可能会把这个问题关闭,因为这个问题太开放了......但对于duffymo而言,松耦合是一个主要原因......如果你问这个问题,我怀疑你从来没有经历过大型项目重构的困境。 – Rikon

+2

我认为你的问题会更适合http://programmers.stackexchange.com/ – Fabio

回答

6

当没有任何实现细节是 可用于代码的当前范围时,应使用接口。

不是。你所指的是封装。有“信息专家”的概念。只有知道如何做某事的班级应该是这样做的班级。接口用于多态和解耦。当消费代码想要以同样的方式处理某些类型的对象时,该代码可以以相同的方式将所有这些对象用作接口类型。

当一些执行细节 提供给您

我不知道你的意思在这里文摘应该被使用。我觉得你很困惑,因为这听起来不对。抽象类的使用方式与接口相同,只是它们允许在其中实现。

查询 - 为什么仍然需要这些条款?为什么业务对象 不能与DataAccess.SqlServer层直接通信?

它们可以但是以可维护性,灵活性和可测试性为代价。如果要将数据层替换为另一个数据层,则不能这样做,因为消费代码对当前数据层有直接依赖关系。如果你想单元测试你的逻辑,你不能没有击中数据库。如果您将数据库类放在接口后面,则可以在单元测试中模拟数据层,并测试您的逻辑类而不碰到数据库。

非常简短的例子

public Foo FooLogic 
{ 
    IFooData fooData = DataAccessFactory.GetDataClass<IFooData>(); 
    return fooData.GetFoo(); 
} 

现在你的逻辑类不依赖于特定的数据类。工厂可以返回一个真正的FooData实现,或者它可以返回一个模拟数据对象,或者可以放置一个新的数据访问层,而不会影响逻辑类中的代码。

+0

+1。你能举出最后一段的简短例子吗? – Pankaj

+0

@ytftyffty完成。希望能帮助到你。 –

+0

@abcdefghi这有帮助吗? –