我似乎无法理解"松耦合"的概念.我想这不利于单词"宽松"通常有负面的含义,所以我总是忘了松耦合是一个很好的事情.
有人请展示一些说明这个概念的"之前"和"之后"代码(或伪代码)吗?
我们一直在使用松散耦合和依赖注入开发代码.
许多"服务"样式类都有一个构造函数和一个实现接口的方法.每个单独的课程都很容易理解.
但是,由于耦合的松散性,查看一个类不会告诉你它周围的类或它在更大的图片中的位置.
使用Eclipse跳转到协作者并不容易,因为你必须通过接口.如果接口是Runnable,那么找到实际插入的类是没有帮助的.真的有必要回到DI容器定义并尝试从那里解决问题.
以下是依赖注入服务类的一行代码: -
// myExpiryCutoffDateService was injected,
Date cutoff = myExpiryCutoffDateService.get();
Run Code Online (Sandbox Code Playgroud)
这里的耦合尽可能宽松.到期日以字面意思以任何方式实施.
这是一个更加耦合的应用程序中的样子.
ExpiryDateService = new ExpiryDateService();
Date cutoff = getCutoffDate( databaseConnection, paymentInstrument );
Run Code Online (Sandbox Code Playgroud)
从紧密耦合的版本,我可以推断截止日期是通过使用数据库连接的支付工具以某种方式确定的.
我发现第一种风格的代码比第二种风格的代码更难理解.
您可能会争辩说,在阅读本课程时,我不需要知道截止日期是如何计算出来的.这是真的,但是如果我正在缩小某个bug或者在增强需要插入的地方工作,那么这是有用的信息.
还有其他人遇到过这个问题吗?你有什么解决方案?这只是要调整的东西吗?是否有任何工具可以显示类连接在一起的方式?我应该让这些课程更大或更多吗?
(故意将这个问题与容器无关,因为我对任何答案感兴趣).
当我看到ASP.NET MVC项目时,我每次都看到松耦合架构.
为什么我需要在Web架构中松散耦合(如果我不进行单元测试)?
有什么优点和缺点的呢?
分层/类的主要原因是什么?
如果我不想改变我的DAL怎么办?我的意思是什么时候才能改变我的整个DAL?!所以我可以将我的DAL耦合到UI.这有什么不好的?
C#使用依赖注入(DI)来构建无损且可测试的平台.为此,我需要一个interface也许是DI或Inversion of Control(IoC)容器来解析我的实例.
但是你如何在C++中做到这一点? 我已经阅读了一些关于这一点,似乎C++中的依赖注入并不像C#那样大.在C++中,您使用对象的引用 - 这是在C++中使用DI的方法,对吧?
如果我的参考理论是正确的,是否有类似容器的东西,我可以解决所有的参考?在C#中,我有一个"bad class/bad project/assembly"在程序启动时将我的所有实例注册到静态容器中.然后,在每个类中,我能够实例化静态容器并且可以解析特定实例,这在C++中是否可行?
您是否在C++中使用依赖注入(或其他任何名称)?如果是的话,你是如何使用它的?与C#有相似之处吗?
c# c++ dependency-injection inversion-of-control loose-coupling
最近我看到很多关于如何构建松耦合应用程序的博客文章.在创建松散耦合的应用程序时,您最常使用哪些模式?依赖注入?控制倒置?
例如,假设我想从某处获取文件列表,然后加载这些文件的内容,最后将它们显示给用户.在同步模型中,它将是这样的(伪代码):
var file_list = fetchFiles(source);
if (!file_list) {
display('failed to fetch list');
} else {
for (file in file_list) { // iteration, not enumeration
var data = loadFile(file);
if (!data) {
display('failed to load: ' + file);
} else {
display(data);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这为用户提供了不错的反馈,如果我认为有必要,我可以将代码段移动到函数中.生活是简单的.
现在,粉碎我的梦想:fetchFiles()和loadFile()实际上是异步的.简单的方法是将它们转换为同步函数.但是,如果浏览器锁定等待呼叫完成,这并不好.
如何处理多个相互依赖和/或分层的异步调用,而无需深入研究无穷无尽的回调链,以经典的简化方式进行传播?是否有一种经过验证的范例可以在保持代码松散耦合的同时干净地处理这些问题?
考虑以下代码:
public class MyClass()
{
public MyClass()
{
}
public DoSomething()
{
using (var service = new CustomerCreditServiceClient())
{
var creditLimit = service.GetCreditLimit(
customer.Firstname, customer.Surname, customer.DateOfBirth);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我们现在想重构它以松散地耦合它.我们最终得到这个:
public class MyClass()
{
private readonly ICustomerCreditService service;
public MyClass(ICustomerCreditService service)
{
this.service= service;
}
public DoSomething()
{
var creditLimit = service.GetCreditLimit(
customer.Firstname, customer.Surname, customer.DateOfBirth);
}
}
Run Code Online (Sandbox Code Playgroud)
看起来不错吧?现在任何实现都可以使用该接口,一切都很好.
如果我现在说实现是一个WCF类并且重构之前的using语句是有原因的,那该怎么办?ie /关闭WCF连接.
所以现在我们的接口必须实现一个Dispose方法调用,或者我们使用工厂接口来获取实现并在其周围放置一个using语句.
对我来说(尽管这个主题是新的),这似乎是一个漏洞的抽象.我们不得不在代码中添加方法调用,只是为了实现处理内容的方式.
有人可以帮助我理解这一点并确认我是对还是错.
谢谢
我很难看到松耦合代码的真实好处.为什么花费这么多精力使灵活的东西与各种其他物体一起工作?如果你知道你需要实现什么,为什么不专门为此目的编码?
对我来说,这类似于创建无类型变量:它使它变得非常灵活,但是它可能会导致问题,因为可能传入了一个意外的值.它也使得它更难阅读,因为你没有明确知道传入的是什么.
然而我觉得强烈打字是受鼓励的,但松散耦合是不好的.
编辑:我觉得我对松散耦合的解释是关闭还是其他人正在以错误的方式阅读它.与我的强耦合是当一个类引用另一个类的具体实例时.松散耦合是指类引用另一个类可以实现的接口.
那么我的问题是为什么不专门调用类的具体实例/定义?我将其类比为具体定义您需要的变量类型.我一直在阅读关于依赖注入的一些内容,他们似乎认为松散耦合更好的设计是事实.
我最近一直在做关于SOA和ESB等的大量研究.
我现在正在努力重新设计一些遗留系统,并且希望使用比现有更多的SOA架构来构建它.我们在大约5个网站中使用这些服务,我们现在使用我们的遗留系统遇到的最大问题之一就是我们几乎所有时间都在进行错误修复或更新时需要重新部署我们的5个网站,这些网站可能是非常耗时的过程.
我的目标是使服务之间的接口松散耦合,以便可以在不必重新部署所有相关服务和网站的情况下进行更改.
我需要能够扩展现有的服务接口,而不会破坏或更新任何依赖项.有没有人遇到过这个问题?你是怎么解决的?
我在一次关于项目凝聚力和耦合的技术访谈中受到了质疑.我广泛地解释了他们的定义,尽管我没有正确回答问题的第二部分,正如他所说的那样.
"我们怎样才能在项目中同时实现高度内聚和松散耦合的设计,请解释如何在单一项目中实施这种方法?"
我回答说这两个目标是矛盾的,所以我们需要找出每个项目或模块的最佳选择,但我无法提供全面的答案.
如果有人帮助我,我将不胜感激.
loose-coupling ×10
c# ×3
oop ×3
.net ×1
architecture ×1
asp.net ×1
asp.net-mvc ×1
asynchronous ×1
c++ ×1
cohesion ×1
esb ×1
java ×1
javascript ×1
soa ×1
waterfall ×1