我最近一直在读书,遇到了得墨meter耳定律。现在我读过的一些书非常有道理,例如报税员永远都不能在顾客的口袋里来回走动,抢钱包并把钱拿出来。钱包是客户应控制的东西,而不是paperboy。
令我着迷的是,也许我只是对整个事情都产生了误解,那就是将属性与功能/信息的层次结构一起使用会非常有用。例如.NETs HTTPContext类。
不会像这样的代码:
If DataTable.Columns.Count >= 0 Then
DataTable.Columns(0).Caption = "Something"
End If
或者
Dim strUserPlatform as string = HttpContext.Current.Request.Browser.Platform.ToString()
或者
If NewTerm.StartDate >= NewTerm.AcademicYear.StartDate And
NewTerm.EndDate <= NewTerm.AcademicYear.EndDate Then
' Valid, subject to further tests.
Else
' Not valid.
End If
违反这条法律?我认为(可能是错误地)OOP的目的部分是为了以一种很好的层次结构提供对相关类的访问。
例如,我喜欢引用一个可供页面类使用的实用工具包的想法,以避免重复的任务,例如发送电子邮件和封装有用的字符串方法:
Dim strUserInput As String = "London, Paris, New York"
For Each strSearchTerm In Tools.StringManipulation.GetListOfString(strUserInput, ",")
Dim ThisItem As New SearchTerm
ThisItem.Text = strSearchTerm
Next
任何清晰度都将是巨大的……此刻我无法调和法律似乎如何将属性和方法放在一起……对我来说很奇怪,应该忽略这么多的力量?你们中有些人可能已经猜到我对OOP还是陌生的,所以请放轻松:)
最佳答案
得墨meter耳定律(又称“函数/方法的得墨meter耳法则”)想通过说“仅使用一个点”来减少的是,在一种方法中,您不必从提供的参数中假设这么多上下文。这增加了该类的依赖关系,并使它的可测试性降低。
这并不意味着您不能使用上述所有示例,而是表明,与其提供您的方法,而是让客户访问钱包并从中取回钱款的客户:
function getPayment(Customer customer)
{
Money payment = customer.leftpocket.getWallet().getPayment(100);
...
// do stuff with the payment
}
相反,您只将报童程序所需的内容传递给该方法,因此,如果可能的话,减少该方法的依赖关系:
function getPayment(Money money)
{
// do stuff with the payment
}
这样做的好处是,您不必依赖客户将钱包放在左口袋中,而只需处理客户给您的钱即可。不过,这是一个决定,您必须根据自己的情况而定。更少的依赖关系使您更容易测试。
关于asp.net - 得墨meter耳与OOP混淆定律,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6918666/