Когда вы находитесь внутри чистой ОО-модели, тогда instanceof
определенно является запахом кода.
Если, однако, вы не используете 100-процентную ОО-модель или вам нужно добавить в нее что-то изснаружи, тогда instanceof или эквиваленты (isXXX()
, getType()
, ...) могут иметь свое применение.
Общее «правило» состоит в том, чтобы по возможности избегать его, особенно когда вы контролирует иерархию типов и может использовать, например, полиморфизм подтипов.Идея состоит не в том, чтобы спросить объект, что это за тип и что-то с ним делать, а в том, чтобы напрямую или косвенно попросить объект через Visitor (по сути, двойной полиморфизм) выполнить какое-либо действие.