Если у вас есть «MusicSystem», которая не имеет смысла (и выражает это путем взрыва) без инициализации, у меня возникают проблемы с пониманием варианта использования для создания экземпляра этого объекта, но не для его инициализации.
Если речь идет о передаче его с места на место, я мог бы предложить взглянуть на Generic Lazy , где вы можете лениво загрузить объект.
Таким образом, вы избежите неестественной связи с необходимостью создания экземпляра, а затем сразу же узнаете, что нужно вызвать Initialize (), но вы получите преимущества от отсутствия расходов до тех пор, пока объект не будет фактически использован.
Что касается запаха кода, лично я считаю методы Initialize () запахом кода. Конечно, не всегда показательно, что что-то не так, но обычно это говорит о том, что возможности для инверсии зависимости упускаются. Если мне нужно что-то создать, а затем вызвать Initialize (), мне интересно, почему я не могу создать экземпляр объекта, а затем передать ему все, что ему нужно для того, чтобы его считали инициализированным (или почему он не требует инициализированного Foo в его конструктор).