存在两种设计模式,即依赖注入和依赖性反转,文章在网上试图解释差异.但是,用更容易的话来解释它的必要性仍然存在.那里有人来接?
我需要在PHP中理解它.
php design-patterns dependency-injection dependency-inversion
我目前正在考虑"如何设计一个OSGi组件,以便使用jUnit和Mockito等框架轻松编写测试".
由于OSGi强化了DIP (依赖性倒置原则)并且通常存在注入器方法(例如设置器),因此模拟捆绑间依赖性非常容易.
但是捆绑内部依赖呢?
例如,看看这种情况.现在我想将它带入一个OSGi上下文...我们希望在OSGi平台中提供任何类型的网络协议作为声明性服务,并希望编写单元测试来测试直接与之交互的较低网络代码套接字对象.
如果我们将套接字创建重构为一个单独但仍然捆绑的内部POJO (Plain Old Java Object)类,我们应该如何将它注入协议实现?
我知道R主要是一种功能语言.但是,它确实也有非常强大的面向对象的内置加:我看不出这有什么错模仿OOD原则/行为,当你
知道你是面向对象语言的原型,如C#,Java等.
您的应用程序原型需要自给自足("完整堆栈",包括DB后端,业务逻辑和前端/ UI)
你拥有像R6 这样伟大的 "原型技术"并且可以随意使用
我的用于Web应用程序的R原型需要"完全堆栈"/自给自足,并且尽可能接近我们的生产语言中使用的设计模式/原则和依赖注入容器(R中简单DI的概念证明)(C#/.净).
在这方面,我开始喜欢使用接口(或抽象类)来解耦代码模块并遵守OOD的SOLID原则的D(依赖性反转原则)(详见 "Uncle Bob") ).
尽管R6没有明确支持接口,但我仍然可以完全模仿它们,除了"抽象方法"之外什么都没有定义R6类(参见下面的例子).这有助于我将我的软件设计传达给我们不熟悉R的OO程序员.我努力为他们提供尽可能少的"概念转换努力".
但是,当我真正想从其他具体(而不是"类似抽象的"模仿接口类)继承时,我需要放弃我的inheritin R6Classfor 值,因为这将意味着定义不是一个但是两节课.inherit
在依赖倒置之前:
Foo取决于具体的课程Bar.从OOD原则来看,这非常糟糕,因为它导致代码紧密耦合.
Bar <- R6Class("Bar",
public = list(doSomething = function(n) private$x[1:n]),
private = list(x = letters)
) …Run Code Online (Sandbox Code Playgroud) 我正在使用.NET Core依赖注入,但是当我试图在另一个类中获取服务时,我得到'IServiceProvider.GetService(Type)'不能与类型参数一起使用'错误.
这个错误意味着什么?我知道泛型类型的参数是这样的:GenericInterface <>,而GetService方法不会将GenericInterface <>作为参数.
为什么我会收到此错误,如何解决?
界面
public interface IService
{
void Process();
}
Run Code Online (Sandbox Code Playgroud)
实现接口的类
public class Service : BaseService<IConfig, SomType>
{
public Service(
ILogger logger : base(logger)
{
}
...
}
Run Code Online (Sandbox Code Playgroud)
BaseService类是一个抽象类,它实现了IService接口.
public abstract class BaseService<TConfig, TE> : AnotherBaseService, IService where TConfig : IConfig where TE : struct, IConvertible
{
protected BaseService(ILogger logger): base(logger)
{
}
...
}
Run Code Online (Sandbox Code Playgroud)
AnotherBaseService
public abstract class BaseService
{
protected readonly ILogger Logger;
protected BaseService(ILogger logger)
{
Logger = logger;
}
...
}
Run Code Online (Sandbox Code Playgroud)
我是如何注册的. …
我无法弄清楚依赖性反转原理(SOLID原则之一)与通用"代码到接口"或分离接口模式之间的区别.他们都提倡创建一个抽象层来分离较低级别和较高级别的模块.
DI原则设想创建在更高层和更低层模块之间交互的接口,但也坚持接口必须是更高层包的一部分.
为什么这应该是更高层次而不是更低层次的一部分?它是暴露其行为的较低级别,所以解耦接口不应该是较低级别的一部分吗?如果有多个更高级别的模块取决于相同的较低级别怎么办?
或者,
为什么不制作一个单独的包来放置所有接口,然后可以被更高级别和更低级别使用?(这是分离接口模式设想的.)
我的困境是,我无法弄清楚它们的相对用途和好处.
请不要引用Derek Greer或Robert Martin的文章.我读过这些文章,但仍然存在混淆.
我正在阅读维基百科对依赖性倒置原则的定义,它使用两个术语高级模块和低级模块,我无法弄清楚.
他们是什么,依赖倒置原则与他们有什么关系?
language-agnostic dependencies module inversion-of-control dependency-inversion
由于PHP是一种松散类型的语言,如何在PHP中应用DIP原则?
一个实际的例子将不胜感激.
如果我想使用DIP开发一个假设的模块化C++项目.由于模块化,我选择在一个库中完全实现一个特定功能A.另一个库B(或两个或三个......)正在使用此功能(例如,日志记录机制):
class ILogger
{
virtual void log(const std::string& s) = 0;
};
Run Code Online (Sandbox Code Playgroud)
我应该把这个界面放在哪里?一些博主似乎建议,因为界面属于其用户(因为DIP),你应该将界面放在用户端(或这里).这也可以提高可测试性,因为您不需要任何实现链接到测试.
这意味着,库A本身不会编译,因为它缺少接口.这也意味着,如果库C也将使用日志记录工具,它还会引入一个接口ILogger,这将打破ODR?这可以通过引入仅包含接口的额外包层库来解决.但主要问题仍然存在:
在哪里放置界面?我阅读了关于DIP 的原始论文,但我不同意解释,我不应该将接口放入库中.我觉得这篇论文是作为如何思考开发的指导原则(因为"用户正在定义界面而不是实现者").它是否正确?你如何使用依赖倒置原则?
是否有人能够帮助说明JavaScript jQuery中的依赖倒置原则?
这将突出并解释这两点:
A.高级模块不应该依赖于低级模块.两者都应该取决于抽象.
B.抽象不应该依赖于细节.细节应取决于抽象.
什么是抽象或高/低级模块?
这真的有助于我理解,谢谢!
javascript jquery dependency-injection inversion-of-control dependency-inversion
oop ×3
dependencies ×2
java ×2
php ×2
.net-core ×1
c# ×1
c++ ×1
deployment ×1
glossary ×1
interface ×1
javascript ×1
jquery ×1
modularity ×1
module ×1
osgi ×1
principles ×1
r ×1
r6 ×1
unit-testing ×1