oo设计
文章平均质量分 64
个人渣记录仅为自己搜索用
不盈利,只为分享,转载.
找到的原版url的,尽量会贴原版url.
如有版权侵犯,请留言删除.
展开
-
代码阅读整理之 层次 uml 逆向工程 idea eclipse
eclipse : Eclipse逆向工程插件ModelSpoon,由代码轻松生成UML图 https://stackoverflow.com/questions/5790508/uml-tool-for-reverse-engineering-an-eclipse-project umlet 好像不兼容 Omondo best Topcased eUML原创 2017-05-23 23:50:16 · 926 阅读 · 0 评论 -
系统升级之路
单体(数字化)服务化:中台化: 抽象共用的组合逻辑,流程. 增加扩展点. 可以引入状态机 , 流程引擎, 元数据管理等手段.多租户saas化: 接入新业务通过配置化,隔离部署等原创 2020-08-03 22:55:01 · 182 阅读 · 0 评论 -
人人都是好的软件开发设计师(技术设计金字塔)
业务(1.逻辑是否满足 2.体感是否好) -> 异常逻辑(业务异常,稳定性异常[对自己感知,自己监控不算不算])是否影响体感,兜底降级 ->可扩展性(1.功能上产品想做还没说的功能 2.业务体量上增加) ->资金层面(是否有更好更省钱,更省时间的设计)-> 每次行为可定义是否异常,可值班-> 监控逻辑(对方出bug开发需要感知) ->安全......原创 2019-12-25 10:36:53 · 492 阅读 · 0 评论 -
开放推送事件怎么定义? 业务变动后事件怎么变动? 业务新增后状态怎么设计?
事件. 1.导致状态变化 2.无状态变化.都有触发者.事件开放,必定引发接收事件方的业务变化.故事件bean需要要包含 1.业务类型 2.对应业务类型下的触发前状态 3.对应业务类型下触发后的状态 4.触发者.事件如何取名? 导致状态变化的,以事件对应的动作命名:成功预订, 取消预订, 拒绝审批.事件bean需要哪些字段?事件名是否需要和当前状态...原创 2019-11-14 11:41:55 · 172 阅读 · 0 评论 -
fei33423 静态内部类 作用
最大的作用就是1. 不需要单独的单独的文件来记录 2.和外部类有一定关系.应用场景: 1.builder模式,不可变类.上下文context 或者 事件流设计模式中.原创 2019-11-06 14:18:12 · 146 阅读 · 0 评论 -
mockitio 如何验证函数输出.
返回值已经很明确了. 那么如何验证往下层(下游)输出的值呢?ArgumentCaptorhttps://static.javadoc.io/org.mockito/mockito-core/3.1.0/org/mockito/Mockito.html#15如果想获取第一次函数调用的参数.argument1.getValues().get(0)1. 遇到这种问题:But wa...原创 2019-10-22 21:40:19 · 277 阅读 · 0 评论 -
人人都是好的优雅代码构造师,好程序员
如何避免新代码变包袱?阿里通用方法来了!https://yq.aliyun.com/articles/719071?spm=a2c4e.11153959.teamhomeleft.140.137759b2iUKYi3如何解决90%的问题?10位阿里大牛公布方法...原创 2019-10-18 19:42:35 · 161 阅读 · 0 评论 -
看zookeeper源代码庖丁解牛[还是写的很乱,自己看都看不懂了.]
层次关系, 内存型中间件的也可以有实体. 把实体抽象出来,逻辑抽象出来. 其他就都是内部的BO了.一个程序的包没有体现出这些,自己就应该去抽象出这些实体类.持久化的实体类.socket这种都是框架属性,完全可以归属到在业务外的包中.1.流程: 选举流程: 了解算法.2.边界: 外部通信边界: 1. QuorumPeer里的 D原创 2016-11-02 22:06:14 · 2510 阅读 · 0 评论 -
如何写可维护的代码 - 万物ddd ddd primitive . 封装,对象来实现可维护代码.
1.封装. 就是越上层参数越少2.边界,考虑是否该关心变化. 边界可能需要记录流水. 行为也是实体. kpay和paygateway. 支付渠道的新增不应该改变kuaipay的重启. 对于透传的参数底层提供者要封装自己的if else. 不能拆分开. 现在支付宝h5和支付宝sdk 网关提供不同的接口,导致每次新增kuaipay都要变动.3.实体类型:...原创 2016-04-16 01:24:48 · 1109 阅读 · 0 评论 -
[异步][事务][流程][设计]同步当场处理并返回处理结果,异步后如何返回. 如何解决?
先说说同步异步的定义所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数或方法都是同步调用。异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。难点解释,一个函数,可以做几件事情. 对 a 结果可能是同步,对 b 结果可能是异步. 这个要再接口原创 2014-06-20 18:05:59 · 4881 阅读 · 0 评论 -
logback原理解析appender-ref
1.对appender-ref 的认识。2.线程同步的认识。 2.1 logger.info从全局里匹配到对应的appender(单例) 2.2 执行appender的doAppend 2.3 由于是继承模式来扩展功能。方法会被覆载并且添加新的功能。{ 导致底层的类的功能的代码阅读特别难阅读,代码跳来跳去。例如RollingFileAppender,覆载了父类Fi...原创 2018-04-10 11:20:23 · 18041 阅读 · 1 评论 -
模块递归拆分法: 设计模式 设计原则,复杂层次设计举例。系统重构 装饰模式,门面模式,代理模式
程序员最牛逼的能力是模块拆分能力,然后才能利用模块依赖的工具,java 9 或者 runtime期的osgi ,其他maven插件,maven build期. 其他idea插件,类似阿里云的代码规范检查. Modularity—the result ofProject Jigsawhttps://www.oracle.com/corporate/features/understan...原创 2018-04-10 11:51:52 · 1204 阅读 · 1 评论 -
一次重构演示. 核心点: 1. 细节业务流程 2.对象
打印日志和耗时,是任何普通程序员都会遇到的场景.1. 最普通的代码 long start=getTime(); xxx.invoke();long end=getTime();2. 抽象下,你想干嘛.打印日志和耗时. 1. 取个工具对象 RequestLog.把 start和end属性都放置到对象上去.RequestLog{ long start;long end;}2. 这个对象的生命周期是...原创 2018-04-10 19:27:54 · 299 阅读 · 0 评论 -
调度任务
树形调度任务,上一个执行完,执行下面一个. 如何异步,最快速的执行所有 任务.其实就是 多线程异步队列遍历- 不同于递归实现.面向对象化后变成了. 对象的递归生成.1. Java使用线程池递归压缩文件夹下面的所有子文件...原创 2018-04-10 19:36:13 · 210 阅读 · 0 评论 -
IaaS,PaaS,SaaS 的区别
最近做了几个项目,平台化越来越严重,更甚至端上直接和平台交互,可能前端只是皮肤和布局是自己的,甚至连皮肤都是大一统的.然后联想到了saas的概念. 服务端调用平台化其实也是一种saas,但还不够彻底.自行车统一收银台,为了避免品牌暴露,界面自己做,也算是saas的一种,只要做好请求的sign签名即可.完全的统一收银台[包含了券和其他抵扣优惠]是完全的saas化.支付宝的跳转页面也是完全的saas化...原创 2018-04-18 18:00:29 · 338 阅读 · 0 评论 -
uml 工具
1.在线 processOn2.Visual Paradigm指南IDEA —— 生成时序图IntelliJ IDEA之UML类图ASM静态代码解析方法依赖及生成方法调用流程图方法Understand:高效代码静态分析神器详解(转)关键字段,细节.核心概念:时序图UML时序图(Sequence Diagram)学习笔记https://blog.c...转载 2018-11-11 14:45:41 · 1001 阅读 · 0 评论 -
把关系表取个新名字,变成实体 N:N的实体关系 变成两个1:N 关系
N:N的实体关系,可以把关系变成一个实体, 这样N:N的关系就弱化成了 老实体 N:1 关系实体 1:N 老实体原创 2013-07-05 00:13:52 · 1436 阅读 · 0 评论 -
记一次测试testCase梳理过程
目标: 用户视角: 码对就能投屏 子任务: 1. 码能指定到对应的设备2.能通过公网投屏 3.访客经过验证码功能: 投屏盒子,智能分配投屏码.用例: 7要素法. 含触发时机,即网络变化. 正常流程: 何时调用:1.开机 2.网络变化(ssid,有线) 3.ip变化 通过服务端获取投屏码.如何梳理case......原创 2019-08-16 17:06:55 · 531 阅读 · 0 评论 -
[转]用例和用户故事的区别 useCase和useStory的区别
Use case与user story在不同项目中定义会有一定区别,此处只讨论最大众的定义。最基本的区别:use case是以用例图表示,user story是以一句话表示(笛卡尔积法分析我们如何正确使用Use Story?)。最基本的共同点:帮助阅读者明白该软件应该完成什么事,促进利益相关者交流合作。在实际使用时这两者无高下之分,只分使用场合。User story在维基百科上的定...转载 2019-08-16 16:40:03 · 2618 阅读 · 0 评论 -
reactor和vue的区别-个人理解浅见.
vue的是先布局股价,布局里有简单的语法,if,for循环.for循环,一个Bean, 然后利用一个方法计算出一个值.这种的话,就需要计算规计算,布局规布局. 计算出的值,组装成list,传到布局里. 1.先计算 2.计算后的值再布局. 这样的思维写的代码耦合度更低. 但是需要多次for循环. 在java内服务端内也常见.reactor 就可以for循环后,通过一次循环,算好后,立马组...原创 2019-07-04 21:14:36 · 1723 阅读 · 0 评论 -
业务开发同学需要有流程引擎的思维.(包含了状态分层设计,事件设计,不同视角的状态展示[前台,后台], 事件流思维,业务模块切分到开闭代码的能力)
先说明两个场景:支付场景. 从本来的整体支付,部分退款到可以多次支付,到多次退款. 到可以垫付.(垫付这个,没有流程引擎思维很难想通状态设计怎么设计更好).支付变化: 加入垫付. 把原来线性流程变成了 ,有一个就分润流程. \ --分润-> /会议室预订场景: 审批预订和普通预订能否共用一套底层预订系统. 类似订单快车和专车...原创 2019-06-28 09:27:15 · 853 阅读 · 0 评论 -
支持plantUml的博客
阿里的语雀.头条的lark石墨笔记plantUml官方教程,含if else ,condition等功能http://plantuml.com/zh/sequence-diagram转载 2019-05-24 08:29:22 · 478 阅读 · 0 评论 -
model 3 特斯拉 奥迪a4 奔驰c级 宝马3系
audi 奥迪 a4前驱4038,395 国内售价宝马3系 $35,895 320i, 国内 31.2 折算240722元benz 300 rwd 后驱特斯拉 377,000原创 2019-04-15 21:53:41 · 285 阅读 · 0 评论 -
流程图 循环画法
场景: 轮训等待在时序图中描述出来元素: loop 框图.转载 2019-03-25 23:18:12 · 2990 阅读 · 0 评论 -
编程设计-如何写可维护的程序. 通往架构思维之路
初级码农写代码(码代码)经常会遇到代码复用,重构,方法生成,方法命名的问题.有本专门重构的书, 看了也忘记了.过几天重温下. 先写自己的思路.拿到一个需求,如何写出代码.第一步, 了解流程.第二步, 切割流程如何切割,1. 调用分为那几步.,每一步都可以变成一个类(类比方法的好处是独立文件,更直观, 更容易搜索和记忆,便于以后维护)2. 每个调用和调用后的原创 2015-11-13 14:29:17 · 695 阅读 · 0 评论 -
重构,可扩展设计可操作方案。
思考一个业务系统,物,行为都可以设计 为实体。最重要的是从人角度出发,行为流程角度:1. 流程 2.不同类型同一个流程点实现:不同类型就是不同的策略,可能输入的参数都不同。通过接口来规范。 通过filed来接受属性。避免了context类的出现每次执行时 new 对象,赋值参数,然后 execute。数据库实体关系角度: 1. 要尽量的抽象,不要把上层,原创 2016-04-16 14:30:44 · 1232 阅读 · 0 评论 -
java 7 uml 图
Java 1.7 Collections - UML Class Diagrams https://www.karambelkar.info/2012/06/java-1.7-collections—uml-class-diagrams/ Java™ 7 util.concurrent API http://www.uml-diagrams.org/java-7-concurrent-uml-转载 2017-05-25 00:24:52 · 309 阅读 · 0 评论 -
避免一个关系就需要用一个外键来实现,或者一个关系表来实现的OO设计技巧;; 避免 外键爆炸
Ad material List getCurrentMaterials() List getHistoryAndCurrentMaterial();以上两种关系都是1:n ;如何实现数据库;; 1. 每个关系利用一个外键;2. 可以考虑 和1的外键进行捆绑,新增一个字段, ,,实体世界可以是用一个where进行区分;; 或者用> getmaterials() 来代替(原创 2013-07-05 20:04:47 · 920 阅读 · 0 评论 -
如何判断 业务实体 ,设计实体用 2表 还是 3表;
如何判断是 2表 还是 3表;Ad material然后现在有个需求需要保存他们的快照;;ad下面有三种关系 1.1 List getCurrentMaterials()1.2List getHistoryAndCurrentMaterial(); 允许ad增加物料,删除物料,个数不限制;这个关系组合, 1.1 1.2 可以用 两个关系表(两个外键, 可以 两个实原创 2013-07-05 20:57:25 · 1133 阅读 · 0 评论 -
从实体到数据库表 设计技巧 ---- 合理使用 弱化 等技巧 ,避免增加过多的实体概念
从实体到数据库表 ---- 合理使用 弱化 等技巧 ,避免增加过多的实体概念这次大搜索推送,开发官吧有了位置的概念, 第一位,第二位,第三位,位置的其实是一个实体,但是我把他弱化到了物料material的一个字段中(单纯的基本类型) ;位置和物料的关系是1:N , PM其实是希望获得的是位置的审核历史,而不是物料的审核历史; 所以只有在修改一次位置的时候就生成新的物料才能把历史给展原创 2013-07-05 00:11:24 · 844 阅读 · 0 评论 -
oo 设计 domain 设计 和 schema设计 实战
楼飞B218 7110 15:33:31我现在从oo角度来思考了一下:目前一个materialUnit有多个materials,这个关系绑定在Material实体中的materialUnit这个属性上;现在需要有historyMaterialsList ,这个其实是新的关系, 在ormapping的时候,想到这个关系需要绑定新的字段,Material实体需要一个新的属性来帮带这个关系(或者也可原创 2013-07-04 16:45:30 · 1044 阅读 · 0 评论 -
<如何创建一个实体历史> 时间维度 让 1:n的 产生新的实体 或者关系
今天设计一个需求的时候发现一个有趣的问题,让我对对象世界,空间维度,时间维度又有了新的认识;之前的表关系印象:n:n的实体关系可以只能通过关系表(共3个表 ,两个实体表,一个关系表)实现, 1:n的关系可以通过关系表(共3个表,两个实体表,一个关系表) ,也可以通过两个表实现但是这次需要保存物料的拒绝历史,一个物料只属于一个AD,一个ad拥有多个物料;历史属于时间维度原创 2013-07-04 23:55:22 · 1027 阅读 · 0 评论 -
重量级别--何为immutable,在拷贝,快照,而非历史需求中分析,如何利用immutable模式和跨设计实体后的业务实体关系 决定 设计实体 是否immutable , 以后业务操作该如何操作
Ad 1:n material然后现在有个需求需要保存他们的快照;;ad下面有 1. List getCurrentMaterials() 另外一个是 2. > getMaterialsSnapShots() ; 每隔1天存储一次当时的物料list ;; 3. List getHistoryAndCurrentMaterial(); 允原创 2013-07-05 20:02:58 · 1038 阅读 · 0 评论 -
总结: 设计实体 和 ormapping 的思路
1. 抽象实体2. 抽象关系, 关系必须要含有返回对象 , 注意区分是否是自关系3. 重新整理返回对象, 可以考虑把List 变成 Map ,可以考虑LIst 变成 List3.0 搞两个返回结果一样,但函数名不一样的关系是最不敢想的3.1 3.1.把List业务实体> 整个抽象为 设计实体来考虑; 3.1.1 设计实体的 immutable 可以随便定义3.2 查原创 2013-07-07 17:45:06 · 1067 阅读 · 0 评论 -
技巧 改变实体性质(增加一个类型字段) , 增加一种关系 考虑上游下游的影响
实体间的关系应该考虑全量关系;;1. 增加类型字段其实在某种程度上改变了实体类型; 一表多实体,继承方式也是通过sqlWhere区分开来的;; 如果实体世界还是一个实体,就会造成对上游下游的影响;;案例一:materialUnit 的MapgetMaterisl ,已经被大面积使用了;;决定了任何一个绑定在这个关系上的Material都必须是 layOutindex原创 2013-07-07 15:21:07 · 1352 阅读 · 0 评论 -
基本实体--弱化到下游实体上 ;;; 上游的关系变成map set可以控制值,变成List 也可以,可控性更高
一个Ad有只能有3个物料, 每个物料一个位置;;Ad List getPositionsPosition material getMaterial这个一个实体关系,如果Position就是基本实体,那就可以简化为Ad List getMaterials()注意如果getPositions 是不可变的, 那么getMaterials也是不可变的;或者 Ad map原创 2013-07-07 14:19:14 · 1259 阅读 · 0 评论 -
isdeleted 历史物料 的处理 , invalid 物料 ,,, 用 新的关系表字段 替代 类型字段
如果对一个实体表, 增加isDeleted 字段 , 这样就把历史, 过期的物料也加了进去;这样以后每次用sql都需要把isDeleted这个字段加上去, 不然就会有问题;;这样太麻烦了;;好的原则是,从实体的角度;ad有三个位置,每个位置有三个物料单元;1`.位置有多个物料历史;2 .一个位置有一个物料; 现在位置物料融合为一体:那么第一句话就变成了 1.原创 2013-07-09 17:26:19 · 1294 阅读 · 0 评论 -
[理论]领域驱动设计 DDD 是啥,cqrs是啥
原文:http://www.infoq.com/interviews/Technology-Influences-DDD#http://www.infoq.com/interviews/Technology-Influences-DDD#要实现DDD(domain drivedesign 领域驱动设计)原始意图,必须CQRS+Event Sourcing。CQR原创 2014-06-15 22:39:21 · 13595 阅读 · 1 评论 -
抽象和具体化案例讲解 如无必要,勿增实体,延迟具体化.v
两个例子:例子1: 一个 ftp 下载器例子2: 支付参数总结: 1. 接口和实现. 父类和子类, 组合都能实现 抽象,层级. 2.要达到最好的泛化.最好是无参数,无返回值.所有都是变成 field.如无必要,勿增实体,延迟具体化.卡姆剃刀法则ftp 下载基本配置: host ,userNameftp 下载器: 1.下载地址,2原创 2017-05-10 22:12:17 · 3340 阅读 · 0 评论 -
实体设计-何时需要新的实体?
1.出现状态回环时?举例: 1.发单后,无人接单.司机接单,然后又重新发单? 状态回溯,回环. 导致状态判断非常复杂. 新增实体. 2. 乘客取消订单,可能会有等候费,可能也会有爽约金? 三个方案: 1. 有等候费就不要有爽约金.原创 2017-03-21 15:44:27 · 319 阅读 · 0 评论