В одном случае, с которым я недавно сталкивался, требуемые ручные вызовы в GC.Collect()
были при работе с большими объектами C ++, которые были обернуты крошечными управляемыми объектами C ++, к которым, в свою очередь, обращались с C #.
Сборщик мусора так как количество управляемой памяти было незначительным, но количество неуправляемой памяти было огромным. Вручную вызов Dispose()
для объектов потребует, чтобы я отслеживал, когда объекты больше не нужны сами, тогда как вызов GC.Collect()
очистит любые объекты, которые больше не передаются .....
Я интерпретировал ваши 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>);
Я бы сказал, что ваше представление класса Bus строго ограничено. Вариант, Модель, Производитель должны быть жесткими ссылками на классы, а не строками. Затем получить имя каждого.
Е.Г. с точки зрения Bus bus1 this.variant.GetName()
или из внешнего мира. bus1.GetVariant().name
Ограничивая вашу шину строками, в которых она хранится, вы вынуждены выполнять поиск даже внутри класса шины, который работает гораздо медленнее в масштабе, чем простая ссылка на память.
С точки зрения вашего API (хотя у меня нет примера), ваш единственный способ получить информацию об автобусе ограничен. Если состав шины изменяется (изменяются варианты, вводятся новые классы компонентов), это требует достойного переписывания этой функции, а если другие функции пишутся аналогично, то все эти два.
Это потребовало бы некоторого размышления, но общий подход к этому, который может динамически захватывать информацию на основе входных данных, облегчает добавление / удаление компонентов в дальнейшем. Это будет тем, на чем ваш интервьюер уделял основное внимание с точки зрения продвинутых технических и языковых навыков. Правильная реализация обобщений, делегатов и т. Д. Может значительно упростить дальнейшее обслуживание вашего API. (Извините, у меня нет примера)
Я бы не сказал, что ваш подход здесь обязательно плохой, хотя переменные-члены строки, вероятно, являются единственной серьезной проблемой.