【问题标题】:Where to put abstractions in SOLID programming? [closed]在 SOLID 编程中将抽象放在哪里? [关闭]
【发布时间】:2013-07-21 02:10:16
【问题描述】:

我在 XNA 中开发了一个游戏引擎。这个引擎有一些模块(子项目),比如Renderer、StateManagement等。

参考依赖倒置原则:“高级模块不应该依赖低级模块。两者都应该依赖于抽象。”我的问题是:我应该在哪里实践这些抽象?我应该创建一些具有相应抽象组的项目,还是创建一个具有我引擎的所有抽象的项目?第一个解决方案会弄乱我的项目结构,第二个解决方案将要求创建具有大量抽象类的项目,所有其他项目都依赖于它。也许有更好的解决方案?

【问题讨论】:

    标签: design-patterns interface dependency-injection abstraction solid-principles


    【解决方案1】:

    虽然有时人们确实将他们的接口放在单独的项目中,但通常这些接口只是简单地与他们的实现并排放置。有人可能会争辩说,使用单独的项目可以确保为这些接口编写一个代码,但我发现最好依靠纪律和依赖项发现工具来确保你编写到接口的代码。

    【讨论】:

    • 需要注意的是,这些类型的接口(尤其是那些与它们的实现并排放置的接口)通常根本不是抽象,它们只是为了适应 IoC 的一个间接层。例如,IFooRepository 并不比 FooRepository 更抽象。
    • 通常,是的。但尤其是在构建库或框架时,通常会有明智的基本实现,明确的意图是在特定项目中添加更具体的实现。在这种情况下,这些抽象很可能成为库本身的重要组成部分。
    • 虽然我有时确实将接口放置在靠近实现的位置,但请注意违反Reused Abstraction Principle
    • 一个接口总是至少有两种实现;一个用于测试。
    • @Steven 那里有有趣的文章。那么你的单元测试和模拟方法是什么?我们有许多类是我们项目中接口的单一实现,因为稍后在测试消费者类时能够模拟所述依赖项。大多数模拟框架只能模拟接口或虚拟方法/抽象类。我发现从我的类中删除sealed 并将所有方法标记为虚拟而不是让接口支持它们进行测试要糟糕得多。根据那篇文章,我们的这些接口是难闻的气味,那么正确的做法是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多