一个方法应该从一个对象中获取一些属性或者只是获取这个对象

本文关键字:获取 属性 或者 对象 一个对象 方法 一个 | 更新日期: 2023-09-27 18:07:30

例如

        int GetNum(int x, int y)
              {
                  return x+y;
               }

然后调用

         z= GetNum(myobject.x, myobject.y);

         int GetNum(ClassA myobject)
              {
                  return myobject.x+myobject.y;
               }

然后调用

          z = GetNum(myobject);

一个方法应该从一个对象中获取一些属性或者只是获取这个对象

传入属性值以减少类之间的耦合。在这种情况下,定义GetNum的类不需要知道ClassA

最好减少类之间的耦合依赖,因为这使您的设计更灵活。如果您确实向方法提供了复杂类型,那么就提供接口,以便您可以更改传递的特定实现。这再次使您的设计更灵活,更容易测试。

我认为这在很大程度上取决于你自己的编码风格。

在我看来,一个方法应该接受一个对象作为参数,如果该方法的目的与该对象相关联。例如,将对象的字段格式化为漂亮的文本字符串的方法应该将对象作为其参数。

在你的例子中,方法并没有真正与对象相关——它可以接受任意两个数字,它们不必被包裹在一个特定的对象中才能工作,所以我认为方法应该接受属性作为参数。

我认为你选择哪种风格没有太大的区别。

我遵循的一般规则是这样的。方法是否需要对象?,还是需要对象的属性值?后者使方法更可用(因为它不需要用户创建具有这些属性的任何类型的实例)。

你可以做的是提供一个重载(从而支持两者):

int GetNum(int x, int y) { return (x + y); }
int GetNum(ClassA obj) { return GetNum(obj.X, obj.Y); }

问问你自己这个方法可能的用例是什么,然后问你是否真的需要传递一个包装这些值的实例。

考虑我可能有以下方法:

public void ProcessMessage(Result result)
{
  // Do something with Result.ReturnedMessage
  result.ReturnedMessage.Process(result.Target);
}

它接受一个理论上的Result类型的实例,但实际情况是,它只使用两个参数,所以我们可以将它重新定义为:

public void ProcessMessage(Message message, Target target)
{
  message.Process(target);
}

这现在使得该方法可以在潜在的更多场景中使用,当然,您可以定义一个重载,只从ProcessMessage(Result)路由到ProcessMessage(Message, Target),等等。

另一方面,如果方法是接口定义的一部分:

void ProcessMessage(Result result);

你不能保证实现该方法的类型不需要访问ReturnedMessageTarget属性以外的属性。

底线是,考虑你的用例,以及它如何适应更大的设计。还要考虑防未来……启动我们的理论Result类型有多容易?

作为一个脚注,这是一个非常类似的参数,关于在哪里使用专门化类型或基类型传递值,例如:
public void DoSomething(List<string> items);
public void DoSomething(IList<string> items);
public void DoSomething(IEnumerable<string> items);

在上面的例子中,你的方法是否做任何显式需要List<string>类型的事情,或者它将与IList<string>接口定义一起工作…或者如果你没有添加任何东西…接受一个IEnumerable<string>实例怎么样?方法调用的专门化越少,它们的使用范围就越广。

在这种情况下,as chibacity说GetNum不需要知道ClassA。但是,您可以考虑实际添加GetNum作为ClassA的方法,该方法调用GetNum并传递适当的值。不一定要写,但如果你要经常写的话就有意义了

我认为,就像其他所有有趣的事情一样,答案是"视情况而定"。

这个例子可能被简化得太多了,没有给出足够的上下文来正确回答问题。似乎有三种方法可以解决这个问题:1) int GetNum(ClassA myObject){}
2) int ClassA.GetNum(){}
3) int GetNum(int a, int b) {}

在过去,我会支持选项2,使GetNum成为ClassA的成员。GetNum如何工作或从哪里获取信息与调用者无关,您(调用者)只想从ClassA对象中获取一个数字。option的代码需要知道ClassA的内容,所以这是不合适的,即使它只使用两个getter。如果我们对环境了解得更多,也许选项一会更好。从问题中我看不出来。

对于提高工作中代码的可测试性,尤其是遗留代码的可测试性,有很大的兴趣。除非已经有一个有用的单元测试框架,否则选项1和选项2需要实例化ClassA的对象进行测试。为了使代码可测试(特别是如果ClassA的实例化是昂贵的或不切实际的),我们一直在使用类似选项3的东西(或使其成为ClassA的静态成员)。通过这种方式,您不需要实例化或传递难以创建的对象,并且您可以轻松地添加完整的代码测试覆盖率。

一如既往,YMMV。