Я думаю, что канонический ответ здесь заключается в том, что вы должны организовать свой код так, чтобы он был читабельным и обслуживаемым. С учетом вышесказанного также важно учитывать стоимость организации вашего кода и ожидаемую продолжительность его жизни.
Более прямо в ответ на ваш вопрос: функции должны использоваться для замены повторяющихся или иным образом хорошо содержащихся фрагментов кода. Если вы снова и снова применяете одни и те же 10 операций к одним и тем же видам элементов / данных, вы можете подумать о сборе всей этой информации в более краткую и понятную функцию. Как правило, функция требует четко определенных входов и выходов.
Классы, по сути, собирают функции и данные вместе. Подобно тому, как вы должны использовать функцию для сбора операций в краткие, четко определенные коллекции операций, классы должны организовывать функции и данные, которые должны храниться вместе. То есть, если у вас есть набор функций, которые работают с некоторыми вещами, такими как рулевое колесо, тормоза, акселераторы и т. Д., Вам следует подумать о наличии класса Vehicle для организации этих соответствующих функций и данных / объектов.
Помимо того, что они выступают в качестве организационного элемента, следует использовать классы, чтобы можно было легко повторно использовать и создавать несколько «вещей» - предположим, вы хотели получить коллекцию этих Транспортных средств. Классы позволяют вам связать смысл или хотя бы некоторую семантику с вашей программой.
Суть всего этого, однако, состоит в том, чтобы сделать вашу жизнь и жизнь других людей легче, когда дело доходит до разработки и поддержки вашей программы. Итак, во что бы то ни стало, когда вам нужно решить проблему менее чем за десять минут и вы считаете, что это программа одноразового использования, игнорируйте все это, если считаете, что она позволит вам быстрее выполнить то, что вам нужно. Помните, что вся эта организация, семантика и простота повторяющихся операций существуют для того, чтобы упростить для достижения ваших целей.