Дизайн класса - вопрос объектно-ориентированного программирования

В одном случае, с которым я недавно сталкивался, требуемые ручные вызовы в GC.Collect() были при работе с большими объектами C ++, которые были обернуты крошечными управляемыми объектами C ++, к которым, в свою очередь, обращались с C #.

Сборщик мусора так как количество управляемой памяти было незначительным, но количество неуправляемой памяти было огромным. Вручную вызов Dispose() для объектов потребует, чтобы я отслеживал, когда объекты больше не нужны сами, тогда как вызов GC.Collect() очистит любые объекты, которые больше не передаются .....

0
задан Krishnan 18 January 2019 в 16:54
поделиться

2 ответа

Я интерпретировал ваши 3 требования немного по-другому (и я могу ошибаться). Но звучит так, будто общее желание - иметь возможность выполнять различные поиски по всем моделям, верно?

Кроме того, мне кажется, что все варианты являются моделями. Я подозреваю, что разные варианты будут иметь разные варианты, но ничто не подтверждает это. Если это так, вариант - это просто подкласс конкретной модели. Однако, если варианты в конечном итоге имеют один и тот же набор свойств, то вариант - это не что иное, как дополнительный дескриптор модели.

В любом случае, исходя из моих подозрений, я бы сделал Модель центром фокуса и пошел бы с:

(базовый класс)

abstract class Model {
    private Manufacturer manufacturer;
    private String name;
    private String variant;
    private Integer year;
    private BigDecimal price;
    // some more properties related to model
}

(варианты производителя)

abstract class AlphaModel {
    AlphaModel() {
        this.manufacturer = new Manufacturer() { name = "Alpha" }
    }

    // some more properties related to this manufacturer
}

abstract class BetaModel {
    BetaModel() {
        this.manufacturer = new Manufacturer() { name = "Beta" }
    }

    // some more properties related to this manufacturer
}

(варианты модели)

abstract class AlphaBus : AlphaModel {
    AlphaBus() {
        this.name = "Super Bus";
    }
    // some more properties related to this model
}

abstract class BetaTruck : BetaModel {
    BetaTruck() {
        this.name = "Big Truck";
    }
    // some more properties related to this model
}

(фактические случаи)

class AlphaBusX : AlphaBus {
    AlphaBusX() {
        this.variant = "X Edition";
    }
    // some more properties exclusive to this variant
}

class AlphaBusY : AlphaBus {
    AlphaBusY() {
        this.variant = "Y Edition";
    }
    // some more properties exclusive to this variant
}

class BetaTruckF1 : BetaTruck {
    BetaTruckF1() {
        this.variant = "Model F1";
    }
    // some more properties exclusive to this variant
}

class BetaTruckF2 : BetaTruck {
    BetaTruckF2() {
        this.variant = "Model F2";
    }
    // some more properties exclusive to this variant
}

Затем, наконец:

var data = new Set<Model> {
    new AlphaBusX(),
    new AlphaBusY(),
    new BetaTruckF1(),
    new BetaTruckF2()
}

API # 1: [1116 ]

var result = data.First(x => x.manufacturer.name = <manufactuer> 
                          && x.name = <model>
                          && x.variant = <variant>);

API # 2:

var result1 = API#1(<manufacturer1>, <model1>, <variant1>);
var result2 = API#1(<manufacturer2>, <model2>, <variant2>);

API # 3:

var result = data.Where(x => x.price >= <price>);
0
ответ дан Eric 18 January 2019 в 16:54
поделиться

Я бы сказал, что ваше представление класса Bus строго ограничено. Вариант, Модель, Производитель должны быть жесткими ссылками на классы, а не строками. Затем получить имя каждого.

Е.Г. с точки зрения Bus bus1 this.variant.GetName() или из внешнего мира. bus1.GetVariant().name

Ограничивая вашу шину строками, в которых она хранится, вы вынуждены выполнять поиск даже внутри класса шины, который работает гораздо медленнее в масштабе, чем простая ссылка на память.

С точки зрения вашего API (хотя у меня нет примера), ваш единственный способ получить информацию об автобусе ограничен. Если состав шины изменяется (изменяются варианты, вводятся новые классы компонентов), это требует достойного переписывания этой функции, а если другие функции пишутся аналогично, то все эти два.

Это потребовало бы некоторого размышления, но общий подход к этому, который может динамически захватывать информацию на основе входных данных, облегчает добавление / удаление компонентов в дальнейшем. Это будет тем, на чем ваш интервьюер уделял основное внимание с точки зрения продвинутых технических и языковых навыков. Правильная реализация обобщений, делегатов и т. Д. Может значительно упростить дальнейшее обслуживание вашего API. (Извините, у меня нет примера)

Я бы не сказал, что ваш подход здесь обязательно плохой, хотя переменные-члены строки, вероятно, являются единственной серьезной проблемой.

0
ответ дан Prodigle 18 January 2019 в 16:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: