【问题标题】:Determining Subclasses Types with Attribute使用属性确定子类类型
【发布时间】:2018-05-26 07:51:38
【问题描述】:

我有以下类层次结构

Promotion   -  abstract
  - Coupon
  - Sales
  - Deals

(Coupons、Sales 和 Deals 都是 Promotion 的子类)。

并且希望在 REST API (JSON) 和客户端 (Angular) 之间交换数据时确定对象的类型。用户可以提交Coupon或Deal或Sale。例如,当客户发送优惠券时,我希望能够知道这是优惠券,以便我可以调用正确的方法。

为了解决这个问题,我在 Promotion 中声明了一个变量和一个抽象方法。

protected String promotionType = getPromotionType();
protected abstract String getPromotionType(); 

在子类中,例如 Coupon 我有类似的东西

protected String getPromotionType() {
        return "coupon"
       // OR  return this.getClass().getSimpleName().toLowerCase();
    }

这将自动初始化 promotionType 变量,以便在控制器中检查对象是 Coupon 或 Sales 还是 交易。请记住,JSON 以字符串格式发送数据,所以我必须有办法确定即将到来的对象类型。

在这种情况下,我将有一个控制器来处理我的所有 CRUD 操作。在我的控制器方法中,我将执行以下操作::

@PostMapping public void create(@RequestBody Promotion){

     // And inside here I will check the type of **promotionType**

}

这里使用 Promotion 作为参数,而不是 create() 方法中的任何子类。

我的问题是,这是解决这个问题的最佳方法吗?

或者我必须为每个子类创建一个单独的控制器吗?我正在寻找在现实世界中做到这一点的最佳方式。

我正在使用 Hibernate 进行映射。

【问题讨论】:

    标签: java spring rest spring-mvc


    【解决方案1】:

    我的问题是,这是解决这个问题的最佳方法吗?

    这个问题的答案将始终基于意见,特别是因为我们不了解您的整个应用程序,不仅在技术上而且在业务方面,以及客户端代码如何使用和显示代码。

    或者我必须为每个子类创建一个单独的控制器吗?

    不,不一定。如果代码并且可能会保持简单——有时你可以预料到这一点——对代码进行夸大是没有意义的。拥有三个Controllers 而不是一个PromotionController 很可能会增加冗余代码。否则,如果子类相当异构,三个控制器可能更可取。

    另一个想法,您可能有一个(人类)客户端只管理Deals,并且该客户端有特殊要求导致一堆仅为Deal 定制的休息接口,您可能希望拥有一个单独的Controller。

    我正在寻找在现实世界中做到这一点的最佳方式。

    没有最好的方法。五位开发人员可能对如何解决这个问题有五种意见。并且即使一个暂时更合理,它可能在第二天由于或改变了新的业务需求而改变。

    最好的方法是在团队中讨论这个问题,建立一个常识,如果不确定,让首席架构师决定走哪条路。 Imo,您的方法似乎还不错。那是我的 2 美分。

    【讨论】:

    • 感谢您的回复。该应用程序是优惠券和优惠网站,用户将在其中提交优惠券、优惠或产品销售。
    猜你喜欢
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2023-04-07
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多