Thursday, March 09, 2017

nginx != nginx истина или ложь? Не всё так просто...

На Хабре встретилась статья, которая начинается подобной картинкой:
Казалось бы очередной программисткий пёрл, который часто цитируют из индуисткого кода. Но мне что-то не давало спокойно пропустить содержательную часть этой картинки...

И вот что! Выражение на картинке вполне может быть валидно и иметь глубокий смысл.
Пример:
Во первых, nginx это getter, т.е. по факту функция вызываемая без параметров и возвращаемая некое значение. Что в мире объектного программирования встречается сплошь и рядом.
А во вторых, возвращаемое значение может зависеть от времени вызова функции или от последовательности вызова функции, как говорится, фор эзампл: функция может возвращать количество своих вызовов. Т.е. в левой части неравенства будет результат вызова nginx = 1, а во второй уже 2.

Но более интересна всё таки временная зависимость. Левый вызов функции будет произведён ранее, чем правый вызов. Пусть на очень маленькую величину отсчёта времени, но ранее.  А в современных системах это чуть ранее может иметь роль.

Как же учесть временной вызов? Видимо надо передать какой либо параметр или зафиксировать временной срез.
Вызов функции без указания параметра обычно означает использование параметра по умолчанию. Если параметр "время", то по умолчанию зачастую означает "Сейчас" или по английски Now.

Выражение примет вид nginx(NOW) != nginx(NOW) и выражение истинно, так как для каждого вызова функции получается свой NOW (при определённой степени точности в пределе стремящейся к планковской постоянной времени).

Как же получить значения функции в один момент времени.
Надо время завиксировать!
Псевдокод:

var nowTime = DateTime.Now();
if(nginx(nowTime) != nginx(nowTime))  .....
по идее должно вернуть ложь для заданного времени

Сразу же появляется возможность сравнивать состояние функции по отношении к временным интервалам. Например, сейчас и вчера в то же время, или год назад

Но это уже другая история, прологом к которой стала маленькая картинка для привлечения внимания.


No comments: