Я думаю, что общее правило может заключаться в том, что служебные функции должны быть статическими.Типичным примером может быть то, как в любом oop-языке класс Math будет содержать статические методы, такие как sqrt (), поскольку на самом деле нет необходимости иметь что-то вроде отдельного объекта Math.
Что касается статических классов, вам следует подуматьклассов, сохраняющих форму состояния, как правило, такую как информация о сеансе, которая необходима независимо от точного пути, пройденного через ваше приложение, и из которого вам обычно требуется ровно один.(подумайте о вашем браузере, вероятно, всегда сохраняя ровно 1 cookie-jar-класс)
Статические переменные - это менее злой двойник глобальных переменных (они сохраняют свое значение, но с ограниченным объемом действия функцией), чтообычно полезны либо для сохранения некоторой формы состояния (например, кэширование данных), либо для перечисления вещей, которые должны быть уникальными, но чья нумерация не очень важна вне области вашей функции или приложения (например, отладка нумерации или профилирование криков из ваших собственныхфункции debug ("..") или profile ())
По сути, используйте любую из них, только если вы уверены, что выполнение "правильного" ООП-подобного способа приведет к созданию монстра.