您当前的位置:首页 > 新闻 > 科技

不使用框架,都不会写代码了

时间:2020-03-13 13:23:17  来源:  作者:

昨天在极限编程的群里聊代码测试方面的,突然话锋一转聊到重构之类的话题,云测的一个哥们突然来了一句 “现在很多离开了框架都不会写代码了。” 我给回了一句“用 jdbctemplate 写,领域服务 应用层不用注解,多写几遍就会了。”

然后,开始聊各种 ORM、JPA,我一直不喜欢 Hibernate 、 Mybatis 和早些年使用过的 Struts ,很不喜欢那些配置文件,配置的特别繁琐、麻烦,更喜欢用 JdbcTemplate 简单封装进行编程。

今天接着昨天那句 “现在很多离开了框架都不会写代码了。” 聊聊设计模式中的 Proxy 代理模式。

Robert C. Martin 的《敏捷软件开发 · 原则、模式与实践》对个人的开发影响挺大,就像副标题一样,原则、模式与实践。通过原则与设计模式指导我们对软件代码的重构进行软件的代码异味清扫,从而使得软件清晰可读以及可扩展。

简单案例

商户上架一个商品,系统需要将该商品保存到数据库中。

不使用框架,都不会写代码了

 

实现如下:

publicinterfaceProductDao{
voidsave(Productproduct);
}@Autowired
privateJdbcTemplatejdbcTemplate;
@Override
publicvoidsave(Productproduct){
//此处省略保存
}

 
@RestController
@RequestMApping("/proxy")
publicclassProductController{

@Autowired
privateProductDaoproductDao;
@PostMapping
voidsave(){
this.productDao.save(newProduct(1,2d));
}
}

相信大多数人都会按照上面的方式实现,这种实现站在功能的角度并没有什么问题,假如我们不依赖于 Spring 的注解 @Autowired 该如何去实现上面的业务,同时在 ProductDaoImpl 中,我们依赖了 JdbcTemplate ,能否不依赖呢?

Proxy 模式

代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网络连接、存储器中的大对象、文件或其它昂贵或无法复制的资源。

《敏捷软件开发 · 原则、模式与实践》书中举了实际开发中一个很好的案例。这里我们仍使用上面简单案例进行演示,为了方便看效果,我们增加一个需求是在添加商品的时候,通过名称验证商品是否存在,存在返回 false 不保存,反之则保存。

不使用框架,都不会写代码了

 

如图,我们将 JdbcTemplate 交给了代理 PorductProxy,这也就是代理模式解决的问题。代理模式的工作原理,每个要被代理的对象分成 3 个部分。第一部分是一个接口,该接口中声明了客户要调用的所有方法。第二部分是一个类,该类在不涉及数据库逻辑的情况下实现了接口中的方法。第三部分是一个知晓数据库的代理,也就是 ProductPorxy。

示例代码中,proxy 类会直接调用 JdbcTemplate ,采用SQL的方式进行存储。读者可能会问这样不就让 proxy 干了存储,这里仅是为了演示。我们可将图修改如下:

不使用框架,都不会写代码了

 

图中的 DB 就是实际进行业务数据存储数据的类。代码实现如下:

Product 接口,工具中类名冲突改成 ProductI

publicinterfaceProductI{

Productsave(Productproduct);
ProductgetByName(StringproName);

实现 ProductI 接口

publicclassProductImplimplementsProductI{

privateProductproduct;
publicProductImpl(Productproduct){
this.product=product;
}

@Override
publicProductsave(Productproduct){
//实际中会进行处理product将处理好的数据返回
returnnewProduct(1,100d);
}

@Override
publicProductgetByName(StringproName){
returnthis.product;
}

publicbooleanisProduct(){
if(product==null){
returntrue;
}
returnfalse;
}
}

代理类

publicclassProductProxyimplementsProductI{

privateStringproName;
@Override
publicProductsave(Productproduct){
ProductImplproImpl=newProductImpl(getByName(this.proName));
try{
if(proImpl.isProduct()){
thrownewError("productnamerepeat");
}
//业务忽略,通过name去查库验证,可使用jdbcTemplate
//或直接调用已封装保存业务的DB
}catch(Exceptione){
thrownewError("productnamerepeat");
}
//为测试方便,直接返回商品
returnnewProduct(2,40d);
}

@Override
publicProductgetByName(StringproName){
//业务忽略,通过name去查库验证,可使用jdbcTemplate
//或直接调用已封装保存业务的DB
returnnewProduct(1,20d);
}
}

测试用例

@Test
publicvoidshould_product_proxy(){
ProductProxyproductProxy=newProductProxy();
assertThat(productProxy.getByName("苹果"),is(newProduct(1,20d)));
assertThat(productProxy.save(productProxy.getByName("苹果")),is(newProduct(2,40d)));
}

通过案例可以看到,ProductProxy 和 ProductI 的行为是一样的,区别在于前者是从数据库中取而不是内存中获取它的数据。

另外,我们将与数据库打交道的交给了 proxy 代理,将重要关系进行了分离,将业务规则和数据库完全分离,ProductImpl 对数据库没有任何依赖,如果想要更改数据库模式或数据库引擎。我们可以在不影响ProductI、ProductImpl 以及任何其它业务规则的情况下进行更改。



Tags:代码   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言几乎所有.NET序列化程序的实现基础都是反射。下列代码是Newtonsoft.Json的实现:protectedvirtualJsonPropertyCreateProperty(MemberInfomember,MemberSerializationmemb...【详细内容】
2021-12-28  Tags: 代码  点击:(2)  评论:(0)  加入收藏
在SEO优化中,最重要的评估之一就是确定网站上存在哪些HTTP状态代码。这些代码可能会变得很复杂,成为一个难题,必须先解决这些难题,然后才能完成其他任务。例如,如果你放置的页面...【详细内容】
2021-12-24  Tags: 代码  点击:(5)  评论:(0)  加入收藏
1、通过条件判断给变量赋值布尔值的正确姿势// badif (a === 'a') { b = true} else { b = false}// goodb = a === 'a'2、在if中判断数组长度不为零...【详细内容】
2021-12-24  Tags: 代码  点击:(6)  评论:(0)  加入收藏
前言本文提供将视频调整分辨率的Python代码,一如既往的实用主义。环境依赖ffmpeg环境安装,可以参考我的另一篇文章: windows ffmpeg安装部署_阿良的博客-CSDN博客ffmpy安装:pip...【详细内容】
2021-12-14  Tags: 代码  点击:(15)  评论:(0)  加入收藏
大家好, 我是林路,今天就给大家介绍Python代码都是用的什么编辑器写的?Jupyter Notebook ,没有Pycharm,没有Vscode,没有Sublime text。 只有一款工具:Jupyter Notebook 。工欲善其...【详细内容】
2021-12-09  Tags: 代码  点击:(27)  评论:(0)  加入收藏
在这篇文章中,我将与你分享一些关于JS的技巧,可以提高你的JS技能。1.避免if过长如果判断值满足多个条件,我们可能会这么写:if (value === 'a' || value === 'b'...【详细内容】
2021-11-17  Tags: 代码  点击:(22)  评论:(0)  加入收藏
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一...【详细内容】
2021-11-17  Tags: 代码  点击:(38)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个由百度开源的低代码前端框架——amis...【详细内容】
2021-11-05  Tags: 代码  点击:(68)  评论:(0)  加入收藏
程序员是青春饭,这在国内似乎是公认的。所以很多公司不愿招大龄程序员,很多程序员也“知趣”地及早转型。有的做管理,有的做架构,我还见过改行卖保险的。总之,年龄大了不想敲代码...【详细内容】
2021-10-27  Tags: 代码  点击:(30)  评论:(0)  加入收藏
我们来看看我们拨号键盘除了能打电话还能干什么iphone 的拨号键盘除了用来拨号,其实暗藏代码输入星井06井可以查询手机真实的IMEI码,这个码是独一无二的没有双胞胎 输入星3001...【详细内容】
2021-10-25  Tags: 代码  点击:(78)  评论:(0)  加入收藏
▌简易百科推荐
非法购买公民信息、开发人脸认证规避技术……今年年初,广东省公安厅网安部门侦破全国首例破解“青少年防沉迷系统”的新型网络犯罪案件,抓获犯罪嫌疑人13名,查处非...【详细内容】
2021-12-28    人民日报客户端  Tags:数据安全步   点击:(5)  评论:(0)  加入收藏
就在今天,腾讯方面宣布将在2022年1月31日下架企业QQ和营销QQ,其实这一消息的降临并不让笔者意外,因为早在今年的10月28日20点之后,企业QQ和营销QQ就被停止了续费服务。相信很多...【详细内容】
2021-12-27  科技探险家    Tags:企业QQ   点击:(21)  评论:(0)  加入收藏
日前,上海交通大学发布《全球电竞之都评价报告》,对全球15个致力于发展电竞之都的城市进行评价,上海作为中国城市电竞发展的排头兵,其拥有众多优质电竞企业及完整产业集群,因此排...【详细内容】
2021-12-27  经济日报    Tags:电竞   点击:(3)  评论:(0)  加入收藏
为优化网络氛围环境,微博又开始整顿用户信息了。本月月初,微博官方发布公告,要求昵称中带有如“二货”“SB”“瘪三”“娘炮”等明显低俗或侮辱性词汇的用户尽快修改,否则将面临...【详细内容】
2021-12-24  运了个营    Tags:微博   点击:(10)  评论:(0)  加入收藏
昨日谷歌宣布,自2022年12月19日开始停止对OnHub的软件支持,OnHub路由器仍将提供Wi-Fi信号,但用户无法用谷歌Home应用程序管理它。无法更新Wi-Fi网络设置、添加额外的Wifi设备或...【详细内容】
2021-12-22  雷峰网    Tags:Google OnHub   点击:(5)  评论:(0)  加入收藏
IT之家 12 月 20 日消息,百度网盘青春版 iOS 客户端今日晚间率先开启内测,安卓客户端将在稍后内测。使用苹果 iPhone 的IT之家小伙伴可以点此下载内测版,需要先下载 TestFlight...【详细内容】
2021-12-21  IT之家    Tags:百度网盘   点击:(10)  评论:(0)  加入收藏
对于拼车单,是接还是不接,不少网约车司机表示很矛盾。接吧,钱少事多,常常跑了个寂寞,不接吧,车多客少,挑三拣四没饭吃。 在平台大力推广拼车单之下,不少司机迫于生活压力,最终还是打...【详细内容】
2021-12-17  网约车情报分享    Tags:滴滴   点击:(9)  评论:(0)  加入收藏
蓝鲸TMT频道12月16日讯,据饿了么官方微信公众号,近日,在圆桌会上,蓝骑士与平台交流了配送安全问题。饿了么表示,线上将技术手段融入安全防护;线下将持续进行安全培训,并试点智能头...【详细内容】
2021-12-17    金融界  Tags:饿了么   点击:(24)  评论:(0)  加入收藏
开源最前线(ID:OpenSourceTop) 猿妹编译项目地址: https://github.com/restic/restic全球知名代码托管平台 GitHub 今天就重磅发布了今年的年度报告——《2021 年度 O...【详细内容】
2021-12-17  Python部落    Tags:   点击:(9)  评论:(0)  加入收藏
新京报快讯 据中国网络视听节目服务协会网站消息,12月15日,中国网络视听节目服务协会发布了《网络短视频内容审核标准细则》(2021)。中国网络视听节目服务协会组织有关短视频平...【详细内容】
2021-12-16    新京报  Tags:短视频   点击:(11)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条