Я часто сталкиваюсь с вспомогательными или утилитарными классами на Java или на любом другом языке. Поэтому я спрашивал себя, не является ли это своего рода Anti Pattern, а существование таких классов - просто отсутствие недостатков в дизайне и архитектуре программного обеспечения.
Часто эти классы ограничиваются использованием только статических методов, которые делают много вещей. Но в основном это действительно зависит от контекста и состояния.
Мой вопрос: каково ваше мнение о такого рода статических вспомогательных / утилитарных классах, потому что, конечно, преимущество заключается в быстром вызове с использованием только имени класса.
И на каком уровне абстракции вы бы избегали использования таких классов?
На мой взгляд, ключевое слово «static» должно быть разрешено только в объявлении класса (Java), а не для методов. По моему мнению, если использовать его таким образом, это может быть хорошей альтернативой и средним способом, чтобы иметь возможность комбинировать Procuedural- и OO-Paradigms в Java и избежать неправильного использования ключевого слова.
Дополнения из-за ответов:
Сначала я думаю, что вполне законно иметь возможность комбинировать различные парадигмы и даже использовать интерпретируемые во время выполнения языки сценариев в скомпилированном коде машины или vm.
Мой опыт показывает, что в процессе разработки проекта такие помощники и утилиты, или как там их называют, растут и растут и используются в каждом забытом уголке кодовой базы, которая изначально была разработана как модульная и гибкая. А из-за нехватки времени, чтобы провести рефакторинг или еще раз подумать о дизайне, вы просто сделаете его намного хуже со временем.
Я думаю, static
следует удалить из Java. Особенно сейчас, когда можно использовать еще более сложные функциональные языковые элементы.
источник
Ответы:
Ну, в Java нет свободных функций, поэтому вы вынуждены поместить их как статические функции в некоторый проформационный класс. Необходимый обходной путь никогда не является антишаблоном, хотя ему может не хватать элегантности.
Далее, нет ничего плохого в бесплатных функциях. На самом деле, использование бесплатных функций уменьшает связность, поскольку они имеют доступ только к общедоступному интерфейсу, а не ко всем подробностям.
Конечно, использование свободных / статических функций никоим образом не уменьшает опасности изменяемого общего, особенно глобального, состояния.
источник
this
, и требуют, чтобы что-то былоСтатические утилиты или вспомогательные функции не являются антишаблоном, если они придерживаются некоторых рекомендаций:
Они должны быть свободны от побочных эффектов
Они используются для специфического поведения приложения, которое не принадлежит классу или классам, над которыми работают эти функции
Они не требуют какого-либо общего состояния
Общие случаи использования:
Например, в приложении, над которым я работал, пользователи хранят записи в журнале для своих действий. Они могут указать дату отслеживания и загрузить напоминание о событии. Мы создали статический служебный класс, чтобы взять запись журнала и вернуть необработанный текст для файла .ics.
Это не требует какого-либо общего состояния. Оно не изменяло никакое состояние, и создание события iCal определенно зависело от приложения и не входило в класс записей журнала.
Если статические функции или служебные классы имеют побочные эффекты или требуют общего состояния, я бы порекомендовал переоценить этот код, так как он вводит связывание, которое может быть трудно смоделировать для модульного тестирования.
источник
Это будет зависеть от вашего подхода. Многие приложения написаны более функционально, в отличие от классического мышления (включая большую часть набора сайтов, на которых вы работаете).
При таком образе мышления в рабочих классах будет много служебных методов, которые можно объединить как статические методы. Они передаются / используются ближе к простым объектам, которые только хранят данные и передаются.
Это правильный подход и может работать очень хорошо, особенно в масштабе.
источник
Agent.Save(obj)
противagentInstance.Save(obj)
. С последним у вас есть возможность внедритьagentInstance
в использование кода. В результате вы можете придать любой дочерний класс отAgent
слишком который позволяет повторно использовать О.Г. с помощью кода с различными «типами»Agent
без перекомпиляции. Это низкая связь .Я лично думаю, что единственная важная часть таких вспомогательных классов - это то, что они должны быть приватными. Кроме того, они строго хорошая идея (применяется экономно).
Я думаю об этом - если при реализации класса (или функции) что-то вроде этого полезно и делает эту реализацию более понятной, как это может быть плохо? И ЧАСТО очень важно определить такие частные вспомогательные классы, чтобы позволить интеграцию и использование других алгоритмов, которые зависят от данных, находящихся в определенной форме.
Называть ли его «помощником» - это маленький вопрос личного вкуса, но это означает, что он помогает в реализации и не представляет интереса / пользы для более широкой аудитории. Если это имеет смысл - дерзайте!
источник
java.lang.Math
.Распространенность
static
вспомогательных классов основана на заблуждении. Тотstatic
факт, что мы называем классы только с методами «служебными классами», не означает, что в POJO нельзя писать общее поведение.static
вспомогательные классы являются анти-паттернами по трем причинам:Статический доступ к этим вспомогательным методам скрывает зависимости . Если бы эти «служебные классы» были POJO, вы могли бы внедрить их int в зависимый класс в качестве параметров конструктора, что сделало бы зависимость очевидной для любого пользователя зависимого класса.
Статический доступ к этим вспомогательным методам вызывает тесную связь . Это означает, что код, использующий вспомогательные методы, трудно использовать повторно и (как побочный эффект) тестировать.
Особенно, если они поддерживают состояние, это просто глобальные переменные . И, надеюсь, никто не утверждает, что глобальные переменные - это хорошо ...
Статические вспомогательные классы являются частью анти-паттерна кода STUPID .
ОП написал:
Статические statefull конструкции являются глобальными состояниями.
Да, конечно. И почти всем приложениям нужно какое-то глобальное состояние .
Но глобальное состояние ! = Глобальная переменная .
Вы можете создать глобальное состояние с помощью методов OO с помощью внедрения зависимостей. Но вы не можете избежать глобального состояния с помощью статических структур с полным состоянием, которые являются глобальными переменными внизу.
источник
Func<Result, Args>
объекты, которые создаются в другом месте.