Неважно, имеет ли функция входы или результат. Слишком много вещей может произойти в теле кода, например, создатели экземпляров объектов. Проблема в современном языке.
А как насчет безопасных вызовов API, которые просто извлекают данные, такие как DateTime.Now ()? Собираетесь ли вы создать список вызовов API, которые изменяют состояние и обновляют его для всех нас в течение долгого времени, для всех приложений в вашей организации или на Земле? Собираетесь ли вы документировать, что обрабатывает встроенный компилятор? Тогда, сводя этот подход к абсурду, можем ли мы признать, что это неосуществимо?
Моя архитектура моделирует машины, которые должны изменять только точки данных «Продукт», но даже я признаю, что это невыполнимое правило. У меня есть и другие правила, чтобы попытаться навязать детерминизм. Однако в какой-то момент эти модули должны выполнять вызовы API, чтобы выполнять значимую работу, уже организованную в API сегодня. В противном случае мы переписали бы их все.
class Machine1Product
{
public Cvar<int> Y { get; set; }
}
class Machine1 : Producer<Machine1Product>, IMachine
{
public Cvar<int> X { get; set; }
public void M()
{
// work which changes only product data points (Y)
}
}
До тех пор, пока не будет разработан минималистический язык для функций, нет никаких наблюдений или предотвращения побочных эффектов.