Гаразд, тому заголовок невеликий клік, але серйозно я розказав , не вимагайте удару. Мені подобається, як це заохочує методи використовувати як повідомлення справжнім об'єктно-орієнтованим способом. Але в цьому є гостра проблема, яка брякає в моїй голові.
Я підозрюю, що добре написаний код може одночасно дотримуватися принципів ОО та функціональних принципів. Я намагаюся узгодити ці ідеї, і великий момент, який я приземлився, - це return
.
Чиста функція має дві якості:
Виклик його неодноразово на одних і тих же входах завжди дає однаковий результат. Це означає, що воно незмінне. Його стан встановлюється лише один раз.
Він не дає побічних ефектів. Єдина зміна, викликана його викликом, - це результат.
Отже, як можна говорити про те, щоб бути чисто функціональним, якщо ви присягнули використовувати return
як спосіб спілкування результатів?
Телль, не проси ідея працює, використовуючи то , що деякі розгляне побічний ефект. Коли я маю справу з об'єктом, я не запитую його про його внутрішній стан. Я кажу йому, що мені потрібно зробити, і він використовує свій внутрішній стан, щоб зрозуміти, що робити з тим, що я йому сказав. Як тільки я це кажу, я не запитую, що він зробив. Я просто очікую, що він щось зробив у тому, що йому сказали.
Я думаю про Tell, не запитуйте як інше ім'я для інкапсуляції. Коли я користуюся, return
то поняття не маю, що мене дзвонило. Я не можу говорити, що це протокол, я повинен змусити його вирішувати мій протокол. Що у багатьох випадках виражається як внутрішній стан. Навіть якщо те, що піддається впливу, не зовсім стан, зазвичай це лише якийсь обчислення, виконане на аргументах стану та введення. Наявність інтерфейсу для реагування дає можливість перетворити результати на щось більш значуще, ніж внутрішній стан чи розрахунки. Це передача повідомлення . Дивіться цей приклад .
Ще в той час, коли на дискових пристроях насправді були диски, а палець - це те, що ви робили в машині, коли колесо було занадто холодне, щоб торкатися пальцями, мене навчали, як дратівливі люди розглядають функції, які мають параметри. void swap(int *first, int *second)
здавалося таким зручним, але нас заохочували писати функції, які повертали результати. Тож я взяв це до душі на вірі і почав слідувати за нею.
Але зараз я бачу людей, що будують архітектури, де об’єкти дозволяють, як вони були побудовані, контролюють, куди вони надсилають свої результати. Ось приклад реалізації . Введення об'єкта вихідного порту здається трохи схожим на ідею вихідного параметра. Але саме так об'єкти Tell-Don't-ask розповідають іншим об'єктам, що вони зробили.
Коли я вперше дізнався про побічні ефекти, я подумав про це як вихідний параметр. Нам сказали, щоб не здивувати людей тим, що частина робіт відбулася напрочуд, тобто не дотриманням return result
конвенції. Тепер впевнений, я знаю, що існує купа паралельних проблем з асинхронною ниткою, які побічні ефекти приховують, але повернення насправді є лише умовою, за допомогою якої ви залишаєте результат натиснутим на стек, так що все, що називається, ви можете пізніше пізніше. Це все, що насправді є.
Що я насправді намагаюся запитати:
Є return
єдиний спосіб уникнути всіх цих побічних наслідків і отримати безпеку ниток без замків і т. Д. Або я можу слідувати, сказати, не питати чисто функціонально?