3

抽象化について読んでいるときに、私は次のステートメントに出くわしました

「抽象化は、現在のパースペクティブに関連するオブジェクトに関する詳細のみをキャプチャします」

たとえば。ドライバーの観点から、車のクラスは

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

整備士の観点からすると、車のクラスは

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

私の質問、システムを設計する際に、1つのユーザーパースペクティブ(ドライバーまたはメカニックのいずれか)用に設計しますか、それとも複数のユーザーパースペクティブ用に設計し、ユーザータイプに基づいてさらに抽象化できますか?

私の質問が明確であることを願っています。

ありがとう

4

2 に答える 2

6

ユースケースによっては、複数のユーザーを設計する必要がある場合があります。あなたの例では、あなたの車が整備士と運転手の両方によって使用される場合、あなたはただ一組のユーザーを無視することはできません。その場合でも、インターフェイスを使用して詳細を抽象化できます。

次のようにオブジェクトを設計できます。

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

インターフェースについて詳しくは、こちらをご覧ください。これはMSDNリンクであり、C#を使用していますが、すべての主要言語はインターフェイスをサポートしています。

于 2013-01-13T23:59:44.353 に答える
1

「視点」から推測しすぎているのではないかと思います。ここでは、人やユーザーを視点としてとらえることはしません。ここでのビューのアイデアは、おそらく良い比喩ではありません。ここで実際に話しているのは、大きなオブジェクトを構成するために使用する小さなオブジェクト間の責任の分担です。

このアイデアの要点は、デカップリングとモジュール性です。周囲のすべてを変更せずに引き出して交換できるオブジェクトが必要です。したがって、オブジェクトのメソッドと変数が密接に関連するように、オブジェクトに一貫性を持たせる必要があります。

オブジェクト間のインターフェースとクライアントの関係に関して、ユーザーの比喩からある程度のマイレージを得ることができるかもしれません。

于 2013-01-14T00:06:27.423 に答える