Каков правильный (или хороший) дизайн, если мне нужен класс, который загружает свои данные из файла (при этом сохраняя функции загрузки в другом классе)?
Это то, что у меня сейчас. Не могу не думать, что есть лучший способ структурировать все это. Часть, которая сбивает меня с толку, - это когда Loader должен вызвать метод в Primary, прежде чем продолжить.
class Primary {
public int x1, x2, x3; //data that is read from file or calculated
public void LoadPrimary {
Loader L = new Loader();
L.Load(this); //pass self as parameter (this can't be the best way though)
}
public void DoStuff() {
x1++; x2--;
}
}
class Loader {
public void Load(Primary PrimToLoad) {
PrimToLoad.x1 = 2; PrimToLoad.x2 = 4;
PrimToLoad.DoStuff(); //call a method in the calling class (better way for this?)
PrimToLoad.x3 = 6;
}
}
class Stub {
public void SomeMethod() {
Primary P = new Primary();
P.LoadPrimary();
}
}
В моем реальном коде я использую класс Loader для инкапсуляции нескольких различных форматов, считываемых из различных источников (так что есть несколько функций Load), в противном случае я бы просто включил функцию в Primary и покончил с этим. Есть ли способ, чтобы класс Loader возвращал Primary вместо void (где сейчас он передает Param). Это кажется слишком «связанным», чтобы быть таким хорошим дизайном.
Какие-нибудь предложения по лучшему способу выполнить этот сценарий? Я предполагаю, что это довольно распространено, но просто не знаю достаточно о дизайне класса или терминологии, чтобы найти ответ в google / SO / etc (как вы ищите в словаре слово, которое вы не можете произнести по буквам).
Обновление / Примечание
Оба ответа (пока) указывают на шаблон Factory. Значит ли это, что для каждого метода Load у меня должен быть отдельный класс? Похоже, излишним в моем конкретном случае. Не означает ли это также, что мой класс Stub должен знать / определять формат файла (чтобы он мог вызывать правильный фабричный класс) вместо того, чтобы просто позволить классу Primary беспокоиться об этом? Кажется, торгует соединением для инкапсуляции.
Определенно знаю, что я должен использовать свойства (на самом деле) и интерфейс (на самом деле), но хотел бы упростить его для вопроса. Не думал об аспекте инъекции, который является хорошим предложением.
Если кто-нибудь может обновить свой ответ, чтобы показать, как будут работать несколько функций загрузки (пожалуйста, сделайте их простыми), я, скорее всего, приму. Я также рассматриваю возможность перемещения функций загрузки обратно в класс Primary в качестве альтернативного решения.