Fra*_*ers 7 c# coupling decoupling loose-coupling
刚刚大学毕业,我遇到了一些需要减少耦合的代码.但我并不完全理解所有概念,并想要一个简单的例子来帮助我.为了让你开始,我有一个人类,一个字段,名称.我在该类中有一个方法来连接一些文本.
我知道这是一个愚蠢的例子,大多数人都不会考虑在这种简单的情况下减少耦合,但我只想要一个简单的例子来帮助我完全理解代码和概念.
在主窗口后面的代码中,我放了一个文本框和一个按钮.窗口加载时,它显示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 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;
}
Run Code Online (Sandbox Code Playgroud)
我的简单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>
Run Code Online (Sandbox Code Playgroud)
我很难理解互联网上的教程解释这一点.从我看到有3种方法可以做到这一点(如果可能的话,将上面的代码转换为所有三个的例子会很好):
解释我读过的东西的文章非常好,但这些例子与我无关,因为他使用VB和ASP.Net与数据库连接字符串.这与我的需求完全相反,我不想考虑如何翻译代码,同时学习概念,并思考如何将其应用于相关的东西.虽然这个例子很好,但它太多了,我真的很感激任何额外的帮助.
编辑历史记录:更正拼写.添加以下内容以澄清我的问题:
我理解耦合和衔接背后的理论,以及为什么你应该减少一个并增加另一个.但我们从来没有在大学里编写任何代码.另外,虽然大学没有涉及,但我确实理解界面.但是,我不明白如何使用它们来减少耦合.
添加了我上面引用的文章的链接.
编辑2:到目前为止,我现在得到的是以下内容:
public interface IPerson
{
string Name { get; set; }
string PersonAddText(string text);
}
public class Person : IPerson
{
//The code from the person class above
}
Run Code Online (Sandbox Code Playgroud)
我现在如何在主窗口代码中使用它?我猜我应该更换
Person x = new Person();
Run Code Online (Sandbox Code Playgroud)
同
IPerson x = new Person();
Run Code Online (Sandbox Code Playgroud)
这是正确的,如果是的话,还有什么我需要做的.我问的原因是因为我仍然没有看到visual studio报告的代码耦合数据有任何减少(事实上,它在后面的主窗口代码上增加了1).
编辑
很高兴我的回答对您有所帮助,让我进一步更新一下。要将您的问题用作直接答案,您需要更改的只是您的字段声明:
Person x = new Person();
Run Code Online (Sandbox Code Playgroud)
到
IPerson x = new Person();
Run Code Online (Sandbox Code Playgroud)
您的代码隐藏现在知道您的接口中指定的属性和方法,并且耦合性大大降低,因为您可以new Person()稍后更换new Student()。只要对象实现了接口。您的代码隐藏现在应该可以正常工作,无需进行任何必要的更改。
边注
我建议考虑延迟加载该x人员,并使用具有更容易识别的名称的属性。请注意,这并不能回答您的问题,而只是一个建议。:)
private IPerson _CurrentPerson = null;
private IPerson CurrentPerson
{
get
{
if (this._CurrentPerson == null)
{
this._CurrentPerson = new Person();
}
return this._CurrentPerson
}
set
{
this._CurrentPerson = value;
}
}
Run Code Online (Sandbox Code Playgroud)
解耦是指两个或更多代码块不应相互依赖。控制反转是指对象的耦合在运行时被绑定,从而允许更大的灵活性,从而减少对象及其实例的耦合。控制反转最好与接口结合使用。接口定义了ClassA将要做的MethodX和具有的PropertyY。我们的主对象并不关心运行时返回什么对象,只要它能够实现接口,就很高兴。
在上面的示例中,您将想要连接您的 person 类,也许像这样:
public interface IPerson
{
string Name { get; set; }
string PersonAddText(string text);
}
public class Person : IPerson
{
// your code here
}
Run Code Online (Sandbox Code Playgroud)
然后,在 main 方法调用中,Person您将使用实现该接口的对象的实例,而不是显式使用对象IPerson。接口和对象的“连接”可以通过各种不同的库来实现,这将有助于设置您的依赖关系。根据我的经验,我使用过StructureMap和Microsoft 的 Enterprise Library。它们的设置可能有点繁琐,但一旦完成,你就可以做这样的事情......
public void MainMethod_InInterfaceLayer()
{
// container is an instance of UnityContainer
Person newPerson = container.Resolve<IPerson>();
}
Run Code Online (Sandbox Code Playgroud)
我知道这不是完整的答案,但希望它能有所帮助。:)
| 归档时间: |
|
| 查看次数: |
7630 次 |
| 最近记录: |