1

そこで、最近、システム設計に関する 1 つの質問に出くわしました。以下の設計に従って、3 台の車があり、そのうち 2 台はオート パイロット、2 台はオート ローンチが可能です。

問題は、クラス構造をどのように設計するかということです。また、Launch for Suv などのサンプル メソッドを提供し、単体テストを提供します。

ここに画像の説明を入力

だから-それに答えるために、私は以下のようなものを思いつきました:

public class BaseCar
{
    // all common properties
    int height, width, length;
    string color etc.   
}

public class Suv : BaseCar
{
    LaunchCar LaunchSuv {get; set;}

    // Lets say we use DI to inject ctor
    Suv(IAutoLaunch autoLaunch)
    {
        LaunchSuv = autoLaunch;
    }

}

Interface IAutoLaunch
{
    bool Launch();
}

public class LaunchCar : IAutoLaunch
{
    // ctor based on car type
    LaunchCar(CarType)
    {
    }

    // Implementation of Launch based on Car Type

    bool Launch()
    {
        // successfully launch car here..
        return true; 
    }

}

最後に、Suv を起動したいとしましょう。その場合、LaunchSuv.Launch(); のようなことができます。

  • 私の解決策が正しい方向にあるかどうかはわかりません。もしそうなら、改善の余地はありますか?

参考までに - AutoPilot と AutoLaunch に別々のインターフェイスを用意することにした理由は、常に 3 台のうち 1 台の車が両方の機能要件を備えていないためです。ベース車で両方のメソッドを宣言すると、不要なすべての車に不要な両方のメソッドが含まれます-この理由が良い設計なのか、それほど重要でないのかわかりません!! また、SUV を例に挙げましたが、セダンとクーペについても同様のクラス構造を導き出すことができます。

4

3 に答える 3

2

この文脈では、本当に「正しい」答えはありません。アーキテクチャに関する決定は、特定の問題に対して機能する場合は適切であると見なされ、スケーラブルでアジャイルである場合はさらに優れています。同じ設計が別の問題に対して悪い場合があります。

つまり、「ソフトウェアに期待される機能は何ですか?また、特定の設計を使用してそれらを実装するのはどれくらい難しいでしょうか?」という質問になります。問題のコンテキストがないため (コンテキストとは「全体像」を意味します)、この質問に答えることはできません。

于 2016-10-12T07:41:33.317 に答える
1

私はあなたのアプローチに同意します。レシピは次のとおりです。

  • コア機能を実装する基本クラス
  • 各機能のインターフェイス (自動起動は船舶にも考えられますが、現在は範囲外ですが、インターフェイスを賢く定義すれば、将来的には車以外のデザインもサポートされるようになります)
  • 有効な機能の組み合わせごとの基本クラスのサブクラス
于 2016-10-12T08:09:34.147 に答える
0

提案、AutoLaunch および AutoPilot は、BaseCar の「機能」と見なすことができ、デフォルト値を false としてその一部にすることができます。次に、CarType がこれらのいずれかを持っていても、デフォルト値をオーバーライドするインターフェイスを「実装」できます。それはデザイナー/建築家、彼/彼女がどのように進めたいか、そして彼らがどれだけの柔軟性を望んでいるかに依存します.

于 2016-10-12T07:43:28.627 に答える