В качестве фона я работаю над инкрементальной игрой, и я столкнулся со странным затруднением в отношении обычно класса среднего класса, вот ситуация.
У меня есть 3 класса: Engine, EngineList и Resources. Двигатели «производят» определенный тип ресурсов, EngineList (очевидно) хранит и обрабатывает список различных двигателей. А Ресурсы - это единый ресурс, который управляет всеми ресурсами Ресурсы содержат один частный статический EngineList среди других переменных для других типов ресурсов. Другие классы действительно имеют доступ только к ресурсам, и если они получат доступ к EngineList, это будет сделано через ресурсы.
Многие вызовы в Ресурсах, касающиеся двигателей, являются просто вызовами одной и той же точной функции EngineList. В качестве примеров:
public float getEnergyCost(string id)
{
return energyEngines.getCost(id);
}
public int getEnergyAmount(string id)
{
return energyEngines.getNum(id);
}
... и единственный когда-либо экземпляр EngineList будет происходить из ресурсов.
Проблема в том, что в EngineList все еще есть другие задания. Задания, которые (на мой взгляд) больше подходят для чего-то, что объединяет всех производителей одного типа ресурса , а не для работы чего-то, что обрабатывает всех типов ресурсов . (В качестве примера они включают суммирование общего объема производства двигателей, хранение констант для всех идентификаторов двигателей и т. Д.)
своего рода TL; DR:
В данный момент Resources является своего рода посредником в том, что касается вызова этих методов для других классов, но в EngineList по-прежнему есть другие задания (и, в конечном счете, общая задача, отличная от ресурсов). Прямо сейчас это то, что я понимаю как варианты.
- Поглощение функциональности EngineList в ресурсы
- Сделать EngineList подклассом ресурсов (хотя я не уверен, что это изменит проблему)
- Сделайте EngineList одиночным (в отличие от частной статики ресурсов), и классы Resources и Other будут иметь к нему прямой доступ
- Оставь как есть
Хотя я не уверен, что правильно, здесь явно пахнет, но я точно не знаю. Последний вопрос, как бы справиться с ситуацией полу-среднего человека и почему?
ПРИМЕРНЫЙ КОД:
public class Engines {
//does enginey things
}
EngineList aka EnergyEngines
public class EnergyEngines {
public const string STOMPER_ID = "Stompers";
public const string JUMPER_ID = "Jumpers";
Dictionary<string, Engine> engines;
float productionSum;
public EnergyEngines()
{
productionSum = 0;
engines = new Dictionary<string, Engine>();
engines.Add(STOMPER_ID, new Engine(STOMPER_ID, .15f, 1f, 1.3f));
engines.Add(JUMPER_ID, new Engine(JUMPER_ID, 10f, 2.7f, 5f));
}
public float ProductionSum
{
get { return productionSum; }
}
public bool tryPurchase(string id)
{
Engine e = engines[id];
if (e != null)
{
if(e.NextCost <= Resources.Res.Energy+.01f)
{
Resources.Res.Energy -= e.NextCost;
e.Amount++;
recalculateProduction();
return true;
}
}
return false;
}
void recalculateProduction()
{
productionSum = 0;
foreach (Engine e in engines.Values)
{
productionSum += e.TotalProduction;
}
}
public float getCost(string id)
{
Engine e = engines[id];
if (e != null)
{
return e.NextCost;
}
return float.MaxValue;
}
public int getNum(string id)
{
Engine e = engines[id];
if (e != null)
{
return e.Amount;
}
return -1;
}
}
Ресурсы:
public class Resources : MonoBehaviour
{
const int playerIncrement = 1;
private static Resources instance;
public static Resources Res { get { return instance; } }
private static EnergyEngines energyEngines;
public float Energy { get; set; }
Resources()
{
Energy = 0;
energyEngines = new EnergyEngines();
}
// Use this for initialization
void Awake()
{
if (instance == null)
{
instance = this;
}
}
void FixedUpdate()
{
Energy += energyEngines.ProductionSum * Time.fixedDeltaTime;
}
void Update()
{
HUDManager.Hud.updateEnergyText();
}
public void tapEnergy()
{
Energy += playerIncrement;
}
public bool tryEnergyPurchase(string type)
{
if (energyEngines.tryPurchase(type))
{
HUDManager.Hud.updateWorkerInfo();
return true;
}
return false;
}
public float getCost(string id)
{
return energyEngines.getCost(id);
}
public int getAmount(string id)
{
return energyEngines.getNum(id);
}
// ... other things with other resources,
}