Как организовать мой фреймворк, чтобы он стал чище и гибче с Decorator DP? - PullRequest
0 голосов
/ 19 ноября 2018

Я начал работать над крошечной платформой, целью которой будет ускорение разработки приложений с использованием Vert.x с Rx-java2.

Я написал набор базовых классов (аннотация), которые добавляютпостепенно специфические черты.Разработчик должен расширить класс, который ему нужен, в соответствии с возможностями, которые он хочет использовать.Вся иерархия расширяет каркас Vert.x AbstractVerticle , поэтому все классы являются вертиками для Vert.x

Эти функции объявлены в интерфейсах, и эти базовые классы реализуют их.

Интерфейсы:

  • HttpVerticle : поведение вертикали, обеспечивающей возможности HTTP-обслуживания.
  • WebVerticle :поведение вертикали, обеспечивающей возможности обработки HTTP-запросов
  • WebSocketVerticle : поведение вертикулы, обеспечивающей возможности обмена сообщениями WebSocket
  • JdbcVerticle : поведениестатья, предоставляющая возможности асинхронных запросов JDBC.

Базовые классы:

  • BaseVerticle: базовый класс, который содержит базовые функции: ведение журнала, Observables auto-размещение и чтение конфигурации.
  • BaseHttpVerticle: базовый класс, который упаковывает Vert.x HttpServer и управляет конфигурацией Hпорт прослушивания ttp, SSL и т. д.
  • BaseWebVerticle: базовый класс, обертывающий маршрутизатор Vert.x и управляющий обработкой запросов.
  • BaseWebSocketVerticle: база, унаследованная от BaseHttpVerticle и объявляющая webSocketHandler.

Вот диаграмма классов UML, сгенерированная из кода:

a class diagram UML describing base classes hierarchy

Обратите внимание, что 3 первых класса принадлежат Vert.В рамках, моя иерархия классов начинается с BaseVerticle.

Основная проблема: , чтобы охватить все комбинации функций (Web + Jdbc, WS + Jdbc и т. д.), Я должен написать для каждого из них соответствующую реализацию базового класса (например, BaseJdbcWebVerticle ).Если количество доступных функций увеличится, мне придется написать очень большое количество базовых реализаций, которые потенциально повторяют код.

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

1) Как реализовать Decorator DP в моемиерархия базовых классов?

Однако, вот пример использования базового класса в коде крошечного веб-контроллера:

@Configuration
public class AuthenticationVerticle extends BaseJdbcWebVerticle {

    @RequestHandling(path = "/users")
    @ResponseType(ResponseTypeEnum.JSON)
    public Single<Response> getUsers(RoutingContext rc) {
        return connect()
            .flatMap(query().single("SELECT * FROM users"))
            .map(Results::toList)
            .map(Response::ok)
            .onErrorResumeNext(this::defaultExceptionHandler);
    }

    @Override
    public JsonObject jdbcConfiguration() {
        return readConfig("db");
    }
}

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

2) Как будет выглядеть этот код при замене наследования на декоратор DP ?

Надеюсь, все будет достаточно ясно.

С уважением,

...