Потому что это проясняет намерение .
A Function
ясно говорит: "У меня будет кое-что для тебя, когда я вернусь". ожидание состоит в том, что Function
возвращает что-то, , потому что именно для этого предназначены функции .
A Sub
ясно говорит: "Я * 1014"* делая что-то , что вы должны ожидать, чтобы в конечном итоге добиться успеха ". ожидание состоит в том, что Sub
выполняет действие, изменяет некоторое состояние, вызывает некоторые побочные эффекты.
A Function
, который будет называться DoSomething
, так же запутан, какSub
с именем GetFoo
: намерение скрыто, сама природа процедуры противоречит тому, как она рекламируется.Я ожидаю, что DoSomething
либо преуспеет в , что-то делает , либо выдаст ошибку.Точно так же я ожидаю, что GetFoo
, ну, принесет мне Foo
.
Поскольку невозвратная функция не имеет смысла.
Внесколько языков программирования, Function
(или семантически похожая конструкция), которая не возвращает значение во всех путях кода, даже не могут быть скомпилированы.Использование Функция-без-возврата-значения для всего в VBA очень похоже на злоупотребление языком только потому, что VBA не будет жаловаться на это.Как говорит нам обычная мудрость, не потому, что мы можем , мы должны .
Зачем возвращать void
, когда вы можете вернуть bool
везде,и не назначить его?
public bool DoSomething()
{
// do stuff...
// ...and don't assign the return value.
// woopsie, doesn't compile.
}
Процедура VBA Sub
похожа на метод C # void
: она явно о ее невозвратной природе, и это хорошо.
Поскольку инструменты статического анализа кода будут жаловаться.
Компилятор VBA, как известно, не будет заботиться, если вы напишите код, в котором никогда не ясно, является ли невозвращение неявного возвращаемого значения намереннымили нет.
Когда вы делаете хотите вернуть значение - и забыть, потому что ошибки происходят постоянно - как вы можете быть уверены, что этот является законнымневозвратный, а тот другой нет?Без разбора кода и полного понимания всего, что он делает и почему , вы не можете сказать.Если вам повезет, вы смотрите на небольшие специализированные функции, которые, очевидно, выполняют одну задачу и делают это хорошо.В противном случае вам нужно тратить свое время на понимание происходящего, просто чтобы быть уверенным в что-то, что уже должно быть очевидным .
Инструменты статического анализа кода, такие как Rubberduck (Я утверждаю, что этот проект) помечает эти функции, поскольку они являются потенциальными ошибками , скрывающимися в вашей кодовой базе и ожидающими вас:
![Rubberduck code inspection results](https://i.stack.imgur.com/s9r5b.png)