Проще говоря: плохое разделение проблем внутри кода, приводит к тому, что код не является модульным, приводит к плохому повторному использованию, приводит к дублированию кода.
Если вы никогда не попытаетесь повторить функциональность, вы не получите дублирующийся код, и многие переменные экземпляра не будут проблемой.
Если вы попытаетесь повторить функциональность, то монолитный код, который не является модульным, не может быть повторно использован. Он делает слишком много и может делать только то, что делает. Чтобы сделать что-то подобное, но не то же самое, «проще» вырезать и вставлять, чем разбивать монолитный код. Опыт программистов знает, что дублированный код - это дорога в ад.
Поэтому, хотя многие переменные экземпляра сами по себе не являются основной причиной проблемы, это сильный «запах» того, что проблема возникает.
Язык «не может быть далеко позади» слабее, чем «обязательно должен следовать», поэтому автор не утверждает, что это должно произойти, но в конечном итоге произойдет; если вам нужно повторно использовать функциональность, но не можете, поскольку код не является модульным.
n
булевы переменные, например, создают внутреннее пространство состояний2^n
. Чаще всего ваш объект не имеет такого количества наблюдаемых состояний , но поскольку вы собрали все это состояние в один объект, внутренне вам все равно придется обрабатывать их все.