伙计我有一个“最佳实践问题”例如我有这个课程:
class Person
{
public int age {get; set;}
}
class Computer
{
public void checkAge(Person p) // Which one is recommended THIS
{
// Do smthg with the AGE
}
public void checkAge(int p) // OR THIS
{
//Do smthg with the age.
}
}
建议通过什么?正是我需要的(int-value类型)或整个对象(引用类型)
我问这个是因为我在我正在制作的应用程序上使用LINQ而且我创建了许多实体,我应该传递ID(外出键),但是我传递了对象。
最好的方法是什么?
答案 0 :(得分:16)
函数checkAge
应该只接受执行它的工作所需的最少量信息。添加任何其他内容只会产生人为依赖。如果只需要int
那么这就是我应该采取的解决方案。
答案 1 :(得分:12)
我认为在这种情况下,答案可能都不是。 “Age”将被分解到它自己的类中,或者如果该操作是特定于上下文的Person,它将在Person类本身中找到。
答案 2 :(得分:3)
根据给出的信息,两种解决方案都不是很好
第一个解决方案要求Computer类了解Person.Age,没有明显的原因
第二个将一个方法附加到Computer类,该方法与Computer对象的属性无关
某些上下文会有所帮助 - 如果这是验证,那么CheckAge属于Person类(可能具有IsAgeAcceptable属性)
为什么计算机会检查一个人的年龄?对此的答案决定了什么是有道理的......
答案 3 :(得分:2)
遵循demeter定律的功能。基本上,法律规定实体应松散耦合。如果计算机对象知道一个人对象,请问自己以下问题?在这种情况下,也许你在checkAge中所做的就是检查一个int值。如果是这种情况,那么是什么让你认为传递整个对象需要?在这种情况下,简单地通过人的年龄并将其作为int。
所以更喜欢
public void checkAge(int n)
答案 4 :(得分:0)
我想指出,在传递引用时,引用是32位整数,同时复制数据类型。因此,如果您的值类型大于32位int,则通过引用传递,如果性能或内存是任何类型的问题。
答案 5 :(得分:0)
我指出int Age
可能不是存储该值的最佳方式。
(Why is DateTime a Property and not a Method
)
class Person : IBorn
{
public DateTime Birth {get; set;}
}
interface IBorn
{
DateTime Birth {get; set;}
}
interface IDateTimeFactory
{
DateTime Now();
}
class DefaultDateTimeFactory : IDateTimeFactory
{
public DateTime Now()
{
return DateTime.Now;
}
}
public static class IBornExtensions
{
public TimeSpan AgeFromNow(this IBorn birthed, IDateTimeFactory dtf)
{
return dtf.Now() - birthed.Birth;
}
public TimeSpan AgeFrom(this IBorn birthed, DateTime from)
{
return from - birthed.Birth;
}
}
class Computer
{
public void checkAge(IBorn birthed)
{
var age = birthed.Age((new DefaultDateTimeFactory()).Now());
}
}
我确信那里有人在想,“这就是为这个答案提供了很多代码,肯定似乎太过分了”。好像DateTime.Now
应该是一个方法(因为方法返回的值可以改变每个调用,属性通常不应该改变每个调用的值,请参阅上面的链接),年龄变化打电话,所以财产应该是出生。接下来我封装了将Age定义为扩展方法的方法,因为任何可以IBorn
的东西肯定都可以有一个Age(忽略某个东西的哲学问题已经死了,它有一个Age:P)。最后,创建了IDateTimeFactory
对象,这样就可以对Age方法进行单元测试,以确定它是否正确计算年龄(否则,硬编码DateTime.Now
意味着你无法判断一些东西与其他东西相比有多大例如,与我姐姐相比,老是我的兄弟。)