Итак, как же будет выглядеть дизайн решения задачи Problem K (http://thesz.livejournal.com/280784.html) в случае Эрланга. Для начала разберемся, какие возможности в плане декомпозиции нам дает Эрланг
( Read more... )
Не так быстро, Миша. Процессы не отменяют модулей. Тебе все равно потребуется модуль-агрегатор, который будет представлять таблицу целиком, и прятать межпроцессный интероп. Кто-то должен помнить соответствие PID-ов и Ref-ов, так? Вот, это и есть модуль sheet. Код процесса-клетки будет завернут в отдельный модуль - это и будет cell. Абстракция для операций нужна? Нужна. Ну, и так далее :). И получим, с точки зрения модулей, "те же яйца, только вид сбоку". Но - потеряем функциональную чистоту.
Это, однако, прикольная идея. Надо будет попробовать. Закончу эту программу - сделаю прикола ради дизайн на процессах.
Кстати, если по правде говорить, то есть ещё параметризуемые модули, где таки есть чуток состояния, но фича эксперементальная, так что почти не считается :)
Да, знаю про них, это реально прикольная штука. Только в них также нет никакого состояния. Все, что делает такой "модуль" - он выполняет неявную передачу параметров. Вместо
Ну для этой задачи про толк я и не говорил. А неявные параметры и есть по сути состояние, т.к. sheet:evaluate/1 и OldSheet:evaluate/1 могут вернуть разные значения. Иначе методы ООП тоже можно назвать "методами без состояния", если пренебречь неявным параметром this. Хотя всё это уже буквоедство какое-то...
sheet:evaluate( Sheet ) и Sheet:evaluate() вернут нам одно и то же.
"Состояние" - это не неявная передача параметров. Состояние - это == отсутствие прозрачности по ссылкам == наличие у объектов identity == деструктивные модификации данных == наличие понятия "переменная" == наличие понятия "ссылка" или "указатель" == зависимость результата от порядка вычислений == разная реакия на одни и те же наборы входных данных функции.
А здесь не совсем то. Sheet_1:evaluate/0 и Sheet_2:evaluate/0 - это разные функции. Или, думайте о них как об одной функции, но - получающей параметр Sheet. Но состояния тут никакого нет, есть только маленький синтаксический фокус.
Comments 11
Мы спортсмены или инженеры? ;-)
По процессу на каждую ячейку - вот идеальное ерланговское решение!
Reply
Не так быстро, Миша. Процессы не отменяют модулей. Тебе все равно потребуется модуль-агрегатор, который будет представлять таблицу целиком, и прятать межпроцессный интероп. Кто-то должен помнить соответствие PID-ов и Ref-ов, так? Вот, это и есть модуль sheet. Код процесса-клетки будет завернут в отдельный модуль - это и будет cell. Абстракция для операций нужна? Нужна. Ну, и так далее :). И получим, с точки зрения модулей, "те же яйца, только вид сбоку". Но - потеряем функциональную чистоту.
Это, однако, прикольная идея. Надо будет попробовать. Закончу эту программу - сделаю прикола ради дизайн на процессах.
Reply
Reply
Reply
New_Sheet = sheet:evaluate( OldSheet )
будет
New_Sheet = OldSheet:evaluate()
И еще бабка надвое сказала, что лучше.
Скажем, смотри, вот пример кода.
evaluate( Sheet ) -> lists:foldl( fun cell:evaluate/2, Sheet, gb_trees:keys( Sheet ) ).
Будет
evaluate( Sheet ) ->
F = fun( X, Sheet ) -> X:evaluate( Sheet ),
lists:foldl( F, Sheet, gb_trees:keys( Sheet ) ).
И что много ли толку?
Reply
А неявные параметры и есть по сути состояние, т.к. sheet:evaluate/1 и OldSheet:evaluate/1 могут вернуть разные значения.
Иначе методы ООП тоже можно назвать "методами без состояния", если пренебречь неявным параметром this.
Хотя всё это уже буквоедство какое-то...
Reply
"Состояние" - это не неявная передача параметров. Состояние - это == отсутствие прозрачности по ссылкам == наличие у объектов identity == деструктивные модификации данных == наличие понятия "переменная" == наличие понятия "ссылка" или "указатель" == зависимость результата от порядка вычислений == разная реакия на одни и те же наборы входных данных функции.
А здесь не совсем то. Sheet_1:evaluate/0 и Sheet_2:evaluate/0 - это разные функции. Или, думайте о них как об одной функции, но - получающей параметр Sheet. Но состояния тут никакого нет, есть только маленький синтаксический фокус.
Reply
Reply
Reply
несомненно литературный стиль автора пробьет себе дорогу к славе.
Reply
Leave a comment