《CURD系统怎么做出技术含量--怎样引导面试》有朋友开玩笑说都用上了领域驱动了,就不叫CURD系统了吧。这里我解释一下,怕大家对DDD领域驱动设计有什么误解。

DDD是为解决软件复杂性而生,但不仅仅可以被用于复杂的系统。它里面提到了很多技巧,其实CURD就是其中一种技巧。这些技巧适用于任何系统,哪怕是非常小型的系统,比如《CURD系统怎么做出技术含量--怎样引导面试》里提到的谦卑对象模型、充血模型。

今天咱们再提高一下CURD系统的门槛,连DDD技巧,咱也不用。就用写咱们平时都在写的最简单的接口。能说明设计理念,也能惊艳到面试官:

  • 两种设计方法

    • n+m返回值设计

    • 终态设计

  • 一种思维理念

    • 谁生产谁负责

两种设计方法

一个规范的系统要统一的入参标准和返回值标准,这种标准可以提高系统的稳定性,促进跨部门甚至跨公司之间更好的合作,价值很高。面试的时候值得跟面试官说一说。很多可能之前大家都做了,但是没有仔细思考其中的逻辑,你思考清楚了也会让面试官眼前一亮。

n+m返回值设计

一个接口入参有n个值,需要的返回值是m个值。在返回值中可以把入参和返回值一起返回。

这种设计便于追踪和排查问题:

为了防止调用方没有日志追踪号、打印日志过多等原因造成不方便跟踪请求的问题,可以设计返回值将入参一起打印。这样调用方可以通过一条日志方便的获取到入参和返回值。线上排查问题会非常方便。

假设有个场景,调用方的系统设计不方便请求追踪,比如没有线程追踪号。在高并发量场景下可能日志是这样的:

1、thread-1|ClassName|参数1:11,参数2:11

2、thread-2|ClassName|参数1:22,参数2:22

3、thread-1|ClassName|参数1:33,参数2:33

4、thread-2|ClassName|返回值:44

5、thread-1|ClassName|返回值:55

6、thread-1|ClassName|返回值:66

你能决定55和66对应的谁是1,谁是3的返回值吗?

但是如果返回值包含了入参,就好办多了,举个返回值例子:

thread-1|ClassName|{参数1:11,参数2:11,返回值:55}

这样就一目了然。有的时候可能是调用方本身的设计问题,但是如果被调用方能通过巧妙的设计帮助调用方。一旦遇到问题,调用方可以自己先进行排查,不用马上联系被调用方帮忙。即节约了自身的成本,又体现了专业性,何乐不为。

终态设计

《实战并发-使用分布式缓存和有限状态机》里我讲过有限状态自动机。有限状态机涉及状态流转。状态从分类上可以分成三种:初始状态、中间状态和终态。这段时间不是一直在将TCP底层通信嘛,来一张TCP状态的流转图体会一下:

有限状态机的重点在于有限,要有起点和终点。也就是一定要有终态。在《稳定性三十六计-超时处理》我讲过:

在传统的单机系统中,调用一个函数,要么返回成功,要么返回失败。这就是两态系统(2-state system)。

在分布式系统中,由于系统是分布在不同机器上的。还可能有一种状态叫:超时。成功、失败和超时是分布式系统调用的三态。

超时不是终态,而是一种中间状态:最终有可能下游是成功了,也有可能是失败了。这时候我们需要在超时之后推定一种状态,推定成功或者失败。究竟是成功还是失败因功能而已。

比如付款操作,不知道是否成功就推定是成功的,那用户可能没有付款就拿到了商品或者享受了服务。商家就会资金损失。所以一般会推定失败。让用户再次支付。最终通过查询或者对账发现用户实际是支付成功的,可以再把钱给用户退回去,保证交易的公平性。

退款恰恰相反,需要推定成功。告诉用户,钱退给你了。最终通过查询或者对账发现实际是退款失败了,可以系统重新发起退款,直到真正退成功为止。

后台管理系统也很需要这种终态设计。比如发布系统,发布了一个功能,发布系统如果出现了问题,这次发布没有结束。用户可能没有办法进行下一次发布。这时候可以设置超时自动结束,防止未结束的流程始终在那里,起码会干扰视线,增加判断成本。

一种思维理念

谁生产谁负责

在《设计开发中要避免的两个坑和一种可借鉴的设计思想》中我建议项目千万不要叫base、basic之类包罗万象的词,容易造成边界不清。

之前有人就跟我说过:这个数据我们只是提供,数据不是我们自己要用,而是有几个团队都要用,放在我们这里不合适。有base模块,那就应该放到base里啦。

从领域上来说,这种思维理念不对,数据应该谁生产谁负责。

举个例子:我们创建了一个系统,是toC的。开发这个系统的人能说这个系统是十几亿中国人用的,放在我们这里不合适,让十几亿中国人自己维护去?用户有很多,系统开发源头是一个,这就是谁生产谁负责。对于系统是这样,数据也是这样。

总结

这种小的设计技巧还有很多,比如两码一态设计。仔细思考自己的工作,你也许会被自己惊艳到。

往期推荐

那些影响深远的弯路

MySQL常见6个考题在实际工作中的运用

那些年犯过的错

达到什么标准就可以上线了?

CURD系统怎么做出技术含量惊艳面试官的更多相关文章

  1. CURD系统怎么做出技术含量--怎样引导面试

    引子 很多朋友可能会因为自己做的工作不是特别核心或者业务简单而引起面试中没有自信.但是很多公司面试的时候是可以接受面试者之前岗位的并发量.交易量低一些的.比如我们要招聘和我们交易量同等级或者以上的出来 ...

  2. 惊艳面试官的 Cookie 介绍

    Cookie 是什么 Cookie 是用户浏览器保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上. Cookie 主要用于以下三个方面: 会话状态管理(如用户登录 ...

  3. 我一个五年Android开发,居然被一个技术不如我的面试官嫌弃了......

    背景 首先介绍一下自己的情况.目前所在的是一家小的创业公司,待了5年多,薪资一般吧.由于这几年公司也在转型.工作经历大概可以分为 3 个阶段. 第一阶段是从进公司开始做 android app 开发, ...

  4. 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上)【转载】

    转自: DBAplus社群 http://www.toutiao.com/m5762164771/ 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上) - 今日头条(TouTiao.com ...

  5. 20 个具有惊艳效果的 jQuery 图像缩放插件

    jQuery相对与Flash的魔力已经贯穿整个网络.尽管,Flash层被认为是用于网页设计的首选,然而随着jQuery的出现,以及他的酷似Flash的交互式特效使得网页更加的优雅——Flash开始靠边 ...

  6. 惊艳!9个不可思议的 HTML5 Canvas 应用试验

    HTML5 <canvas> 元素给网页中的视觉展示带来了革命性的变化.Canvas 能够实现各种让人惊叹的视觉效果和高效的动画,在这以前是需要 Flash 支持或者 JavaScript ...

  7. 使用 HTML5 Canvas 绘制出惊艳的水滴效果

    HTML5 在不久前正式成为推荐标准,标志着全新的 Web 时代已经来临.在众多 HTML5 特性中,Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作 ...

  8. 分享10款效果惊艳的HTML5图片特效

    在HTML5的世界里,图片特效都十分绚丽,我们在网站上也分享过很多不错的HTML5图片特效,现在我们精选10款效果惊艳的HTML5图片特效分享给大家. 1.HTML5 3D正方体旋转动画 很酷的3D特 ...

  9. python实战===2017年30个惊艳的Python开源项目 (转)

    本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...

随机推荐

  1. mui中openWindow方法的通用封装

    因为做项目跳转新页面和传参的场景太多了,而且有的页面需要的跳转动画也不一样,每次都写一大堆openWindow方法的配置项太麻烦,因此自己简单封装了一个小函数,用来方便webview页面的跳转和传参. ...

  2. xpath的chrome插件安装,xpath基本语法

    xpath插件安装: 注意:提前安装xpath插件 (1)打开chrome浏览器 (2)点击右上角小圆点 (3)更多工具 (4)扩展程序 (5)拖拽xpath插件到扩展程序中 (6)如果crx文件失效 ...

  3. 菜鸡的Java笔记 Eclipse 的使用

    Eclipse 的使用    1. Eclipse 简介    2. Eclipse 中的JDT 的使用    3. Eclipse 中的使用 junit 测试        Eclipse (中文翻 ...

  4. 重新整理 .net core 实践篇——— 权限源码阅读四十五]

    前言 简单介绍一下权限源码阅读一下. 正文 一直有人对授权这个事情上争论不休,有的人认为在输入账户密码给后台这个时候进行了授权,因为认为发送了一个身份令牌,令牌里面可能有些用户角色信息,认为这就是授权 ...

  5. 十本你不容错过的Docker入门到精通书籍推荐

    前言: 最近有许多小伙伴私信让我推荐几本关于Docker学习的书籍,今天花了一下午的时间在网上查阅了一些资料和结合自己平时工作中的一些学习参考资料书籍写下了这篇文章.注意以下书籍都是十分优秀的Dock ...

  6. 寒武纪加速平台(MLU200系列) 摸鱼指南(四)--- 边缘端实例程序分析

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  7. 回文字符串 Manacher

    1. Manacher 忘光了,忘光了. 首先将字符串所有字符之间(包括头尾)插入相同分隔符,再在最前方插入另一个分隔符防止越界. 设以 \(s_i\) 为对称中心的回文串中,最长的回文半径为 \(p ...

  8. cookie的生命周期、访问限制、作用域、prefixes

    cookie的生命周期 cookie的生命周期可以通过两种方式定义: 会话期cookie是最简单的cookie:浏览器关闭后会被自动删除.会话期cookie不需要指定过期时间(Expires)或者有效 ...

  9. Linux命令行好玩的命令

    0.cal 2019  #输出日历并显示今天是哪一天 1.命令"date",显示系统的当前日期和时间: 2.命令"date 040100002016",屏幕显示 ...

  10. Perl字符串处理函数用法集锦

    Perl字符串处理函数 0.函数名 index 调用语法position=index(string,substring,position); 解说返回子串substring在字符串string中的位置 ...