Java基础、中级、高级、架构面试资料

你真的会写java吗?

JAVA herman 2360浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

阅读别人的文章和代码总有一些好的发现。把这些优秀的实践转换成自己的习惯,一点一点的进步!

最近我在做 code review 的时候,发现很多人不会写代码了。公司工作好几年的,代码写的也只是完成了业务需求而已。所以今天抽个时间,总结一点小技巧。

你真的会写java代码吗?

你真的会写 java 吗?

很多人都说会,你看我的写了好多年了。那我换一个方式问你,你真的优秀吗?

我先来讲一个最简单案例:domain 包名。这个案例,我记得《阿里巴巴开发手册》中写的也有。

根据很多java程序员的”经验”来看,一个数据库表则对应着一个 domain 对象,所以很多程序员在写代码时,包名则使用:com.xttblog.domain ,这样写好像已经成为了行业的一种约束,数据库映射对象就应该是 domain。但是你错了,domain 是一个领域对象,往往我们再做传统 java 软件 web 开发中,这些 domain 都是贫血模型,是没有行为的,或是没有足够的领域模型的行为的,所以,以这个理论来讲,这些 domain 都应该是一个普通的 entity 对象,并非领域对象,所以请把包名改为:com.xttblog.entity。

如果你还不理解我说的话,请看一下Vaughn Vernon出的一本叫做《IMPLEMENTING DOMAIN-DRIVEN DESIGN》(实现领域驱动设计)这本书,书中讲解了贫血模型与领域模型的区别,相信你会受益匪浅。

现在,我问一下你,你们公司的项目是不是就是这样创建包的?或者曾经工作过的公司是这样创建包的。

包建的不规范就不会写java代码?

好吧,我再说一个例子。

前端请求我们的接口,数据传输我们应该使用 DTO,而你是不是直接就把和数据表对应的实体作为传输对象了。连 DTO 都没有?

只要是用于网络传输的对象,我们都认为他们可以当做是DTO对象,比如电商平台中,用户进行下单,下单后的数据,订单会发到OMS 或者 ERP系统,这些对接的返回值以及入参也叫DTO对象。

另外,在使用 DTO 时,是怎么转换成 entity 的?很多人这样写:

@RequestMapping("/v1/api/user")
@RestController
public class UserApi {

    @Autowired
    private UserService userService;

    @PostMapping
    public User addUser(UserInputDTO userInputDTO){
        User user = new User();
        user.setUsername(userInputDTO.getUsername());
        user.setAge(userInputDTO.getAge());

        return userService.addUser(user);
    }
}

你看吧,你虽然使用了 DTO,但是在转换对象时,还在一个一个的 get/set。

你看看同一个组的同事,都是用了 org.springframework.beans.BeanUtils#copyProperties,你为什么不使用呢?如果有几十个属性,你是不是要 get/set 几十次?

就算使用 get/set 方法进行转换,你也可以追随潮流哈。现在都流行链式写法,类似下面的用法:

public class Xttblog {
    private String name;
    private int id;
    // 业余草:www.xttblog.com
    public String getName() {
        return name;
    }

    public Xttblog setName(String name) {
        this.name = name;
        return this;
    }

    public int getId() {
        return id;
    }

    public Xttblog setId(int Id) {
        this.id = id;
        return this;
    }
}

其实呢?这里可以使用一个设计模式。Builder模式(建造者模式),这里说一下,关于设计模式,我后台有一套视频教程,公众号内回复:“设计模式”即可免费下载!

public class Xttblog {
    private String name;
    private int id;

    public String getName() {
        return name;
    }

    public Xttblog setName(String name) {
        this.name = name;
        return this;
    }

    public int getId() {
        return id;
    }

    public Xttblog setId(int id) {
         this.id = id;
         return this;
    }

    public static Builder builder(){
            return new Builder();
    }
    
    public static class Builder{
        private String name;
        private int id;
        public Builder name(String name){
            this.name = name;
            return this;
        }

        public Builder id(int id){
            this.id = id;
            return this;
        }

        public Xttblog build(){
            Xttblog xttblog = new Xttblog();
            xttblog.setId(id).setName(name);
            return xttblog;
        }
    }

}

类似的神操作还有很多,时间关系,我就不多说了。比如,验证交给前端做,后端没有验证等等,太多了。

最后,原谅我起了一个这么严重的话题。夸张了,其实我就想问一下,你真的优秀吗?那么如何做到优秀,3 句话。多看成熟框架的源码、多回头看自己的代码、勤于重构。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 你真的会写java吗?