保持类松散耦合是编写易于理解,修改和调试的代码的一个重要方面 - 我明白了.不过,作为一个新手,我几乎可以在任何时候超越最简单的例子.
我或多或少地了解如何在自己的类中封装字符串,整数和简单数据类型.当我开始处理富文本格式等信息时,事情变得非常复杂 - 除非我只使用组件中已有的各种方法.继续这个例子,假设我正在写一些包含UI中的RTF备忘录组件的东西.在Delphi中,该组件具有内置方法,可用于保存格式化文本.此外,有时看起来使用RTF文本本身的唯一(或至少是最好的)方法是通过再次内置到组件中的方法.
当我已经拥有一个为我完成所有这些操作的组件时,我将如何(或为什么)在另一个类中执行保存,加载和格式化文本的所有工作?
就我自己而言,我通常最终要么(a)做一些看起来比需要复杂得多的事情,重新发明已经存在的方法,或者(b)创建仍然紧密耦合到彼此的做得很差的类.正如他们在商业中所说的那样,"必须有更好的方法!"
我只是在概念上迷失了"更好的方式"的运作方式.有什么想法吗?
刚刚大学毕业,我遇到了一些需要减少耦合的代码.但我并不完全理解所有概念,并想要一个简单的例子来帮助我.为了让你开始,我有一个人类,一个字段,名称.我在该类中有一个方法来连接一些文本.
我知道这是一个愚蠢的例子,大多数人都不会考虑在这种简单的情况下减少耦合,但我只想要一个简单的例子来帮助我完全理解代码和概念.
在主窗口后面的代码中,我放了一个文本框和一个按钮.窗口加载时,它显示person x name字段的当前值.单击该按钮时,将调用x.PersonAddText方法.目前,此示例的耦合计算为8.按钮单击事件为3,窗口加载事件为3.
有没有办法,使用这个例子,我们可以将它们降低到低于它们中的一个或两个.
以下是我的所有代码:
我的人员类:
public class Person
{
//Fields
private string name;
//Properties
public string Name
{
get { return name; }
set { name = value; }
}
//Constructors
public Person()
{
name = "joe";
}
//Methods
public string PersonAddText(string text)
{
return name += " - " + text;
}
//Interfaces (or additional code below here please to aid understanding)
}
Run Code Online (Sandbox Code Playgroud)
我的守则背后:
Person x = new Person();
public MainWindow()
{
InitializeComponent();
}
private void …Run Code Online (Sandbox Code Playgroud) 在DLL边界暴露STL容器是不是一个好主意,一般不可能的(见这个答案为何,而这其中大约在DLL边界露出一个std ::列表).我需要能够在用不同的(VC08/VC10 +)编译器编译的DLL和EXE之间传递数据; 这个Q只涉及一切都是一样的.
揭露它们的最佳方式是什么?向量与列表有点不同,因为内存保证是连续的,所以如果我只需要一个双向的const向量,我可以只提供块的开始和结束指针到dll中的函数吗?dll还需要返回一些像向量数组的结构.
我想知道一个包含开始和结束指针的结构:
template <typename T>
struct vecWrapper<T> {
T* begin;
T* end;
}
// in the dll
int func(vecWrapper<double> numbers);
Run Code Online (Sandbox Code Playgroud)
这是明智的吗?据推测,从函数返回的任何内容都需要一个析构函数(在dll端),它会破坏它所指向的东西.
我在一次关于项目凝聚力和耦合的技术访谈中受到了质疑.我广泛地解释了他们的定义,尽管我没有正确回答问题的第二部分,正如他所说的那样.
"我们怎样才能在项目中同时实现高度内聚和松散耦合的设计,请解释如何在单一项目中实施这种方法?"
我回答说这两个目标是矛盾的,所以我们需要找出每个项目或模块的最佳选择,但我无法提供全面的答案.
如果有人帮助我,我将不胜感激.
例如,我有一个模型类来处理从其他iPhone接收蓝牙消息.当我收到其中一条消息时,我需要更新视图.我相信这样做的标准方法是通过视图控制器.视图控制器具有对模型和视图的引用,因此可以与它们中的每一个进行通信.
但是他们应该如何将消息发送回VC呢?他们可以每个都有一个对视图控制器的引用(作为属性,赋值不保留).那是不好的做法(如果我没弄错它的循环参考)?
有没有其他方法可以做到这一点?我已经考虑了委托模式,但是要编写一个完整的委托,对于一个简单的问题,所有这些似乎都是很多工作.或者,如果您认为我在思考这个问题,请随时告诉我!
[我觉得这个问题可能在之前出现过,看起来很常见,但我搜索了一下,并没有发现太多]
谢谢你的帮助,
这是关于这个(注入依赖)
private readonly ICustomerService _customerService;
public Billing(ICustomerService customerService)
{
_customerService = customerService;
}
Run Code Online (Sandbox Code Playgroud)
与此相比(创建依赖关系)
private readonly ICustomerService _customerService;
public Billing()
{
_customerService = new CustomerService();
}
Run Code Online (Sandbox Code Playgroud)
后一个样本所以他们说是坏的因为......它违反了DI ...当然没有注入任何东西......但是如果DI不存在怎么办,那么客户服务是从Billing类手动创建的又是什么呢?我认为没有关于Service接口可交换性的实际优势.
我要求一个带有源代码的实际例子可能是一个单元测试或者显示一个实际的解决方案,为什么它更松散耦合.
有人热衷于展示他的DI肌肉,以及为什么它有实际的存在和应用权利?
UPDATE
所以人们都没有读完所有我会在这里写下我的短暂经历:
DI作为模式具有实际用途.通过不手动注入所有服务来跟踪DI(一个糟糕的人工DI工具,所以他们说...)使用像LightCore/Unity这样的DI框架,但一定要使用正确的工具来完成相应的工作.这是我没有;-)开发一个mvvm/wpf应用程序我有其他要求LightCore/Unity工具无法支持他们甚至是一个障碍.我的解决方案是使用MEFEDMVVM,我很高兴.现在我的服务在运行时自动注入而不是在启动时.:-)
我无法理解依赖注入范围内IOC容器的好处.
考虑这个基本的例子:
App::bind('Car', function()
{
return new Car;
});
Route::get('/', function()
{
dd(App::make('Car')); // resolve it
});
Run Code Online (Sandbox Code Playgroud)
我没有看到使用IOC容器而不是在构造函数中创建新实例的好处.
除了测试好处,我读到原因是松耦合.
然而,由于'汽车'绑定只是返回一辆新车的实例,我没有看到这个例子在哪种意义上会更松散地耦合.
对我来说,这两个似乎做了完全相同的事情.
我需要在单位之间进行转换,每个单位有 2 个部分,它的名称和一个整数,整数部分可以是正数或负数。我需要我的Unit班级进行依赖注入并且松散耦合。例如,如果我将来需要添加某些内容,我不想更改使用该类的其他类。
Convert()我的单位类中也应该有一个方法可以在单位之间进行转换。我查看了这些链接:
但这些似乎松散耦合。
请让我知道这个问题的推荐设计模式,
c# design-patterns dependency-injection loose-coupling unit-conversion
从我对 OO 设计/模式/原则的所有阅读和研究中,我发现普遍的共识是松耦合(和高内聚)几乎总是更好的设计。我完全同意从我过去的软件项目经验中发言。
但是,假设某个特定的软件公司(我不在其中工作)有一些设计有问题的大型软件,可以与某些硬件进行交互。这些模块(我从未研究过)是如此紧密耦合,并且函数调用可以深入 20 多个级别来管理状态。类边界从来没有明确定义,用例也没有考虑清楚。一个优秀的软件开发人员(不是我)会提出这些问题,但只会被更高级的开发人员拒绝,因为开发实践(如 SOLID 或 TDD)并不真正适用,因为该软件已经使用“传统”方法运行多年,再改变也晚了。客户(我不知道他们是谁)最大的抱怨是产品质量。
由于上述不切实际的场景(我从来没有分开过),我想过是否存在首选甚至需要紧耦合的情况?什么情况下开发人员需要跨越模块边界并共享状态并增加依赖性并降低可测试性?有哪些系统如此复杂以至于需要这样做?我自己想不出一个好的案例,所以我希望一些更有经验的工匠可以帮助我。
谢谢。再说一遍,我不知道这家公司。
我正在尝试使用纯 javascript Web 组件进行无框架工作。我希望我的 Web 组件能够独立工作并在不同的站点上使用,但我也希望两个组件能够进行通信。因此它们应该能够在不紧密耦合的情况下进行通信。
当我使用 Angular 时,这很容易。我可以通过 HTML 属性将对象传递给组件,并且组件将其作为对象而不是字符串接收。但在纯 JavaScript 中,属性始终是字符串。传递对象或以其他方式使 Web 组件相互了解并能够进行通信的正确方法是什么?
loose-coupling ×10
c# ×3
oop ×3
coupling ×2
decoupling ×2
c++ ×1
cocoa-touch ×1
cohesion ×1
dll ×1
ios ×1
java ×1
javascript ×1
laravel-4 ×1
php ×1
stl ×1
unit-testing ×1