通过什么?参考对象或值类型?

时间:2010-02-15 18:37:52

标签: c# oop

伙计我有一个“最佳实践问题”例如我有这个课程:

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(外出键),但是我传递了对象。

最好的方法是什么?

6 个答案:

答案 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意味着你无法判断一些东西与其他东西相比有多大例如,与我姐姐相比,老是我的兄弟。)