Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 面向对象/面向对象耦合问题_.net_Vb.net_Oop - Fatal编程技术网

.net 面向对象/面向对象耦合问题

.net 面向对象/面向对象耦合问题,.net,vb.net,oop,.net,Vb.net,Oop,我有一个函数,返回给定时间段内的订单。我创建了一个Period对象,它确保在指定日期范围时,开始日期是松耦合的,重用确实是相互竞争的概念。在设计软件时,你必须不断平衡两者的使用 松耦合和重用确实是相互竞争的概念。在设计软件时,你必须不断平衡两者的使用 系统中的GetOrders等服务依赖于Period等小型、易于创建的价值对象是可以的。这样,您的服务对象就可以根据您正在工作的域而不是始终以基本类型进行交谈 因此,我认为在这种情况下,将句点传递到GetOrders是正确的。它提高了抽象的层次。Ge

我有一个函数,返回给定时间段内的订单。我创建了一个Period对象,它确保在指定日期范围时,开始日期是松耦合的,重用确实是相互竞争的概念。在设计软件时,你必须不断平衡两者的使用

松耦合和重用确实是相互竞争的概念。在设计软件时,你必须不断平衡两者的使用

系统中的GetOrders等服务依赖于Period等小型、易于创建的价值对象是可以的。这样,您的服务对象就可以根据您正在工作的域而不是始终以基本类型进行交谈

因此,我认为在这种情况下,将句点传递到GetOrders是正确的。它提高了抽象的层次。GetOrders对所有Period类都感兴趣,因此您不会不必要地扩大GetOrders所知道的概念的范围,它只是以不同的形式存在。若Period是一个包含大量其他内容的更大类,那个么耦合将是一个更大的问题


第二个因素是创建Period对象很容易。如果需要创建一系列其他对象,那么耦合将是一个问题。这就是为什么您不让价值对象发送电子邮件并将其保存到数据库等。

系统中的GetOrders等服务可以依赖于Period等小型、易于创建的价值对象。这样,您的服务对象就可以根据您正在工作的域而不是始终以基本类型进行交谈

因此,我认为在这种情况下,将句点传递到GetOrders是正确的。它提高了抽象的层次。GetOrders对所有Period类都感兴趣,因此您不会不必要地扩大GetOrders所知道的概念的范围,它只是以不同的形式存在。若Period是一个包含大量其他内容的更大类,那个么耦合将是一个更大的问题


第二个因素是创建Period对象很容易。如果需要创建一系列其他对象,那么耦合将是一个问题。这就是为什么您不让值对象发送电子邮件并将其自身保存到数据库等。

在.Net中的所有内容都是对象,但对象很少单独存在,因此类之间会存在一定程度的耦合。您需要问的问题是这些类是紧密耦合的、多少耦合的还是松散耦合的。紧密耦合的类形成了脆弱的体系结构,因为更改可能会在整个模型或系统中产生连锁反应。随着时间的推移,课程的维护变得越来越困难。使类更松散地耦合有助于缓解其中的一些问题。就某事物是否松散耦合而言:

耦合是指耦合的程度 一个班级拥有的直接知识 另一个这不是命中注定的 解释为封装vs。 非封装。这不是一个问题 参考一个班级的知识 另一个类的属性或 实施,而不是知识 另一个阶级本身。坚强的 当依赖类 包含一个直接指向 提供 必需的行为。依赖性 不可替代,或其 签名已更改,无需 对依赖类的更改。释放 耦合发生在依赖 类只包含指向 接口,然后可以 由一个或多个具体的 上课

在您的示例中,在Order类和Period类之间引入了一些耦合。您可能需要将两个相关的日期传递给Order方法,并选择创建一个Period类来执行此操作。为什么?因为你有两次约会;a开始日期和结束日期;您希望验证代码中的一个位置的截止日期是否晚于起始日期。这是一个应用程序;这是一件好事。DRY原则的应用虽然相关,但不同于代码重用:

一些特征使得 更易于重用的软件是 模块化、松耦合、高性能 内聚、信息隐藏和 关注点分离


松耦合只是支持代码重用的几个特性之一。代码重用在某种程度上是指您能够在代码的其他地方使用句点类,而不仅仅是Order类。如果要添加一个接口来抽象Period类的使用,这将使Order类和Period类更松散地耦合,但这不会剥夺代码重用的能力。在代码的其他地方使用Period类的能力。

在.Net中的所有东西都是对象,然而,对象很少孤立存在,因此 re类之间会有一定量的耦合是的。您需要问的问题是这些类是紧密耦合的、多少耦合的还是松散耦合的。紧密耦合的类形成了脆弱的体系结构,因为更改可能会在整个模型或系统中产生连锁反应。随着时间的推移,课程的维护变得越来越困难。使类更松散地耦合有助于缓解其中的一些问题。就某事物是否松散耦合而言:

耦合是指耦合的程度 一个班级拥有的直接知识 另一个这不是命中注定的 解释为封装vs。 非封装。这不是一个问题 参考一个班级的知识 另一个类的属性或 实施,而不是知识 另一个阶级本身。坚强的 当依赖类 包含一个直接指向 提供 必需的行为。依赖性 不可替代,或其 签名已更改,无需 对依赖类的更改。释放 耦合发生在依赖 类只包含指向 接口,然后可以 由一个或多个具体的 上课

在您的示例中,在Order类和Period类之间引入了一些耦合。您可能需要将两个相关的日期传递给Order方法,并选择创建一个Period类来执行此操作。为什么?因为你有两次约会;a开始日期和结束日期;您希望验证代码中的一个位置的截止日期是否晚于起始日期。这是一个应用程序;这是一件好事。DRY原则的应用虽然相关,但不同于代码重用:

一些特征使得 更易于重用的软件是 模块化、松耦合、高性能 内聚、信息隐藏和 关注点分离


松耦合只是支持代码重用的几个特性之一。代码重用在某种程度上是指您能够在代码的其他地方使用句点类,而不仅仅是Order类。如果要添加一个接口来抽象Period类的使用,这将使Order类和Period类更松散地耦合,但这不会影响代码重用的能力在代码中的其他地方使用Period类的能力。

应该避免不必要的耦合,但在您的场景中,Period只是用来定义一个值类型,该值类型聚合了有关域的一些概念,所以它一点也不坏。如果超出了值类型的使用范围,您将希望使用依赖项注入DI和控制反转IoC等技术将它们解耦


在衡量设计时,当涉及到依赖性时,您将不得不超越类级别,更多地关注命名空间或程序集级别。在您的例子中,如果Period位于相同的名称空间或程序集中,那么包中的类型之间仍然具有非常好的关系内聚。在上述场景中,命名空间的传出耦合和传入耦合仍然保持不变/较低

应该避免不必要的耦合,但在您的场景中,Period仅用于定义一个值类型,该值类型聚合了有关您的域的一些概念,因此它一点也不坏。如果超出了值类型的使用范围,您将希望使用依赖项注入DI和控制反转IoC等技术将它们解耦


在衡量设计时,当涉及到依赖性时,您将不得不超越类级别,更多地关注命名空间或程序集级别。在您的例子中,如果Period位于相同的名称空间或程序集中,那么包中的类型之间仍然具有非常好的关系内聚。在上述场景中,命名空间的传出耦合和传入耦合仍然保持不变/较低

好的,根据你的回答,我想我理解了这些概念。好的,根据你的回答,我想我理解了这些概念。完全同意……非常好的答案。谢谢,我已经读了很多次了,但是,当你看到一个非常详细的注释why/when/detail时,你的代码中应该走哪条路是有意义的。谢谢,史蒂夫。我完全同意……回答得很好。谢谢,我已经读了很多次了,但是,当你看到一个非常详细的注释why/when/detail时,你的代码中应该走哪条路是有意义的。谢谢你,史蒂夫。
Public Class Order

   Public Shared Function GetOrders(ByVal customerId As Integer,
                                    ByVal forPeriod As Period) As Orders

       **'Should the param object MonthPeriod be replaced with 2 date params?
       'Would I be "reducing coupling" by doing so, a good thing.**

   End Function

End Class

Public Class Period

    Property FromDate As Date
    Property ToDate As Date

    Public Sub New(ByVal fromDate As Date, ByVal toDate As Date)

        If fromDate > ToDate Then
            Throw New ArgumentException("fromDate must be less than Or equal toDate")
        End If

        _FromDate = fromDate
        _ToDate = toDate

    End Sub

End Class

Public Class MonthPeriod : Inherits Period


    Public Sub New(ByVal fromDate As Date, ByVal toDate As Date)

        MyBase.New(fromdate, toDate)

        If fromDate.Date <> New Date(fromDate.Year, fromDate.Month, 1) Then
            Throw New ArgumentException("fromDate must be the first day of the month")
        End If

        If toDate.Date <> New Date(toDate.Year, toDate.Month, Date.DaysInMonth(toDate.Year, toDate.Month)) Then
            Throw New ArgumentException("fromDate must be the last day of the month")
        End If

    End Sub

End Class