0

これは、OOD ベースのインタビューの質問です。

Furniture クラスがあり、WoodChair、WoodTable、SteelChair、SteelTable などの派生クラスがあります。インタビュアーは、アイアンチェア、アイロンテーブルなどのクラスをもっと増やしたいと考えていました。どうすればいいですか。デザインはまだ公開されておらず、指定された内容全体を自由に変更できます。

基本的に家具の種類を構築しているので、ここではタイプ (椅子/テーブル) やメイク (鉄/木材) などのプロパティを持つ Furniture クラスでビルダー パターンを使用する必要があると考えました。 buildLegs(..)、buildSurface(..)、ChairBuilder、TableBuilder などのサブクラス、およびそれらすべてをインスタンス化する Director クラス。既存のデザインに影響を与えることなく、任意のメーカーの新しいタイプの家具をできるだけ多く追加し、それらのビルダー クラスを構築することができます。

Builder Vs Decorator patternを読んだ後、私はここで Decorator パターンを使うべきではないと確信しました。しかし、ビルダーも大丈夫ですか?それはやり過ぎですか?

また、家具の作りをどう扱っていいのかわからない。make に enum 型の機能を追加するだけで十分でしょうか? [鋼、鉄、木] メーカーは家具アイテムに新しい動作を追加しません。

4

2 に答える 2

1

既存のクラスで何かをリファクタリングする必要があるようです。これは、将来発生するすべてのニーズに対して新しいクラスを作成することを回避するのにも役立つ場合があります。ただし、これはコンテキストに完全に依存します。在庫アプリケーションは、椅子を 3D で表示する必要があるソフトウェアとは根本的に異なる椅子のモデルを必要とします。どうして知っていますか?面接官に聞いてみれば、彼らがあなたにどこに行きたいと思っているかがわかります。

退屈なケース: 椅子には、別のクラスでリファクタリングできるいくつかの共通の動作/データがあります。テーブルについても同じです。では、素材をどのように表現しますか? 繰り返しますが、ドメインによって異なりますので、インタビュアーにお尋ねください。使用している言語の問題でもあります。選択した言語は多重継承をサポートしていますか? 多重継承を使用する必要がありますか (または使用したいですか)? 継承よりも構成を優先することは理にかなっているかもしれません。なぜあなたはどちらか一方に行くのですか?この情報を表現するためのクラスが必要ですか?

どうすればいいですか。

面接担当者に尋ねれば、解決策を教えてくれます。非常に広く定式化された問題に対する唯一の正解はありません。とはいえ、質問が広範であるように、それが定式化される方法は、家具と素材の新しい組み合わせごとにクラスを作成する必要がないように、何かをリファクタリングする必要があることを示唆している可能性があります。

可能な解決策:

  • Table/Chair/Bed が Furniture から継承する必要はありません: 家具のプロパティとマテリアルのプロパティを持つクラス Furniture です。
  • テーブル、椅子、ベッドなど、マテリアルのプロパティを持つすべてのクラス。マテリアルを表現する方法の複雑さは、この情報をどのようにモデル化する必要があるかによって異なります。それは文字列、または IMaterial インターフェイスを実装するクラス (Wood、Iron、Steel) である可能性があります。
于 2013-02-27T09:47:17.210 に答える
0

おそらく、私はAbstract Factoryを使用していました:WoodFurntiture、SteelFurniture、IronFurniture。各工場は椅子、テーブルの作り方を知っています。内部では(必要に応じて)他のDPを使用できますが、今のところ、その必要性はわかりません。

コード:

    namespace Furniture
    {
        class Program
        {
            static void Main(string[] args)
            {
                IFurnitureFactory factory = new WoodFurnitureFactory();
                IFurniture chair = factory.GetChair();
            }
        }

        public interface IFurniture { }
        public class WoodChair : IFurniture { }
        public class WoodTable : IFurniture { }
        public class SteelChair : IFurniture { }
        public class SteelTable : IFurniture { }
        public class IronChair : IFurniture { }
        public class IronTable : IFurniture { }

        public interface IFurnitureFactory
        {
            IFurniture GetChair();
            IFurniture GetTable();
        }

        public class WoodFurnitureFactory : IFurnitureFactory
        {
            public IFurniture GetChair()
            {
                return new WoodChair();
            }

            public IFurniture GetTable()
            {
                return new WoodTable();
            }
        }

        public class IronFurnitureFactory : IFurnitureFactory
        {
            public IFurniture GetChair()
            {
                return new IronChair();
            }

            public IFurniture GetTable()
            {
                return new IronTable();
            }
        }

        public class SteeFurniturelFactory : IFurnitureFactory
        {
            public IFurniture GetChair()
            {
                return new SteelChair();
            }

            public IFurniture GetTable()
            {
                return new SteelTable();
            }
        }
    }
于 2013-02-27T07:21:52.497 に答える