В последнее время я играю с функциональным программированием, и есть довольно хорошие методы лечения по теме побочных эффектов, почему они должны содержаться и т.д. В проектах, где используется ООП, я ищу некоторые ресурсы, которые выкладываются некоторые стратегии для минимизации побочного эффекта и/или состояния.
Хорошим примером этого является книга RESTful Web Services, которая дает вам стратегии минимизации состояния в веб-приложении. Что другие существуют?
Помните, что я не ищу другую книгу аналитиков ООП/дизайн моделей (хотя хорошая инкапсуляция и свободная связь помогают избежать побочных эффектов), а скорее ресурс, в котором сама тема является состоянием/побочными эффектами.
Некоторые скомпилированные ответы
- Программисты ООП, которые в основном заботятся о состоянии, делают это из-за concurrency, поэтому читайте Java Concurrency на практике. [точно, что я искал]
- Используйте TDD, чтобы сделать побочные эффекты более заметными [мне нравится, например: чем больше у вас установлено значение setUps, тем больше состояний вам нужно, чтобы запускать тесты = хорошее предупреждение]
- Разделение командного запроса [Хороший материал, предотвращает побочный эффект изменения аргумента функции, который обычно запутывает]
- Методы делают только одно, возможно, используют описательные имена, если они изменяют состояние своего объекта, поэтому он прост и понятен.
- Сделать объекты неизменными [Мне это очень нравится]
- Передавать значения как параметры, а не сохранять их в переменных-членах. [Я не связываю это; он загромождает прототип функции и активно обескуражен Clean Code и другими книгами, хотя я признаю, что это помогает государственной проблеме]
- Повторно комментируйте значения вместо их сохранения и обновления [мне также очень нравится; в приложениях, которые я работаю над производительностью, вызывает незначительную озабоченность]
- Аналогичным образом не копируйте состояние, если вы можете его избежать. Сделайте один объект ответственным за его хранение и дайте другим доступ к нему. [Основной принцип ООП, хороший совет]
Ответ 1
Я не думаю, что вы найдете много актуальных материалов в мире ОО по этой теме, просто потому, что ООП (и самое императивное программирование, если на то пошло) полагается на состояние и побочные эффекты. Рассмотрим, например, журнал. Это чистый побочный эффект, но в любом уважающем себя приложении J2EE, он повсюду. Первоначальный QuickSort от Hoare зависит от изменяемого состояния, так как вам приходится менять значения вокруг точки опоры, и все же это тоже везде.
Вот почему многие программисты OO испытывают трудности с обволакиванием парадигм функционального программирования. Они пытаются переназначить значение "x", обнаружить, что это невозможно сделать (по крайней мере, не так, как это возможно на любом другом языке, на котором они работали), и они поднимают руки и кричат "Это невозможно!" В конце концов, если они терпеливы, они учатся рекурсии и карри и как функция карты заменяет необходимость в циклах, и они успокаиваются. Но кривая обучения может быть очень крутой для некоторых.
В наши дни программисты OO, которым больше всего нужно избегать состояния, относятся к concurrency. Причины этого очевидны: изменяемое состояние и побочные эффекты вызывают огромные головные боли, когда вы пытаетесь управлять concurrency между потоками. В результате, лучшее обсуждение, которое я видел в мире OO об избежании состояния, Java concurrency на практике.
Ответ 2
Я думаю, что правила довольно просты: методы должны делать только одно, а намерение должно быть четко сообщено в имени метода.
Методы должны либо запрашивать, либо изменять данные, но никогда оба.
Ответ 3
Некоторые мелочи, которые я делаю:
-
Предпочитайте неизменное состояние, оно относительно мягкое. Например. в Java я делаю переменные-члены final и устанавливаю их в конструкторе, где это возможно.
-
Пропускайте значения как параметры, а не сохраняйте их в переменных-членах.
-
Перепрограммируйте значения вместо их сохранения и обновления, если это можно сделать достаточно дешево. Это помогает избежать непоследовательных данных, забыв обновить его.
-
Аналогично, не копируйте состояние, если вы можете его избежать. Сделайте один объект ответственным за его хранение и дайте другим доступ к нему там.
Ответ 4
Один из способов изолировать побочные эффекты в OO - позволить операциям возвращать только объект описания побочных эффектов.
Разделение командного запроса - это шаблон, близкий к этой идее.
Практикуя TDD (или, по крайней мере, записывая единичные тесты), обычно будет намного лучше понимать побочные эффекты и использовать их более экономно, а также отделять их от других свободных побочных эффектов, которые легко записывать на основе данных ( ожидаемые, фактические) модульные тесты для.