面向对象的设计原则抽象

时间:2013-01-13 23:54:12

标签: oop abstraction object-oriented-analysis

在阅读抽象时,我遇到了以下声明

“Abstraction仅捕获与当前视角相关的对象的详细信息”

例如。 从驾驶员的角度来看,Car class将是

  public class Car
  {
     void start();
     void applybrakes();
     void changegear();
     void stop();
   }

从机械师的角度来看,Car class将是

  public class Car
  {
     void changeOil();
     void adjustBrakes();
   }

我的问题, 在设计系统时,我们是设计一个用户视角(驱动程序还是机制)或者可以 我们设计了多个用户视角,并根据用户类型进一步抽象出来?

希望我的问题很明确。

谢谢

2 个答案:

答案 0 :(得分:6)

根据您的使用情况,您可能需要为多个用户设计。在您的示例中,如果您的汽车将由机械师和驾驶员使用,那么您不能忽略一组用户。在这种情况下,您仍然可以使用Interfaces抽象细节。

您可以像这样设计对象:

interface IDrivable {
    void start();
    void applyBrakes();
    void changeGear();
    void stop();
}

interface IFixable {
    void changeOil();
    void adjustBrakes();
}

public class Car : IDrivable, IFixable {
    // implement all the methods here
}

现在,当机械师想要这辆车时,你不会给他一个Car物品,而是给他一个IFixable物品。同样,驱动程序获取IDrivable个对象。这样可以同时保留两组用户的相关抽象。

class Driver {

    private IDrivable car;

    public Driver(IDrivable car) {
        this.car = car;
    }

    public driveCar() {
        this.car.start();
        this.car.accelerate();

        //this is invalid because a driver should not be able to do this
        this.car.changeOil();
    }
}

类似地,机械师无法访问界面IDrivable中的方法。

您可以在此处详细了解interfaces。即使这是MSDN链接并使用C#,所有主要语言都支持接口。

答案 1 :(得分:1)

我认为你可能从“视角”推断过多。我不会在这里把观点视为一个人或用户,而不是一个有利位置。这里的观点的想法可能甚至不是一个好的比喻。我们在这里真正谈到的是我们用来组成更大对象的较小对象之间的责任分工。

这个想法的重点是解耦和模块化。您需要可以拉出和替换的对象,而不会更改它们周围的所有内容。所以你希望你的对象是连贯的,因为它们的方法和变量密切相关。

在对象之间的接口 - 客户端关系方面,您可以从用户隐喻中获得一些里程数。