Я думаю, что ключевое понимание - сплоченность . В вашем описании, ваше смешивание очень разные аспекты вашего приложения . Т.е. вы смешиваете взаимодействие пользователя (я хочу пользователя ..) с низкоуровневыми механическими деталями поиска информации c.
Основная идея OSGi состоит в том, чтобы разделить эти части на сервисы . Служба предоставляет низкоуровневую функцию , которая обладает высокой связностью. Т.е. он делает одну вещь и только одну вещь. Если вы посмотрите на службу Event Admin, вы увидите, что она публикует sh и подписывается. Идея состоит в том, что вы получаете разные сервисы, которые хорошо выполняют свою работу и не имеют никакого отношения (или связи) с другими сервисами. Эта стратегия позволяет повторно использовать их во многих различных приложениях. В тот момент, когда вы ослабите сплоченность go, вы обнаружите, что их становится труднее использовать в других приложениях. Это звучит проще, чем есть, часто требуется несколько итераций, чтобы получить действительно сплоченный сервис.
Компоненты - это вещи OSGi, которые могут предоставлять сервисы. Как правило, компоненты потребляют другие услуги. В вашем примере вы можете иметь базу данных, которая содержит города. Чтобы сохранить целостность вашего компонента, он не должен напрямую манипулировать базой данных, а должен использовать сервис. Ваш компонент должен быть экспертом только в городах, но не иметь представления о базе данных. Всякий раз, когда вы пишете компонент, и вам становится известно, что вы пишете код, не связанный с городами, делегируйте его другому сервису. Также убедитесь, что ваша служба баз данных не имеет понятия о городах, она знает только о базе данных. Компонент city имеет удобный способ получить доступ к своим городам из компонента, который вообще не знает городов.
Если вы будете так думать, у вас будет множество служб, которые ничего не делают. Вам нужно где-то, где вы координируете эти услуги. Это приложение . Приложение отвечает за общую функциональность. Его цель - собрать все свободные концы вместе. В вашем случае он будет потреблять город, погоду и другие услуги. Это также будет взаимодействовать с пользователем. Чтобы взаимодействовать с пользователем, он должен уметь искать город. Поэтому такой сервисный интерфейс был бы полезен:
public interface Geo {
List<String> countries();
List<String> cities(String country);
Country city(String country);
City city(String city);
}
Я объединяю ваш город и страну, потому что я нахожу их чрезвычайно сплоченными. Разрушение их увеличивает сложность. Этот сервис позволяет мне создавать всплывающее окно в пользовательском интерфейсе со странами, и из выбранной страны я могу выбрать город.
Далее идет служба погоды:
public interface Weather {
boolean hasWeather( String country, String city);
Report getShortReport(String country, String city);
}
После выбрав страну и город, я могу запросить отчет у службы погоды.
Причина, по которой я использую String в этих интерфейсах, заключается в предотвращении связи между службой Geo и службой погоды. Это одна из главных ошибок ладьи ie, которую я часто вижу. Создавайте типы City & Country, которые затем используются повсеместно (или, что еще хуже, CityKey), эффективно превращая систему в один большой шарик грязи , где все привязано ко всему остальному некоторыми классами, которые просто действуют как строка.
Так что теперь компонент приложения может выбрать GUI (HTML, gogo, Swing, SWT и т. д. c.). Он может эффективно сосредоточиться на GUI, а детали низкого уровня заботятся поставщики услуг. Приложение должно быть единственным компонентом в вашей системе, который никто не может использовать повторно. Если это так, разделите его между повторно используемой частью и определенной c частью. Поскольку этот компонент нельзя использовать повторно, это единственное место в вашем программном обеспечении, где вам не нужно заботиться о связи.
Резюме. Идея состоит в том, что если вы посмотрите на диаграмму сервисов приложения OGSi, должно быть кристально ясно, где что-то происходит, и компонент приложения (часто не сам сервис) связывает все это вместе.
Надеюсь, это поможет .