Кажется, я застрял между двумя рекомендациями по дизайну.
У меня есть класс, представляющий трехмерный объем, состоящий из блоков. Этот класс предоставляет простые методы модификации, такие как AddBlock или RemoveBlock.
Есть несколько вещей, которые мне нужно сделать с этим классом
Во-первых, мне нужно знать определенные совокупные свойства тома с помощью таких методов, как GetTotalWeight или GetMaximumWidth.
Во-вторых, мне нужно выполнить операции преобразования над этими томами, такие как Уменьшение или Обрезка, которые делают почти то, о чем говорят названия (нет необходимости вдаваться в подробности, объемы просто меняйте по каким-то правилам, добавляя или удаляя блоки). В этих операциях много логики.
У меня вопрос: если я добавлю эти методы запроса и преобразования в класс Volume, нарушит ли это принцип единой ответственности? Моими обязанностями на занятиях будут:
- Храните объемные данные, позволяя выполнять простые модификации (добавлять и удалять блоки)
- Предоставление сводной информации об объеме
- Предоставьте возможности преобразования для этих томов.
Если я решу, что это слишком большая ответственность и что класс Volume должен просто представлять объем, мне нужно будет создать такие классы, как VolumeTrimmer, VolumeShrinker и т. д. для преобразований и WeightCalculator для запросов.
Этот последний вариант, по-видимому, аккуратно разделяет проблемы в разных классах. Однако, если я посмотрю на детали Trim(Volume v) моего VolumeTrimmer, все, что он делает, это вызывает операции над объемом. В то же время метод CalculateWeight(Volume v) моего WeightCalculator, по-видимому, больше всего связан с Volume.
Когда я смотрю на такой метод, я чувствую необходимость использовать рефакторинг Move Method. Я смотрю на код и говорю: «Этот метод в основном связан со свойствами другого класса, поэтому мне лучше перенести этот метод в этот класс». Но это возвращает ответственность классу Volume!
Любые идеи о том, как мне подойти к этой проблеме? Я неправильно понимаю эти рекомендации?
Volume
кажется мне странным. Объем — это свойство чего-то, например, структуры. - person Sam Holder   schedule 09.09.2014