Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Oop 面向对象编程:如何正确地设计、实现和命名涉及对象交互的方法?_Oop_Methods_Language Agnostic - Fatal编程技术网

Oop 面向对象编程:如何正确地设计、实现和命名涉及对象交互的方法?

Oop 面向对象编程:如何正确地设计、实现和命名涉及对象交互的方法?,oop,methods,language-agnostic,Oop,Methods,Language Agnostic,语言并不重要,它是一个通用的面向对象问题(以java/C等为例)。以一个简单的概念为例。 一个人有一辆车。这个人会开车。汽车通常不会开车或四处走动,对吗`` 但是,通常在代码中,我们会看到像myCarObject.Drive()这样的方法 现在,当一个人被介绍,并且这个人驾驶汽车时: ======================= First Way ================================= class Car{ int odometer;void drive(

语言并不重要,它是一个通用的面向对象问题(以java/C等为例)。以一个简单的概念为例。 一个人有一辆车。这个人会开车。汽车通常不会开车或四处走动,对吗`` 但是,通常在代码中,我们会看到像myCarObject.Drive()这样的方法

现在,当一个人被介绍,并且这个人驾驶汽车时:

======================= First Way =================================
class Car{
    int odometer;void drive(){ odometer++; } 
}
class Person{
    void driveCar(Car c) { c.drive(); }
}
========================================================================

================================ Alternative Way =======================

public Car{ 
    int odometer;   // car doesn't do the driving, it's the person, so no drive()
}
public Person{
    void driveCar(Car c) { c.odometer++; }
}
=======================================和其他方式============================

===========================================================================


因此,我的问题很清楚:在类似情况下,设计/实现/命名方法的最佳方式是什么?

要让这样的简化示例变得有意义有点困难,但下面是一个尝试:

Car
类通常包含对象可以使用其拥有的信息自行完成的事情的方法,例如:

public class Car {

  private bool engineOn;

  public int Speed { get; private set; }

  public void Start() { engineOn = true; Speed = 0; }
  public void Accelerate() { Speed++; }
  public void Break() { if (Speed > 0) Speed--; }
  public void Stop() { Speed = 0; engineOn = false; };

}
Person
类将通过控制汽车自身在其环境中不知道的东西来管理汽车。例如:

public class Person {

  public void Drive(Car car, int speedLimit) {
    car.Start();
    while (car.Speed < speedLimit) {
      car.Accelerate();
    }
    while (car.Speed > 0) {
      car.Break();
    }
    car.Stop();
  }

}
公共类人物{
公共无效驾驶(小汽车、国际限速){
汽车启动;
while(车速<限速){
汽车加速;
}
同时(车速>0){
汽车。刹车();
}
汽车。停车();
}
}

当然,在每种情况下使用OO的方式都有很多不同的变化。

要让这样的简化示例变得有意义有点困难,但这里有一个尝试:

Car
类通常包含对象可以使用其拥有的信息自行完成的事情的方法,例如:

public class Car {

  private bool engineOn;

  public int Speed { get; private set; }

  public void Start() { engineOn = true; Speed = 0; }
  public void Accelerate() { Speed++; }
  public void Break() { if (Speed > 0) Speed--; }
  public void Stop() { Speed = 0; engineOn = false; };

}
Person
类将通过控制汽车自身在其环境中不知道的东西来管理汽车。例如:

public class Person {

  public void Drive(Car car, int speedLimit) {
    car.Start();
    while (car.Speed < speedLimit) {
      car.Accelerate();
    }
    while (car.Speed > 0) {
      car.Break();
    }
    car.Stop();
  }

}
公共类人物{
公共无效驾驶(小汽车、国际限速){
汽车启动;
while(车速<限速){
汽车加速;
}
同时(车速>0){
汽车。刹车();
}
汽车。停车();
}
}

当然,在每种情况下使用OO的方式都有很多不同的变化。

要让这样的简化示例变得有意义有点困难,但这里有一个尝试:

Car
类通常包含对象可以使用其拥有的信息自行完成的事情的方法,例如:

public class Car {

  private bool engineOn;

  public int Speed { get; private set; }

  public void Start() { engineOn = true; Speed = 0; }
  public void Accelerate() { Speed++; }
  public void Break() { if (Speed > 0) Speed--; }
  public void Stop() { Speed = 0; engineOn = false; };

}
Person
类将通过控制汽车自身在其环境中不知道的东西来管理汽车。例如:

public class Person {

  public void Drive(Car car, int speedLimit) {
    car.Start();
    while (car.Speed < speedLimit) {
      car.Accelerate();
    }
    while (car.Speed > 0) {
      car.Break();
    }
    car.Stop();
  }

}
公共类人物{
公共无效驾驶(小汽车、国际限速){
汽车启动;
while(车速<限速){
汽车加速;
}
同时(车速>0){
汽车。刹车();
}
汽车。停车();
}
}

当然,在每种情况下使用OO的方式都有很多不同的变化。

要让这样的简化示例变得有意义有点困难,但这里有一个尝试:

Car
类通常包含对象可以使用其拥有的信息自行完成的事情的方法,例如:

public class Car {

  private bool engineOn;

  public int Speed { get; private set; }

  public void Start() { engineOn = true; Speed = 0; }
  public void Accelerate() { Speed++; }
  public void Break() { if (Speed > 0) Speed--; }
  public void Stop() { Speed = 0; engineOn = false; };

}
Person
类将通过控制汽车自身在其环境中不知道的东西来管理汽车。例如:

public class Person {

  public void Drive(Car car, int speedLimit) {
    car.Start();
    while (car.Speed < speedLimit) {
      car.Accelerate();
    }
    while (car.Speed > 0) {
      car.Break();
    }
    car.Stop();
  }

}
公共类人物{
公共无效驾驶(小汽车、国际限速){
汽车启动;
while(车速<限速){
汽车加速;
}
同时(车速>0){
汽车。刹车();
}
汽车。停车();
}
}

当然,在每种情况下使用OO的方式都有许多不同的变体。

如果您希望以一种与人类语言语义非常相似的方式来表达您的逻辑,那么您需要在逻辑上能够执行的实体上调用一个动作或函数

当无法将行为放置在对象上时(从对象具有状态的意义上讲),可以将其放置在服务或实用程序类或某些类似的构造中
Authenticate
是在用户或任何其他对象上调用没有多大意义的东西的经典示例。为此,我们创建了一个
身份验证提供程序
(或服务,以您喜欢的为准)

在一个人和一辆车的场景中,一个对象调用另一个对象的行为<代码>个人驾驶(汽车)因此最有意义

如果一个人拥有一辆车(而且一辆车总是由一个人拥有),那么
Person.Drive()
可能是你唯一需要做的事情。
Drive()
方法将访问
person
的属性,其中一个属性是它的
汽车

这里需要注意的一点是松耦合的概念。在更复杂的场景中,您不希望在模型中进行各种交叉引用。但是,通过使用接口和抽象,您经常会发现自己将方法放在了对象上,而这些对象从现实世界的角度来看并不真正属于它们。诀窍是意识到并利用语言的特性同时实现松散耦合和现实语义

请记住,在一个实际的应用程序中,您将把引导代码隐藏在其他地方,下面是一个C#中的示例:

我们首先为可以传输的东西(
ITransporter
)和可以传输的东西(
ITransportable
)定义接口:

请注意
Transportation
helper类,该类包含必要的信息,用于在以一定速度等方式将
ITransportable
传输一段时间后重新计算其当前位置。一个简单的例子:

public class Transportation
{
    public double Velocity { get; set; }
    public TimeSpan Duration { get; set; }
}
然后我们继续为这些创建我们的实现。您可能已经猜到,
Person
将从
ITranspo派生