java model 类设计问题
黄舟
黄舟 2017-04-18 09:26:03
[Java讨论组]

最近遇到项目 最基本的model 类设计是这样的
model层

public class ContractModel extends BaseModel  {
    @Transient
    private static final long serialVersionUID = -7915586025811092910L;

    private Integer templatecategary;   // //类型(1维保/2维修)是否有偿(1有偿/2无偿)形式(1**加粗文字**收款/2付款)

    private String name;   //合同名称

    private String code;   //合同编码
    }

但是后面又继承了这个model层 不知道这样设计有什么好处

  public class ContractQueryModel  extends **ContractModel**{
    public String toString(){
        return "Model"+this.getClass().getName()+","+super.toString()+" ,[]";
    }


} 
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(3)
PHP中文网

仅看名字作出以下猜测:
ContractModel是一个DTO,负责传输数据;
ContractQueryModel是一个查询参数对象,负责接收从Controller(或其他地方)传来的查询参数;
由于都是查询Contract,所以字段基本上是一样的,但为了以后扩展方便,所以这里用了继承的方式去实现。

但个人在实际应用中DTO和查询参数一般不是同一结构,DTO如题主所示,查询参数一般是DTO字段的复数形式,例如:

public class ContractQueryModel implements Serializable {
    private Set<Integer> templateCategaries = Collections.emptySet();

    private Set<String> names = Collections.emptySet();

    private Set<String> codes = Collections.emptySet();
    
    ...
}

另外,@菩提旭光 提到的里氏替换原则,可以看一下这个,里面有提到题主这种设计可能会有什么问题。

ringa_lee

如果仅仅覆盖了一个toString的方法而使用继承的话,这个设计本身是有问题的。
如果猜的没有错的话,ContractModel是用在了持久层中的model,那个ContractQueryModel是用在业务层中的model,为了方便,某个开发直接把两者搞成了继承的关系。
个人其实非常反感这种数据和逻辑分离的模式,我比较喜欢如下方式:

Contract contract = new Contract();
contract.setName(...)
...
contract.save();
...
Contract other = Contract.find(...);
...
黄舟

你们真逗, lz都不知道自己要问什么,你们还解答, 而且这问题还成了本周推荐, 奇葩啊

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号