匠心精神--来看一个小迭代的代码实现

Posted buguge - Keep it simple,stupid

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了匠心精神--来看一个小迭代的代码实现相关的知识,希望对你有一定的参考价值。

once you do, do it well.

问题

我司对外部商户提供的API中,有一个年久失修的开票记录查询接口,近期在一次集中测试时,发现这个接口的响应值与接口文档里描述的不一致。代码里定义的field名是type,而文档里参数名是invoiceTypeId。

 

修改方案

因为无法确定原先的type有没有商户在用,所以,在模型类里新增invoiceTypeId,以保证与文档一致。

 

代码实现

先介绍这个模型类QueryInvoiceResultResponse,是一个普通的POJO,一堆field,一堆getter&setter,往下翻还有个使用IDE生成的toString方法,洋洋洒洒300余行代码。

代码怎么改呢?
这还不太简单!新增一个名为invoiceTypeId的私有field,并为其增加getter&setter,再在声明这个对象的业务类里,调setInvoiceTypeId,妥了。

是的,就是这么简单。

 

once you do, do it well. 我们来看更好的代码实现方式

1)比较type与invoiceTypeId这2个字段名,不难看出type无法完整表达其含义,invoiceTypeId更优。既然如此,我们将type隐藏起来,不让业务类里再关注type,只需关注invoiceTypeId即可。另外,既然保留了type,那么,就要在其javadoc里注明保留的背景和原因,便于后续维护理解。

2)再说说这个300余行的POJO类,显然缺乏代码简洁度。在需求不断迭代过程中,我们不应该总是新增代码,而要适时调优代码。就拿这个POJO来说,我们做一番小改造,首先用lombok的@Data注解来取代getter&setter,以及IDE快捷生成的toString方法。这些都是举手之劳,却能带来极好的效果。这次CR时我就发现开发人员遗忘了重新生成toString方法,致使toString方法中没有体现新增的invoiceTypeId,这对于一个300余行代码的POJO类来说是很容易漏掉的,因此,我们完全借助lombok的@Data或@ToString就好了,没必要自己每次都生成。

/**
 * 查询开票结果返回实体
 *
 * @Author :  peanut
 * @Created : 2020/11/23 下午11:16
 */
@Data
public class QueryInvoiceResultResponse 
    /**
     * 服务商ID
     **/
    private Long levyId;
    /**
     * 商户号
     **/
    private String merId;
    /**
     * 发票类目。 2023-5-15经验证发现对外暴露API里,发票类目参数名是@link #invoiceTypeId,但不确定这个type是否有商户使用,暂时保留
     **/
    private Long type;
    /**
     * 发票类目id
     */
    private Long invoiceTypeId;
    /**
     * 申请开票金额(单位:分)
     **/
    private Long amt;

    ...
    ...

    public void setInvoiceTypeId(Long invoiceTypeId) 
        this.invoiceTypeId = invoiceTypeId;
        this.setType(invoiceTypeId);
    

    /**
     * 不再对外暴露setType方法
     * @see #setInvoiceTypeId(Long) 
     * @param type
     */
    private void setType(Long type) 
        this.type = type;
    

 

java开发的项目中模块、包、类、接口的关系是啥?

看一个java的项目 理解不了各模块是干什么用的 每个模块都有包吗?每个包都有类和接口吗?
可以跟.net C#对比着说明下吗?
我由于之前学的C# 现在怎么也理解不了java。

java开发的项目中模块、包、类、接口是继承关系、实现关系、依赖关系。学习java开发,推荐千锋教育,以初心至善,匠心育人为企业价值观,以草根精神、创业精神、协同精神、奉献精神为企业精神,值得选择。

继承指的是一个类(称为子类、子接口)继承另外的一个类(父类、父接口)的功能,并可以增加它自己的新功能的能力。在java中继承关系通过关键字extends明确标识,在设计时一般没有争议性。实现指的是一个Class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。在java中实现关系通过implements明确标识,在设计时一般没有争议性。依赖就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性、临时性、非常弱的,但是类B的变化会影响到类A。比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖。表现在代码层面为,类B作为参数被类A在某个method方法中使用。

想要了解更多关于java开发的相关信息,推荐咨询千锋教育。千锋企业合作部于2013年成立,主要针对企业用人需求和学员职业规划进行服务。经过8年发展,企业合作部已经成为千锋连接企业和学员的重要纽带。服务面对企业建立全方位、立体化、遍布全国的企业合作网络,覆盖全国一线二线城市大中小型公司,成功帮助20000余名人才实现就业,合作企业达20000余家,每年签订1000余份人才培养订单,让广大学员没有后顾之忧。
参考技术A 让我谈谈流程为导向,面向对象,这是两个思想流派,他们是能够实现的能力,使用该程序来完成一件事。
唯一的思维方式是不一样的。

面向过程的一件事,一个项目分解成一个函数的小功能。
面向对象的事情,作为一个小对象或这些对象之间的相互关系组成的一个小部分组成,构成了整个项目。

一切是一个面向对象的思想的对象,我,你,他也是。
“类”是一个抽象的对象,或进行了总结。例如,你可以为人类总结。
整体而言,类是抽象的虚拟对象是有生命的东西。
是一个类,我你他是对象。

一般的面向对象编程方法,设计一个类,然后创建一个这个类的对象。
经过这个对象的相关业务。
点:操作的对象,对象不要紧经营。

这里谈谈如何设计一个类,
类有一些封装的性质和功能。

面向过程的思想,程序通常是一个函数,这些函数的相互调用。
形成一个完整的方案来解决问题。其基本结构是:

函数()

......;


函数的两()

......;


......

主要功能()

......;




然而,在面向对象的思想是包在一起,形成一个类。



?函数A()

?......;


功能二()

?......;


?......




产生一个对象,那么这个类:从类的类名学生
方法是生成对象:学生S1;
在这里,s1是一个对象,它生产的对象可以是相关的操作。
操作方法,如:S1是函数();
等等。在这篇文章中的具体细节就不说了只说想。

这是普通的一点是,在具体实施过程中的类,然后生成一个对象,该对象来调用相关的操作。
如果在面向过程的功能封装成类,然后对象的操作。

A类包,它通常作为一个模块,其他类型的呼叫需要的时候。
类是一个抽象的,抽象的东西一些共同的特点,总结提出的公共部分的包一起。
包,已经上面说的,装在一个容器内的一些性质和功能。
在这里,我用一个游戏来解释:

假设我们想成为游戏内打怪的游戏类似,简单,怪不要打,只有玩的人。
他的血液不断减少,直至死亡。

所有的怪物在抽象的共同特点,所以我们得到了一个类:怪物
级怪物

??炭怪物名称;
?血液;

?怪物(怪物N,血列印)/ *构造函数* /

怪物的名字吗?=怪物名称n;
?血=血N;


毒打功能(?)

?血液减少;


?判断功能()

?(血== 0)
?输出(“你赢了!”);


?玩游戏()

?(血> 0)

?毒打函数();
??判断函数();





在这样一个怪物类属性的定义:怪物名称,血液和功能:结构殴打,确定
根据这种情况,可以产生一个对象。

一个类可以有任意数量的对象,区分这些对象,取决于构造函数。

让我们继续写我们的计划
主要的主要功能
无效的主要()

/ ******对象产生****** /?
?怪物怪物(“狼来了”,5000);
?怪物怪物(“老虎”,8000);
怪物怪物(“蛇”,3000);

开始我们的游戏?/ **为了几个对象** /
?怪物玩游戏();
?怪物玩游戏();
?怪物玩游戏();



然后主要的功能,我们已经建立了三个对象,它们共享一个类。
可以看到,类相当于一个组件,模块,我们需要建立它的对象,将是能够实现他的功率封装
可以。
这是面向对象的优点,可重复使用,不必每一个用于重写。

尽管如此,感觉,还是没有说明白,真的有点只能意味着说不出的感觉。
事实上,如果这本书,真正认真写了一些东西,他们可以理解,感到无形的。
参考技术B 一个功能模块中有多个包(一对多);
一个包中可以有多个类(一对多);
一个类(接口类,interface)中可以有多个抽象方法(一对多);
一个类(实现类,继承(extends)自接口类)中可以有多个方法(一对多);
解释:这个实际上是逐级细分的过程就相当于一个国家,有各个等级学历的学校,学校中可以有多个年级,每个年级有多个班级,班级中有多个学生。
参考技术C java面向对象的,你可以理解包是文件夹,类是里面的一个文件夹,接口也是一种类,类里面才是一个个对象文件,例如视频,音乐等。。希望可以帮到你。 参考技术D 没大看明白你的意思,我猜想你是不是看的java项目是基于一些框架做成的。比如,有包名为:**.action,**.service,**.form等类似这些包。如果是这样的话,这些都是包,包里面是类。
至于接口也是放在包下面的。接口也是类,是高级层面上的类。就比如,车是一个接口,小汽车,大汽车是类,这些小汽车,大汽车类可以实现车这个接口,以减少工作量。这些是java中的基础知识,自己看本基础知识课本就懂了。说的很粗略,希望能帮助你。追问

恩我是在看项目 有一些模块,下一层是源包、重要文件、库,源包下一层应该就是包吧?包里面有 .java 和.properties的文件 但是不是每个包都有 我找不到规律 还有看不出哪个是主类(是这么叫吧?类似主函数的),所以我就摸不着头脑了

追答

这些都是建项目时生成的,你把你看的向项目导到一个开发软件,比如myeclipse 或websphere里看,就容易了。

以上是关于匠心精神--来看一个小迭代的代码实现的主要内容,如果未能解决你的问题,请参考以下文章

做成一件事一定需要具备一种匠心精神

ZSTV播报:ZStack官网《精选案例》页面大改版啦!

匠心 . 网络模型管理解决方案为电力行业提供智能化数据管理

java开发的项目中模块、包、类、接口的关系是啥?

算法复习——迭代加深搜索(骑士精神bzoj1085)

bzoj 1085骑士精神 迭代深搜