刚大学毕业,遇到一些需要减少耦合的代码。但是我不完全理解所有概念,希望有一个简单的例子对我有所帮助。为了让您入门,我开设了一个具有单个字段(名称)的人员类(class)。我在该类中有一个方法来连接一些文本。

我知道这是一个愚蠢的示例,并且大多数人永远不会考虑在如此简单的情况下减少耦合,但是我只想使用一个简单的示例来帮助我完全理解代码和概念。

在主窗口后面的代码中,我放置了一个文本框和一个按钮。加载窗口时,将显示人员x名称字段的当前值。单击该按钮时,将调用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种方法可以做到这一点(如果可能的话,将上面的代码转换为这三种示例都很好):
  • 服务定位器
  • 依赖注入(inject)
  • 控制反转(IoC)

  • 解释我已阅读的内容的article非常好,但是这些示例与我无关,因为他正在将VB和ASP.Net与数据库连接字符串一起使用。这与我所需要的完全相反,我不想在学习概念的同时思考如何翻译代码,也不想考虑如何将其应用于相关内容。虽然这个例子很好,但是太多了,我非常感谢任何其他帮助。

    编辑历史记录:更正了拼写。添加了以下内容以澄清我的问题:

    我了解耦合和凝聚力背后的理论,以及为什么要减少一个而又增加另一个。但是我们从来没有在大学里编写任何示例代码。另外,虽然我没有在大学学习,但我确实了解界面。但是,我不明白如何使用它们来减少耦合。

    添加了到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
    }
    

    现在如何在后面的mainwindow代码中使用它?我猜我应该更换
    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人,并考虑使用名称更易于识别的属性。 N.B.这不能回答您的问题,但这只是一个建议。 :)
    private IPerson _CurrentPerson = null;
    private IPerson CurrentPerson
    {
        get
        {
            if (this._CurrentPerson == null)
            {
                this._CurrentPerson = new Person();
            }
            return this._CurrentPerson
        }
        set
        {
            this._CurrentPerson = value;
        }
    }
    

    去耦是指两个或更多代码块不应相互依赖。控制反转是指在运行时绑定(bind)对象的耦合时,因此可以使对象及其实例具有更大的灵活性,从而减少耦合。控制反转最好与接口(interface)一起使用。接口(interface)定义ClassA将执行MethodX并具有PropertyY。我们的主要对象并不关心在运行时返回什么对象,因为日志可以满足接口(interface)要求,所以很高兴。

    在上面的示例中,您将需要连接个人类,也许是这样的:
    public interface IPerson
    {
        string Name { get; set; }
        string PersonAddText(string text);
    }
    
    public class Person : IPerson
    {
        // your code here
    }
    

    然后,在您的主要方法调用内,您将使用实现Person接口(interface)的对象实例,而不是显式使用IPerson对象。可以通过各种不同的库来实现接口(interface)和对象的“ Hook ”,这将有助于建立依赖关系。根据我的经验,我使用了StructureMapMicrosoft'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/

    10-12 15:22