Что-то не так с классом со всеми статическими методами? - PullRequest
45 голосов
/ 18 марта 2010

Я делаю обзор кода и наткнулся на класс, который использует все статические методы. Метод input принимает несколько аргументов, а затем начинает вызывать другие статические методы, передавая все или некоторые аргументы, полученные методом input.

Это не похоже на класс Math с практически не связанными вспомогательными функциями. В моем собственном нормальном программировании я редко пишу методы, в которых появляется Резарпер и говорит, что «это может быть статический метод», а когда я это делаю, это, как правило, бессмысленные служебные методы.

Что-то не так с этим шаблоном? Является ли это вопросом личного выбора, если состояние класса хранится в полях и свойствах или передается среди статических методов с использованием аргументов?

ОБНОВЛЕНИЕ : конкретное передаваемое состояние является набором результатов из базы данных. Класс отвечает за заполнение шаблона электронной таблицы Excel из набора результатов из БД. Я не знаю, имеет ли это какое-то значение.

Ответы [ 16 ]

1 голос
/ 29 апреля 2010

Передача всех состояний в качестве параметров метода может быть полезной схемой проектирования. Это гарантирует, что нет общего изменяемого состояния, и, таким образом, класс является поточно-ориентированным. Сервисы обычно реализуются с использованием этого шаблона.

Однако, передача всех состояний через параметры метода не означает, что методы должны быть статическими - вы все равно можете использовать тот же шаблон с нестатическими методами. Преимущества статичности методов в том, что вызывающий код может просто использовать класс, ссылаясь на него по имени. Там нет необходимости для инъекций или поиска или любого другого посредника. Недостатком является удобство обслуживания - статические методы не являются динамической диспетчеризацией и не могут быть легко разделены на подклассы или подвергнуты рефакторингу для интерфейса. Я рекомендую использовать статические методы, когда есть только одна возможная реализация класса и когда есть веская причина не использовать нестатические методы.

1 голос
/ 18 марта 2010

Лично я склонен думать, что метод, изменяющий состояние объекта, должен быть методом экземпляра класса этого объекта. Фактически, я считаю это большим пальцем: метод, модифицирующий объект, является методом экземпляра класса этого объекта.

Однако есть несколько исключений:

  • методы, которые обрабатывают строки (например, заглавные буквы или первые символы)
  • метод, который не имеет состояния и просто собирает некоторые вещи для создания нового без какого-либо внутреннего состояния. Они, очевидно, редки, но обычно полезно сделать их статичными.

Фактически я рассматриваю статическое ключевое слово как таковое: параметр, который следует использовать с осторожностью, поскольку он нарушает некоторые принципы ООП.

1 голос
/ 18 марта 2010

Это зависит от того, действительно ли переданные аргументы могут быть классифицированы как состояние .

Иметь статические методы, вызывающие друг друга, можно, если все функциональные возможности разделены на несколько методов, чтобы избежать дублирования.Например:

public static File loadConfiguration(String name, Enum type) {
    String fileName = (form file name based on name and type);
    return loadFile(fileName); // static method in the same class
}
0 голосов
/ 18 марта 2010

Я не совсем уверен, что вы имели в виду под методом входа, но если вы говорите о чем-то вроде этого:

 MyMethod myMethod = new MyMethod();
 myMethod.doSomething(1);

 public class MyMethod {
      public String doSomething(int a) {
          String p1 = MyMethod.functionA(a);
          String p2 = MyMethod.functionB(p1);
          return p1 + P2;
      }
      public static String functionA(...) {...}
      public static String functionB(...) {...}
 }

Это не рекомендуется.

Я думаю, что использование всех статических методов / синглетонов - хороший способ кодирования вашей бизнес-логики, когда вам не нужно ничего сохранять в классе. Я склонен использовать его над синглетонами, но это просто предпочтение.

 MyClass.myStaticMethod(....);

вместо:

 MyClass.getInstance().mySingletonMethod(...);

Все статические методы / синглеты, как правило, также используют меньше памяти, но в зависимости от того, сколько у вас пользователей, вы можете даже не заметить этого.

0 голосов
/ 18 марта 2010

Если нет необходимости создавать объект класса, тогда нет проблемы в создании всего метода как статического для этого класса, но я хочу знать, что вы делаете с классом, полным статических методов.

0 голосов
/ 18 марта 2010

"Состояние класса ... передается среди статических методов с использованием аргументов?"Вот как работает процедурное программирование.

Класс со всеми статическими методами и без переменных экземпляра (кроме статических конечных констант) обычно является служебным классом, например, Math.Нет ничего плохого в том, чтобы создать класс универсальности (не сам по себе). Кстати: если вы создаете вспомогательный класс, вы должны предотвратить использование этого класса для создания объекта.в Java вы могли бы сделать это, явно указав конструктор, но сделав его закрытым.Хотя, как я уже сказал, в создании служебного класса нет ничего плохого, но если большая часть работы выполняется классом утилит (который в обычном смысле не является классом - это скорее набор функций), тогдаЭто, вероятно, признак того, что проблема не была решена с использованием объектно-ориентированного парадима.это может или не может быть хорошей вещью

Метод ввода принимает несколько аргументов, а затем начинает вызывать другие статические методы, передавая все или некоторые аргументы, полученные методом входа.Исходя из этого, весь класс представляет собой всего лишь один эффективный метод (это определенно будет иметь место, если все остальные статические методы являются частными (и являются просто вспомогательными функциями), и не существует переменных экземпляра (константы запрета)).быть и хорошо, это эск.структурированное / процедурное программирование, довольно аккуратное, когда они (функция и ее помощник) объединены в одном классе.(в C вы просто поместите их все в один файл и объявите статический объект помощника (то есть доступ из этого файла невозможен))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...