Статические слои в веб-приложении java


2

Я создаю небольшой веб-сайт для удовольствия/обучения, используя довольно стандартный дизайн Web/Service/Data Access.

Чтобы избавить меня от необходимости создавать экземпляры классов уровня обслуживания/уровня доступа к данным, я сделал методы в них статическими. Я не должен получать проблемы параллелизма, поскольку они используют локальные переменные и т. Д., И не разделяют какие-либо ресурсы (для этого сейчас достаточно простые вещи).

Насколько я вижу, единственным компромиссом для этого является то, что я действительно не придерживаюсь истинного подхода к ОО, но с другой стороны он сохраняет код намного чище.

Есть ли причина, по которой это не было бы жизнеспособным подходом? Какие проблемы могут возникнуть позже? Было бы лучше иметь «фабричный» класс, который может при необходимости возвращать мне экземпляры классов сервиса и уровня данных?

3

Недостатки:

  • Вы не сможете писать тесты, как вы будете не в состоянии писать имитировали доступа/бизнес-логики данных объектов для проверки против.
  • У вас будут проблемы с параллелизмом, так как разные потоки пытаются получить доступ к статическому коду одновременно - или если вы используете синхронизированные статические методы, вы окажетесь в очереди, чтобы использовать статические методы.
  • Вы не сможете использовать переменные экземпляра, которые станут ограничением по мере того, как код становится более сложным.
  • Сложнее будет заменить элементы уровня доступа к данным или доступа к данным, если вам нужно.
  • Если вы намерены написать свое приложение таким образом, вам будет лучше использовать язык, предназначенный для работы таким образом, например PHP.

Вы бы лучше будет для нестатических классов уровня доступа бизнеса/данных либо:

  • Используя одноплодный шаблон (создание одного экземпляра каждого класса и обмен их между потоками). ..
  • Или создавать экземпляры классов в каждом потоке по мере необходимости.

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


-1

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


4

Вы знаете эти аттракционы в парке развлечений, где они говорят: «Пожалуйста, держите руки и ноги внутри езды в любое время»? Оказывается, поездка намного веселее, если вы этого не сделаете. Единственный реальный компромисс заключается в том, что вы не выполняете истинный подход, поддерживающий ваши руки и ноги внутри себя.

Дело в том, что есть причина, по которой вы должны следовать «истинному подходу OO», так же как есть причина держать руки и ноги внутри поездки - это здорово весело, пока вы не начнете кровотечение повсюду.


4

Как вы это описываете, это не «неправильный» подход, но я действительно не вижу проблемы, которую вы пытаетесь избежать. Не можете ли вы просто создать единый экземпляр этих бизнес-объектов при запуске сервера и передать их сервлетам по мере необходимости?

Если вы готовы выбросить OO из окна, вы также можете проверить шаблон Singleton.


2

Я действительно не вижу преимущества для вашего дизайна, и есть много вещей, которые могут пойти не так. Может быть, вы сохраняете строку кода? Вот некоторые недостатки в свой подход:

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

Я действительно не понимаю, что пропуск одной строки кода бушель что-нибудь.

Это не проблема «OO Design», но более уместна. Почему вы даже используете Java таким процедурным способом? Разумеется, PHP был бы более подходящим для такого дизайна (и фактически сэкономил бы время, не имея необходимости компилировать и развертывать).

Я бы просто сделал ваш бизнес-слой нестационарным; это сделает его намного проще для поддержания, изменения и развития вашего приложения.


0

Возможно, вам сложно выполнить тестирование объектов с помощью этого типа архитектуры. Например, если у вас есть слой бизнес-объектов, которые ссылаются на ваш статический уровень доступа к данным, может быть сложно протестировать бизнес-уровень, потому что вы не сможете легко использовать макетные объекты доступа к данным. То есть при тестировании вашего бизнес-уровня вы, вероятно, не захотите использовать «реальные» методы на уровне доступа к данным, потому что они сделают нежелательные изменения в вашей базе данных. Если ваш уровень доступа к данным не был статичным, вы могли бы предоставить объекты определения доступа к бизнес-уровню для целей тестирования.