Pull to refresh

Comments 10

Некоторые советы в этой книге Боба Мартина довольно спорные, на самом деле. Вот хороший критический отзыв на нее, там в том числе и этот пример с PrimeGenerator бегло проанализирован.
С моей точки зрения метод слишком длинный => требует рефакторинга. Выведение всех полей в статики нехорошо не только по причине потокобезопасности, но и потому, что делает неочевидным входы и выходы каждого подметода. Я бы передавал/возвращал масивы явно.

Автор все сделал верно — он демонстрировал, как писать понятный код, а это много важнее того, что пропали вторичные качества (потокобезопасность и прочая редко нужная ерунда — интересно кто этот метод будет выполнять из разных потоков? Да и потом как вы себе представляете ускоренную работу этого метода если его целиков выполнять в разных потоках, а разделяя метод, как раз и возникает возможность распаралелизации, а потокобезпасность допелить потом не проблема ). Конечно пример утрирован, но очевидно показывает, что алгоритм надо писатьн не сплошным текстом, а разбивая его на логичные части.
Рефакторинг — это изменение кода без изменения его функциональности. После этого «рефакторинга» нельзя запустить функцию параллельно для двух разных аргументов так как данные теперь общие и статические.
Может теперь вообще все писать гавно-кодом в одной функции? Функциональность не изменилась, уберете static (который почти всегда лишний и все станет на места) — просто не закончен рефакторинг.
Никто не говорит, что рефакторинг длинных методов не нужен, но если уж показывать пример, то как минимум нужно сказать о потенциальных негативыных последствиях.

Ведь никто не отменял правила из Framework Design Guidelines, которые говорят, что все статические методы должны быть потокобезопасными. Причем сделать это довольно просто, достаточно перенести статическое состояние во вновь выделенный объект, а старый метод сделать фасадным методом. Так бы автор показал, что он знает и уважает принципы той платформы, на которой он пишет примеры, да еще бы и один дополнительный паттерн показал бы в придачу.
Думаю в конкретном случае можно было бы пометить эти переменные ThreadStatic атрибутом.
1. habrahabr.ru/post/231325/?reply_to=7820487#comment_7817957
2. Это потребует также заменить методы на нестатические и добавить фасадный статик метод как сказали ниже. Вы книжку про рефакторинг читали? Видели сколько там усилий предпринимается, чтобы ничего не сломать?
Похоже на рефакторинг замена метода объектом методов, но только с какой-то кривой реализацией на статических переменных.
Данный рефакторинг имеет смысл, если у вас есть длинный метод, в котором локальные переменные так сильно переплетены, что это делает невозможным применение извлечения метода, то есть когда все настолько запущено, что другого выхода практически нет.
Sign up to leave a comment.

Articles

Change theme settings