Хорошо, так что название немного щелкает мышью, но если серьезно, я был на высоте , не проси пинка некоторое время. Мне нравится, как он поощряет использование методов в качестве сообщений в истинно объектно-ориентированном виде. Но у меня есть ноющая проблема, которая гремит в моей голове.
Я подозреваю, что хорошо написанный код может следовать принципам ОО и принципам работы одновременно. Я пытаюсь примирить эти идеи, и большой камень преткновения, на котором я приземлился, - это return
.
Чистая функция имеет два качества:
Повторный вызов с одинаковыми входами всегда дает один и тот же результат. Это подразумевает, что он неизменен. Его состояние устанавливается только один раз.
Это не производит никаких побочных эффектов. Единственное изменение, вызванное вызовом, - это получение результата.
Итак, как же быть чисто функциональным, если вы поклялись использовать в return
качестве способа передачи результатов?
Телль, не проси идея работает, используя то , что некоторые рассмотрит побочный эффект. Когда я имею дело с объектом, я не спрашиваю его о его внутреннем состоянии. Я говорю ему, что мне нужно сделать, и он использует свое внутреннее состояние, чтобы выяснить, что делать с тем, что я сказал, чтобы сделать. Как только я говорю это, я не спрашиваю, что это сделало. Я просто ожидаю, что это сделало что-то с тем, что было сказано.
Я думаю о «Расскажи, не спрашивай» как о чем-то большем, чем просто другое имя для инкапсуляции. Когда я пользуюсь, return
я понятия не имею, как меня называют. Я не могу говорить это протокол, я должен заставить его иметь дело с моим протоколом. Что во многих случаях выражается как внутреннее состояние. Даже если то, что выставлено, не совсем в состоянии, это обычно просто некоторые вычисления, выполняемые для аргументов состояния и ввода. Наличие интерфейса, через который можно реагировать, дает возможность втиснуть результаты во что-то более значимое, чем внутреннее состояние или вычисления. Это передача сообщений . Смотрите этот пример .
Еще в тот день, когда на дисках фактически были диски, а в машине было то, что вы делали в машине, когда колесо было слишком холодным, чтобы прикасаться к нему пальцами, меня учили, как раздражающие люди считают функции, у которых есть параметры. void swap(int *first, int *second)
казалось очень удобным, но нам было предложено написать функции, которые возвращали результаты. Поэтому я принял это близко к сердцу на вере и начал следовать этому.
Но теперь я вижу людей, строящих архитектуры, где объекты позволяют тому, как они были построены, контролировать, куда они отправляют свои результаты. Вот пример реализации . Внедрение объекта выходного порта выглядит снова как идея с выходным параметром. Но именно так объекты «говорите, не спрашивайте» сообщают другим объектам о том, что они сделали.
Когда я впервые узнал о побочных эффектах, я подумал об этом как о выходном параметре. Нам сказали не удивлять людей тем, что некоторые работы происходят удивительным образом, то есть не следуя return result
конвенции. Теперь, конечно, я знаю, что есть куча параллельных асинхронных потоковых проблем, с которыми не справляются побочные эффекты, но return - это на самом деле просто соглашение, согласно которому вы оставляете результат помещенным в стек, так что при любом вызове вы можете удалить его позже. Это все, что есть на самом деле.
Что я действительно пытаюсь спросить:
Является ли return
это единственным способом избежать всех этих побочных эффектов и получить безопасность потоков без блокировок и т. Д. Или я могу сказать, что не спрашивайте чисто функциональным способом?