Вот код, который я хочу получить:
- A
Character
имеет strength
, constitution
и некоторые другие характеристики. - Каждый
Character
имеет BaseStats
в зависимости от своего класса. - Каждый
Character
имеет бонус RandomStats
, с положительными значениями от 0 до 3. - Статистика не может быть ниже 1 или выше 10.
- A
Character
может иметь Bonus
и Malus
в своей статистике. - Если у
Character
есть 8 в strength
, плюс бонус 4 и малус 1, у него, наконец, 10 (8 + 4-1 = 11> 10). - Если у
Character
есть 3 по конституции, плюс бонус 1 и малус 4, у него, наконец, 1 (3 + 1-4 = 0 <1). </li>
В моем решении .NET я пытаюсь разделить datas
и builders
в разных проектах.В настоящее время у меня есть что-то вроде этого в моем datas
проекте:
namespace Data.Entities.Characters
{
public abstract class Character : Entity
{
public abstract EntityStats BaseStats { get; }
public EntityStats RandomStats { get; }
}
}
namespace Data.Stats
{
public struct EntityStats
{
private Dictionary<EntityStat, int> _stats;
public int this[EntityStat stat] { get { return _stats[stat]; } }
public EntityStats(int strength, int constitution, /* ... */)
{
_stats = new Dictionary<EntityStat, int>();
_stats.Add(EntityStat.Strength, strength);
_stats.Add(EntityStat.Constitution, constitution);
/* ... */
}
}
}
Затем у меня есть builder
, что составляет List<EntityStats
.
namespace Builder
{
public class EntityStatsBuilder
{
private List<EntityStats> StatsList { get; set; }
public EntityStatsBuilder() { StatsList = new List<EntityStats>(); }
public void Add(EntityStats stats) { StatsList.Add(stats); }
public EntityStats ToStats()
{
int strength = 0,
constitution = 0,
/* ... */;
foreach (EntityStats stats in StatsList)
{
strength += stats[EntityStat.Strength];
constitution += stats[EntityStat.Constitution];
/* ... */
}
// module FMath =
// let Clamp value min max =
// if value < min then min elif value > max then max else value
return new EntityStats(
FMath.Clamp(strength, 1, 10),
FMath.Clamp(constitution, 1, 10),
/* ... */
);
}
}
}
Моя проблемаследующее:
Мой builders
проект ссылается на мой datas
проект.
ОШИБКА : я хочу добавить свойство FinalStats
в мой класс Character
,Этот FinalStats
должен использовать мой EntityStatsBuilder
класс.Тогда мой datas
проект должен ссылаться на мой builders
проект.
public EntityStats FinalStats
{
get
{
EntityStatsBuilder builder = new EntityStatsBuilder();
builder.Add(BaseStats);
builder.Add(RandomStats);
return builder.ToStats();
}
}
Как мне изменить мою глобальную архитектуру, чтобы не было этой циклической зависимости?