Объектно-ориентированный дизайн - дизайн мебельной системы в расширяемой форме - PullRequest
0 голосов
/ 23 января 2020

Я получил этот вопрос во время интервью и не знал, как на него ответить правильно. Вопрос в том, что у нас есть система мебели, с которой мы можем управлять разной мебелью. Каждая мебель имеет свои material (например: дерево, железо) и name, type (например: стул, стол, стол).

Для каждой мебели мы можем позвонить isFireApproved() и getWeight(). Сначала я рисую базовый класс сверху, называемый Furniture и Material. Под Мебель я поместил различные типы мебели, такие как стол, стул и сделал то же самое с классом материала. Как и на следующей диаграмме.

Затем я сказал, что если мы хотим произвести предмет новой мебели, такой как woodchair, мы можем создать новый класс с именем woodchair, который наследует класс wood и chair. класс.

enter image description here

Тогда интервьюер спросил, что, если у нас есть тысячи различной мебели? Что может случиться в этой архитектуре и как ее решить? Я в основном застрял здесь и ответил, что мы можем сделать общий урок, передать тип мебели и материал в экземпляр.

Например:

wood_iron_wardrobe = CommonFurniture(type=[Wardrobe], materials=[Wood, Iron])

В конструкторе мы используем эти параметры для создания нового предмета мебели. Исходя из лица собеседования, я подумал, что не отвечу в правильном направлении. Есть ли какие-либо предложения для этого дизайна? Или есть рекомендации по изучению OOD?

1 Ответ

1 голос
/ 23 января 2020

ИМХО, как вы писали, «мы можем создать новый класс под названием woodchair, который наследует класс древесины и класс стула», я думаю, ему не понравилась идея создать новый класс для каждой комбинации мебели и материала, потому что большое количество возможных классов. В таком случае люди могут предпочесть композицию наследству. Например, Furniture имеет элемент / свойство типа Material. Таким образом, вам потребуется m конкретные классы для Furniture и n классов для материала. При наследовании вам понадобится m x n классов для конкретных продуктов.

Также Material - это обычно c, в Material вы редко что-либо меняете. И множественное наследование невозможно во многих языках. В Java это может выглядеть так:

enum Material (
   WOOD (...),
   IRON (...)
)

class Furniture {
   Material material;
}

Furniture woodChair = new Chair(Material.WOOD);
Furniture ironChair = new Chair(Material.IRON);

Это всего лишь пример, это можно реализовать лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...