Я подозреваю, что не собираюсь заглядывать в этот вопрос, но я очень опытный программист, и я надеюсь, что некоторые из более открытых читателей обратят внимание.
Я считаю, что объектно-ориентированные языки программирования лучше подходят для того, чтобы их процедуры возврата значений (VRP) были детерминированными и чистыми.
«VRP» - это современное академическое название для функции, которая вызывается как часть выражения и имеет возвращаемое значение, которое условно заменяет вызов во время вычисления выражения. Например, в таком утверждении, как x = 1 + f(y)
функцияf
, выступает в качестве VRP.
«Детерминистический» означает, что результат функции зависит только от значений ее параметров. Если вы вызовете его снова с теми же значениями параметров, вы обязательно получите тот же результат.
«Чистый» означает отсутствие побочных эффектов: вызов функции ничего не делает, кроме вычисления результата. Это может быть интерпретировано не значит не важно побочных эффектов на практике, поэтому, если VRP выводит сообщение отладки каждый раз, когда оно вызывается, например, это, вероятно, можно игнорировать.
Таким образом, если в C # ваша функция не является детерминированной и чистой, я говорю, что вы должны сделать ее void
функцией (другими словами, не VRP), и любое значение, которое она должна вернуть, должно быть возвращено либо в out
a, либо в a.ref
параметре, параметре.
Например, если у вас есть функция для удаления некоторых строк из таблицы базы данных, и вы хотите, чтобы она возвращала количество удаленных строк, вы должны объявить ее примерно так:
public void DeleteBasketItems(BasketItemCategory category, out int count);
Если вы иногда хотите вызвать эту функцию, но не получите count
, вы всегда можете объявить перегрузку.
Возможно, вы захотите узнать, почему этот стиль лучше подходит для объектно-ориентированного программирования. В целом, он вписывается в стиль программирования, который можно (немного неточно) назвать «процедурным программированием», и это стиль процедурного программирования, который лучше подходит для объектно-ориентированного программирования.
Зачем? Классическая модель объектов состоит в том, что они имеют свойства (или атрибуты), и вы запрашиваете и манипулируете объектом (главным образом) посредством чтения и обновления этих свойств. Стиль процедурного программирования облегчает эту задачу, поскольку вы можете выполнять произвольный код между операциями, которые получают и устанавливают свойства.
Недостатком процедурного программирования является то, что, поскольку вы можете выполнять произвольный код повсюду, вы можете получить очень тупые и уязвимые для взаимодействия взаимодействия через глобальные переменные и побочные эффекты.
Итак, довольно просто, хорошей практикой является сигнализировать кому-то, читающему ваш код, что у функции могут быть побочные эффекты, если она не возвращает значения.