Играть!фреймворк использует <lot>статики - PullRequest
76 голосов
/ 04 марта 2011

Вааа, игра! Фреймворк имеет так много статических методов. Когда я хожу в школу, нам сказали никогда использовать какую-либо статику, но играйте! использует его, как будто нет завтра. Это как-то хорошо? Если так, то почему?

Мы (7 человек и я) планируем использовать Play! фреймворк для проекта с участием веб-приложения. Мы решили сделать это с Play! поскольку это выглядит довольно забавно, все мы уже знаем Java, и назначение довольно сложное, поэтому мы хотели сосредоточиться на реальном назначении, а не учиться программировать на другом языке.

Однако нам всегда говорили, НИКОГДА не использовать 'static's в любой Java-программе, которую мы разработали, но когда я смотрю на Play! ... Ну ... около половины методов являются статическими.

Полагаю, по крайней мере, мы могли бы использовать одноэлементные объекты (используя Scala, например, ^^) для программирования нашего проекта, но я весьма обеспокоен тем, сколько статики на самом деле содержится в самой платформе.

Итак, я должен беспокоиться об этом? Сделал так, как играть! разработчики запрограммировали его так, чтобы все эти статики не создавали проблем?

(Например, этот поток рассуждает о том, почему статическими элементами следует избегать любой ценой.)

Ответы [ 14 ]

1 голос
/ 25 мая 2011

Я также удивлен количеством статических методов в игре, но почему бы и нет, если они работают нормально ...

На самом деле я не согласен с вашим учителем.

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

Сам JDK, общие Apache или многие фреймворки включают статические методы:

  • StringUtils
  • Pattern.matches (регулярное выражение, вход)

----------

На самом деле, я думаю, вы задаетесь вопросом, что насчет таких классов, как JPA.java: https://github.com/playframework/play/blob/master/framework/src/play/db/jpa/JPA.java

Они используют только статические методы и сохраняют статическое состояние. Это может быть странно, но на самом деле для меня это немного похоже на использование синглтона, за исключением того, что методы используются в статическом контексте вместо объекта. Основное отличие состоит в том, что вам не нужно каждый раз вызывать getInstance ().

Я думаю, что это было разработано так для удобства использования, потому что вызывать "getInstance" неудобно для пользователя, и было бы здорово иметь возможность легко получать сеанс везде (связанный с потоком) вместо того, чтобы внедрить sessionFactory везде с xml или автопроводка ...

Ваш профессор, возможно, говорит вам избегать использования статики, потому что это может быть опасно для вашего дизайна, если вы не используете их правильно. Но обратите внимание, что во многих случаях замена статических методов на одноэлементный не улучшает ваш дизайн. Даже если вы теперь вызовете методы для метода экземпляра, объекты все равно будут тесно связаны ...

Так что, возможно, следует избегать использования статики, за исключением случаев, когда вас не волнует жесткая связь.

  • В этом случае, когда вы вызываете методы JPA.xxx (), ваш код тесно связан с классом JPA игровой среды. Но я не думаю, что игра разработана так, чтобы вы могли легко переключаться с одного фреймворка на другой без каких-либо переделок ...

  • Это большая разница со спецификацией EJB3 или чем-то в этом роде: если методы менеджера сущностей EJB3, где статические, вы будете вынуждены тесно связать свой код с реализацией, вызывая HibernateEntityManager.xxx () или ToplinkEntityManager.xxx (). В этом случае существует общий интерфейс (и мы не можем добавлять статические методы на интерфейсы).

----------

  • Этот класс не является частью Спецификация используется на других рамки.
  • класс JPA имеет только одна реализация: сделанная играть. И они, вероятно, не планирую сделать второй.
  • Таким образом, тесная связь с этим классом игры, пока вы используете Play Framework, кажется, хорошо для меня.
0 голосов
/ 04 октября 2013

Теперь вы можете использовать Spring DI в Play, см. https://stackoverflow.com/a/16552598/10433. Я использую его, и пока он отлично работает.

0 голосов
/ 20 сентября 2013

Одной из причин использования статических методов является статический импорт, который позволяет сократить обозначения и сделать код более читабельным. Это особенно верно при использовании служебных библиотек, таких как Guava или Apache Commons, в которых может быть много статических вызовов.

Нестатические методы контроллера теперь поддерживаются в Play 2.1 с использованием инъекции контроллера, поэтому не очень понятно, почему их не было с самого начала.

0 голосов
/ 04 марта 2011

Если вы являетесь специалистом по объектно-ориентированному программированию, вам не следует использовать static методы / поля, однако они могут использоваться безопасно и не должны вызывать беспокойство ИМХО.

...