Проблема здесь в том, что мы рассматриваем только одно сообщение, на которое ваши коллекции должны ответить: #normalized
.В вашем коде коллекция sum
- это объект, который должен быть нормализован .Поэтому было бы заманчиво сказать sum normalized
.Однако я бы не рекомендовал добавлять #normalized
к Array
(или Collection
), потому что логика вашей конкретной нормализации не присуща Array
: она зависит от Action
, который выглядит как концепция, которая имеет смысл в контексте вашего проекта.
Это не означает, что вы никогда не должны расширять Array
своими вещами.Это означает только то, что если ваше расширение не является внутренним, такое решение потребует больше размышлений.
В этом случае я хотел бы предложить проанализировать, имеют ли коллекции, подобные sum
, в вашем проекте какое-либо другое внутреннее поведениеим.В этом случае я бы рассмотрел наличие класса для их представления и добавления к этому классу сообщений, таких как #normalized
, плюс любые другие, относящиеся к этим объектам.
Просто в качестве примера давайте предположим, что ваш классназывается StrategyCollection
.Вы можете определить в нем
strategy
^sum collect: [:each | each max: 0.0].
, где sum
теперь является иваром вашего класса.Затем вы можете определить
normalized
strategy := self strategy.
normalizingSum := strategy sum.
^strategy collect: [:each |
normalizingSum strictlyPositive
ifTrue: [each / normalizingSum]
ifFalse: [1.0 / Action subclasses size]]
, который, кстати, можно переписать как
normalized
| strategy normalizingSum |
strategy := self strategy.
normalizingSum := strategy sum.
^normalizingSum strictlyPositive
ifTrue: [strategy collect: [:each | each / normalizingSum]]
ifFalse: [strategy class new: sumstrategy size withAll: 1.0 / Action subclasses size]
Если у вас есть другие стратегии, кроме #max: 0
, вы можете легко настроить кодвыше, чтобы сделать его более общим, используя perform:
или имея специальный подкласс StrategyCollection
, который реализует свою собственную версию #strategy
.
Я также предложил бы добавить метод для выражения Action subclasses size
,Что-то в строках
actionCount
^Action subclasses size
, а затем используйте это в #normalized
.Выражение Action subclasses size
хрупкое и может появляться в других методах.Например, если завтра вы решите сгруппировать некоторые подклассы Action
в другой абстрактный подкласс, число подклассов Action
не будет адаптировано к такому рефакторингу.В более общем смысле поведение ваших объектов не должно зависеть от того, как вы организовываете свой код, потому что это относится к метауровню абстракции.