- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
刚从大学毕业,我遇到了一些我需要减少耦合的代码。但是我并不完全理解所有的概念,想要一个简单的例子来帮助我。为了让你开始,我有一个只有一个字段 name 的 person 类。我在那个类中有一个方法来连接一些文本。
我知道这是一个愚蠢的例子,大多数人永远不会考虑在像这样简单的情况下减少耦合,但我只想要一个简单的例子来帮助我一起完全理解代码和概念。
在主窗口后面的代码中,我放置了一个文本框和一个按钮。当窗口加载时,它会显示 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)
}
我的代码背后:
Person x = new Person();
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
txtname.Text = x.Name;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
txtname.Text = x.PersonAddText(txtname.Text);
txtname.Text = x.Name;
}
我的简单 XAML:
<Grid>
<TextBox Name="txtname" Margin="12,12,12,0" Height="23" VerticalAlignment="Top" />
<Button Content="Add Text" Margin="12,41,12,0" Name="button1" VerticalAlignment="Top" Click="button1_Click" />
</Grid>
我很难理解互联网上解释这一点的教程。据我所知,有 3 种方法可以做到这一点(如果可能的话,将我上面的代码转换为所有三种方法的示例会很好):
article解释我读过的东西非常好,但是这些例子与我无关,因为他使用的是 VB 和 ASP.Net 以及数据库连接字符串。这与我需要的完全相反,我不想在学习概念的同时考虑如何翻译代码,并考虑如何将其应用到相关的东西中。虽然这个例子很好,但太多了,我真的很感激任何额外的帮助。
编辑历史:更正拼写。添加以下内容以澄清我的问题:
我理解耦合和内聚背后的理论,以及为什么你应该减少一个而增加另一个。但是我们从来没有在大学里写过任何例子。此外,虽然没有在大学学习,但我确实了解接口(interface)。但是,我不明白如何使用它们来减少耦合。
添加了指向 the article I refrenced above 的链接.
编辑 2:到目前为止,我现在得到的是以下内容:
public interface IPerson
{
string Name { get; set; }
string PersonAddText(string text);
}
public class Person : IPerson
{
//The code from the person class above
}
我现在如何在后面的主窗口代码中使用它?我猜我应该更换
Person x = new Person();
与
IPerson x = new Person();
这是正确的吗?如果是这样,我还需要做什么吗?我问的原因是因为我仍然没有看到 visual studio 报告的代码耦合数字有任何减少(实际上,它在后面的主窗口代码上增加了 1)。
最佳答案
编辑
很高兴我的回答有所帮助,让我稍微更新一下。要将您的问题用作直接答案,您需要更改的只是您的字段声明:
Person x = new Person();
到
IPerson x = new Person();
您的代码隐藏现在知道您的接口(interface)中指定的属性和方法,并且耦合度大大降低,因为您可以将 new Person()
换成 new Student( )
稍后。只要对象实现了接口(interface)。 您的代码隐藏现在应该可以正常工作,无需任何必要的更改。
旁注
我建议考虑延迟加载 x
人,并使用具有更易识别名称的属性。注意这不回答你的问题,但它只是一个建议。 :)
private IPerson _CurrentPerson = null;
private IPerson CurrentPerson
{
get
{
if (this._CurrentPerson == null)
{
this._CurrentPerson = new Person();
}
return this._CurrentPerson
}
set
{
this._CurrentPerson = value;
}
}
解耦是指两个或多个代码块不应相互依赖。控制反转是指在运行时绑定(bind)对象的耦合,从而允许对象及其实例具有更大的灵 active ,从而减少耦合。控制反转最好与接口(interface)一起使用。接口(interface)定义 ClassA
将执行 MethodX
并具有 PropertyY
。我们的主要对象不关心在运行时返回什么对象,只要它能满足一个接口(interface),它就很高兴。
在你上面的例子中,你会想要连接你的 person 类,可能是这样的:
public interface IPerson
{
string Name { get; set; }
string PersonAddText(string text);
}
public class Person : IPerson
{
// your code here
}
然后,在您的主要方法调用中,您将使用实现接口(interface) IPerson
的对象实例,而不是显式使用 Person
对象。接口(interface)和对象的“ Hook ”可以通过各种不同的库来实现,这将有助于设置您的依赖关系。根据我的经验,我使用过 StructureMap和 Microsoft's Enterprise Library .它们的设置可能有点繁琐,但一旦设置完成,您就可以执行类似这样的操作...
public void MainMethod_InInterfaceLayer()
{
// container is an instance of UnityContainer
Person newPerson = container.Resolve<IPerson>();
}
我知道这不是一个完整的答案,但希望它能有所帮助。 :)
关于c# - 初学者需要的降低耦合简单示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10514706/
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Sample data for IPv6? 除了 wireshark 在其网站上提供的内容之外,是否有可以下
我正在寻找可以集成到现有应用程序中并使用多拖放功能的示例或任何现成的解决方案。我在互联网上找到的大多数解决方案在将多个项目从 ListBox 等控件拖放到另一个 ListBox 时效果不佳。谁能指出我
我是 GATE Embedded 的新手,我尝试了简单的示例并得到了 NoClassDefFoundError。首先我会解释我尝试了什么 在 D:\project\gate-7.0 中下载并提取 Ga
是否有像 Eclipse 中的 SWT 示例那样的多合一 JFace 控件示例?搜索(在 stackoverflow.com 上使用谷歌搜索和搜索)对我没有帮助。 如果它是一个独立的应用程序或 ecl
我找不到任何可以清楚地解释如何通过 .net API(特别是 c#)使用谷歌计算引擎的内容。有没有人可以指点我什么? 附言我知道 API 引用 ( https://developers.google.
最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证。天呢,它好不安全,容易被不法人监听,咋还在使用呀。但是没办法呀,
最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证。天呢,它好不安全,容易被不法人监听,咋还在使用呀。但是没办法呀,
我正在尝试为我的应用程序设计配置文件格式并选择了 YAML。但是,这(显然)意味着我需要能够定义、解析和验证正确的 YAML 语法! 在配置文件中,必须有一个名为 widgets 的集合/序列。 .这
你能给我一个使用 pysmb 库连接到一些 samba 服务器的例子吗?我读过有类 smb.SMBConnection.SMBConnection(用户名、密码、my_name、remote_name
linux服务器默认通过22端口用ssh协议登录,这种不安全。今天想做限制,即允许部分来源ip连接服务器。 案例目标:通过iptables规则限制对linux服务器的登录。 处理方法:编
我一直在寻找任何 PostProjectAnalysisTask 工作代码示例,但没有看。 This页面指出 HipChat plugin使用这个钩子(Hook),但在我看来它仍然使用遗留的 Po
我发现了 GWT 的 CustomScrollPanel 以及如何自定义滚动条,但我找不到任何示例或如何设置它。是否有任何示例显示正在使用的自定义滚动条? 最佳答案 这是自定义 native 滚动条的
我正在尝试开发一个 Backbone Marionette 应用程序,我需要知道如何以最佳方式执行 CRUD(创建、读取、更新和销毁)操作。我找不到任何解释这一点的资源(仅适用于 Backbone)。
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 去年关闭。 Improve this
我需要一个提交多个单独请求的 django 表单,如果没有大量定制,我找不到如何做到这一点的示例。即,假设有一个汽车维修店使用的表格。该表格将列出商店能够进行的所有可能的维修,并且用户将选择他们想要进
我有一个 Multi-Tenancy 应用程序。然而,这个相同的应用程序有 liquibase。我需要在我的所有数据源中运行 liquibase,但是我不能使用这个 Bean。 我的应用程序.yml
我了解有关单元测试的一般思想,并已在系统中发生复杂交互的场景中使用它,但我仍然对所有这些原则结合在一起有疑问。 我们被警告不要测试框架或数据库。好的 UI 设计不适合非人工测试。 MVC 框架不包括一
我正在使用 docjure并且它的 select-columns 函数需要一个列映射。我想获取所有列而无需手动指定。 如何将以下内容生成为惰性无限向量序列 [:A :B :C :D :E ... :A
$condition使用说明和 $param在 findByAttributes在 Yii 在大多数情况下,这就是我使用 findByAttributes 的方式 Person::model()->f
我在 Ubuntu 11.10 上安装了 qtcreator sudo apt-get install qtcreator 安装的版本有:QT Creator 2.2.1、QT 4.7.3 当我启动
我是一名优秀的程序员,十分优秀!