首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一场关于逻辑应该写在哪里的争论No.93

这些关于逻辑应该写在哪里的争论从来没有停止过,不仅仅发生在后端和数据库端,连前后端都经常会发生这种争论。 为什么逻辑应该写在 SQL 中?...诸如此上,云云 为什么逻辑应该写在 Java 中?...数据库中非常复杂的表关联会极大程度拖慢数据库处理每条 SQL 的平均时间,极大程度拖慢数据库 RT,降低了数据库的 RT ,如果逻辑都写在 SQL 中,那么只能进行垂直升级。...因为一旦进行水平扩展,那么多机器的非常复杂的分布式表关联,RT 基本不是一个高并发的业务应用的能容忍的。...即使业务非常非常复杂,需要拆应用,其实也非常简单,只需要把对应的 DAO 层的操作拆分出去,换成 RPC 或者其他方式的调用就好了。

1.5K80

关于处理复杂逻辑接口重构后的验证问题-流量回放

我们经常会重构一些复杂的接口,那么对于返回字段多并且逻辑复杂的接口如何来验证? 有如下几种方案 重新设计,重新设计前端的展示逻辑、后端的查询计算逻辑。然后进行重写(最优的方案)。...但是在不得不重构的时候我们要怎么去重构以及重构完怎么去测试验证? 首先:我们从重构的开发前的设计阶段入手。 首先我们重构的这个接口非常复杂。...所以我们就将这个整体特别复杂的接口进行拆分,拆分为n个小逻辑串行的来处理。来保证代码的可读性。...然后开发完我们怎么去验证是否正确呢,有上千个字段,并且验证case很多? 2.1 这个时候就回到我们的正题了。...流量回放 2.2 流量回放的概念就是将线上的真实流量进行回放一次,要对于正常的业务逻辑无感知的。(并且要保证时效性)。 现在是A服务上面有个接口要重构到B服务上面。我们这个流量回放该怎么做?

85520
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    通过 Laravel 表单请求类实现字段验证和错误提示

    在上一篇教程中,我们已经演示了如何在控制器方法中对表单请求字段进行验证,并且提到如果请求字段很多很复杂,都写到控制器方法里面会导致控制器臃肿,从单一职责原则来说需要将表单请求验证拆分出去,然后通过类型提示的方式注入到控制器方法...表单请求类的执行 接下来,问题又来了,这段表单请求字段验证逻辑放在哪里执行呢?...,如果验证成功则继续执行控制器中的方法,否则会抛出验证失败异常,和我们上一篇在控制器方法中实现验证逻辑的处理一样。...数组请求字段验证 某些场合下,我们的表单请求中可能会包含数组字段,比如 books[] 或者 books[author],甚至可能是更加复杂的 books[test][author],对于这种数组字段的验证...本系列教程首发在学院君网站(xueyuanjun.com),你可以点击页面左下角阅读原文链接查看最新更新的教程。

    3.9K30

    详解微服务中的三种授权模式

    当服务或团队数量增加、授权逻辑变得更复杂或面临更严格的性能要求时,此模式开始出现问题。...如果是这种情况,将所有相关的授权数据塞到令牌或请求头中并不能完全解决问题。 模式 3:集中存放所有授权数据 另一种解决方案是将所有授权数据和逻辑放在一个地方,与需要实施授权的所有服务分开。...如果这些模型经常改变,授权系统可能成为新的开发任务的瓶颈。任意微服务中的任何更改都可能需要对授权服务进行更新,从而打破你在最初转向微服务时可能寻求的关注点分离效果。...集中式授权存在的挑战往往会阻止大多数团队采用这种模式。采用该模式的应用往往有很多服务和足够复杂的数据模型,接受授权服务本身增加的复杂性对它们来说是有意义的。...对于简单系统,维护大量额外基础设施代价高昂,最好将数据保存在其所在的位置,并将服务与专用 api 放在一起。

    74920

    DDD这样落地

    对于薄与厚不再于代码的多与少,application层不是厚,而是编排多而已,逻辑很简单,一般厚的domain大多都是有比较复杂的业务逻辑,比如大量的分支条件。...为了隔离领域模型与外部设备,同样需要为它们定义抽象的出口端口,这些出口端口该放在哪里呢?如果依然放在领域层,就很难自圆其说。...,软件架构不应该因不同的底层数据储存方式而产生巨大改变4.独立于外部依赖:无论外部依赖如何变更、升级,业务的核心逻辑不应该随之而大幅变化5.可测试:无论外部依赖什么样的数据库、硬件、UI或服务,业务的逻辑应该都能够快速被验证正确性...为了隔离领域模型与外部设备,同样需要为它们定义抽象的出口端口,这些出口端口该放在哪里呢 按此划分module,这些出口端口都放在了infra层,当domain需要外部服务时,不得不依赖infra module...然而,限界上下文可能不仅限于访问数据库,还可能访问同样属于外部设备的文件、网络与消息队列。为了隔离领域模型与外部设备,同样需要为它们定义抽象的出口端口,这些出口端口该放在哪里呢?

    1.6K61

    V神正在密切关注!这55行状态通道代码,带你快速扩展以太坊生态

    当你想尝试设计一个状态通道应用程序时会遇到各种各样的障碍,比如说: 不清楚应该如何编写公共API,因为你不再对以太坊的各种交易进行签名,而是对通用状态对象进行签名; 授权逻辑要求状态通道的每个用户为每个更新都签署一个对象...,并使用ecrecover 来验证这些签名; 解析逻辑更加复杂,因为每次提交新状态时都有一个内置的“挑战”或“争议”期。...检查 msg.sender 来验证玩家是否正确地进行游戏。...当考虑到在各种攻击下保护状态通道时,这一点是非常有用的。 但是状态通道合约的功能是什么呢? 本质上说,状态通道对象应该使用应用程序逻辑来确定状态转换是否有效。...处理一个纠纷:一方对另一方的纠纷作出反应,对已提交的状态采取行动。 取消一个纠纷:双方同意解除纠纷,并恢复正常链下运行。 资金存放在哪里?

    39531

    用golang开发电商类后台业务

    而恰巧,我们又是一个电商类后台团队,电商后台业务如果用一个词来概括的话,我想应该是复杂。那么如何用简洁的开发模式来应对复杂的业务系统,是我们所面临的一个很大的挑战。...是的,无论多么复杂的事情,这两个就是我们拆解和应对的最大武器,将复杂的系统拆解,并抽象出具体的业务模型,借助这两者,我们才能够很好的抵抗外部的复杂性,并聚焦在最核心的事情上。...,包括trpc接口和cmq的生产者等等; config: 配置层,包括tconf配置,常量,错误码等等 2.抽象模型: 我们将复杂的产品需求抽象成聚焦的业务模型,并把对业务模型的抽象和定义放在do层,用来表示最聚焦的业务模型...这三个实体哪里来的呢? 这个时候,就是工厂模式的思想出现了,我们作为do层的业务领域,是不需要关注所依赖的实体是从哪里来的,只要关心在拥有了实体之后具体的业务逻辑怎么处理。...是为了将构建与执行二者分离开,让构建的管构建,执行的管执行,这样,复杂实体的构建就被收拢了。 最后,我们会发现那么这个factory的方法在哪里调用呢?参数校验在哪里做呢?入参和出参怎么转换呢?

    1.9K11

    API 鉴权插件上线!用户可自定义鉴权

    其实和大部分接口测试前要登录类似,鉴权是身份验证的一种方式。...: 鉴权信息配置在分组/项目中,内部的 API 从父级继承鉴权信息 每个 API 配置独立的鉴权 在环境中配置鉴权信息,选中后 API 引用环境信息鉴权 我们如何判断要将这个功能放在哪里呢?...所以一系列 API 都能用到的公共配置框架,我们应该放到项目/分组去实现,同时通过环境来填写配置变量数据,这样可以复用大家的设置,让团队内的 API 和测试数据更方便维护。...例如这就是官方的 Basic Auth 鉴权插件代码,核心逻辑不到 30 行,非常简单易懂。...API 开发平台 Mock:根据文档自动生成Mock,或创建自定义 Mock 满足复杂场景 团队协作:既能实现API 分享也能可以创建云空间共同协作 Postcat 优势: 免登录即可测试:省去繁琐的验证登录的操作

    1.4K30

    这55行状态通道代码,带你快速扩展以太坊生态

    当你想尝试设计一个状态通道应用程序时会遇到各种各样的障碍,比如说: 不清楚应该如何编写公共API,因为你不再对以太坊的各种交易进行签名,而是对通用状态对象进行签名; 授权逻辑要求状态通道的每个用户为每个更新都签署一个对象...,并使用ecrecover 来验证这些签名; 解析逻辑更加复杂,因为每次提交新状态时都有一个内置的“挑战”或“争议”期。...检查 msg.sender 来验证玩家是否正确地进行游戏。...当考虑到在各种攻击下保护状态通道时,这一点是非常有用的。 但是状态通道合约的功能是什么呢本质上说,状态通道对象应该使用应用程序逻辑来确定状态转换是否有效。...资金存放在哪里我们将这些资金放在一个通用的多签名钱包中,并把它作为一个智能合约,根据状态通道的结果对这些资金进行分配。

    69220

    jvm之java类加载机制和类加载器(ClassLoader)的详解

    类加载机制,其实之前也有说过,JVM如果想执行相关的业务逻辑,应该是通过java的class文件进行读取,JVM用来存储加载的类信息,常量,静态变量,编译后的代码等数据,虚拟机规范中这是一个逻辑区划。...② 加载 读取二进制内容 ③ 验证 yan验证class文件格式规范,语义分析,引用验证,字节码验证。必须有一定的规范。不能随意的进行加载,不像咱们普通人一句话:不干不净吃了没病。...用户应用程序class-path 或者java命令运行时参数 -cp(开发人员写的代码,对应类存放在哪里,JAVA是怎么知道的,为什么用eclipse和idea右键可以直接跑了,其实就是在底层指定目录地址...结论:读取java.class.path配置,指定去哪里地址加载类资源验证过程:利用jps,jcmd两个命令 1.jps查看本机JAVA进程 ?...PS:千万不要将双亲认为是父节点,就是一个逻辑上定义的上下级关系。

    1.6K20

    Laravel 5.0 之目录结构与命名空间

    但 5.0 版本改用 PSR-4 规范来实现主要逻辑的自动加载已经是一大进步, 为把应用代码与 Laravel 进行分离提供了理论上的可能. xxx 应该放在哪里?...如果 xxx 代表的是某个类, 或者可以写成一个类的话, 它应该放在 app/ 下的某个地方. 如果 xxx 代表的是 Eloquent model, 它应该放在 app/ 下的某个地方....如果 xxx 是一个过滤器(filter), 它应该放在 app/Http/Filters 目录里一个专属于它的类中....如果 xxx 不属于上面的任何一种情况, 那么从目录结构就可以很清楚看出它应该放在哪里了. 代码中的命名空间(namespace)是怎么工作的?..."Confomo" 命名空间下. composer.json 文件里的 PSR-4 自动加载语句会自动更新, Laravel 也清楚应该在哪里去寻找该命名空间下的 filters, controlers

    1.4K40

    Spring避坑指南: 升级导致Spring AOP的@Around, @Before, @After执行顺序改变引发的故障

    故障重现 ---- 故障示例: 输出结果: @Around, @Before, @After, @AfterReturning, @AfterThrowing执行顺序逻辑如下图所示: 原逻辑是在...内清理(在此清理,代码写的很不好,应该在ilter或HandlerInterceptor内执行清理动作,哪里设置的,哪里清理)。...按照升级Spring版本之后的执行顺序:原方法在@Around内执行完原方法之后就执行了@After清理,后续@Around内的代码是访问不到ThreadLocal变量信息的。...建议一个@Aspect只使用@Around,Before和After的逻辑放在@Around内执行 ---- 执行结果: 这样的执行结果才是业务逻辑需要的执行顺序: before -> around...为了避免复杂的顺序关系打扰开发,建议一个@Aspect只使用@Around,Before和After的逻辑放在@Around内执行。 ---- ----

    98320

    AngularJS面试常见问题汇总

    当 view 中有任何数据变化时,会更新到 model ,当 model 中数据有变化时,view 也会同步更新,显然,这需要一个监控。...当浏览器接收到可以被 angular context 处理的事件时, $digest 循环就会触发,遍历所有的 $watch ,最后更新 dom。 2 AngularJS的数据双向绑定是怎么实现的?...MVVM:Model-View-ViewModel Model就是我们常说的数据模型,用于数据的构造,数据驱动, 主要提供基础实体的属性以及每个属性的验证逻辑....View主要用于界面呈现,与用户输入设备进行交互 ViewModel是MVVM架构中最重要的部分,ViewModel中包含属性,命令,方法,事件,属性验证等逻辑,用于逻辑实现,负责View与Model之间的通信...7.接口访问的代码放在哪里? 放在service里。 8.如何进行angular的单元测试?

    2.1K20

    设计模式之美 Part2

    什么项目应该考虑使用基于充血模型的 DDD 开发模式? 适合业务复杂的系统开发。比如,包含各种利息计算模型、还款模型等复杂业务的金融系统。 两种不同的开发模式会导致不同的开发流程。...不过,如果虚拟钱包系统需要支持更复杂的业务逻辑,那充血模型的优势就显现出来了。比如,我们要支持透支一定额度和冻结部分余额的功能。这个时候,我们重新来看一下 VirtualWallet 类的实现代码。...在基于充血模型的 DDD 开发模式下,Service 类并不会完全移除,而是负责一些不适合放在 Domain 类中的功能。...这是因为,Repository 层的 Entity 生命周期有限,Controller 层的 VO 只是单纯作为一种 DTO。两部分的业务逻辑都不会太复杂。业务逻辑主要集中在 Service 层。...所以,Repository 层和 Controller 层继续沿用贫血模型的设计思路是没有问题的。 遗留问题:Entity 与 Domain 的转换应该放在哪里?

    00

    MVPMVCMVVM

    , 我需要的只是新建相应的MVC模块, 加到对应的Scene即可. 4.可维护性: 各个模块间职责分离, 哪里出错改哪里, 完全不影响其他模块....第二种方式保证了P的纯粹,让P只做业务逻辑,至于业务逻辑引发的数据显示的变化,让view实现对应的代理事件来实现即可。这增加了view的复杂和view对于P的耦合。...3.调用presenter执行业务逻辑。 model层 1.和MVC的model层类似。 view层 1.监听P层的数据更新通知, 刷新页面展示.(MVC里由C层负责)。...有了MVVM我们就可以测试里面的viewModel,来验证我们的处理结果对不对(Xcode7的测试已经越来越完善了)。...缺点: 1.类会增多 每个VC都附带一个viewModel,类的数量*2 viewModel会越来越庞大 我们把逻辑给了viewModel,那势必Model也会变得很复杂,里面的属性和方法越来越多

    49720

    TW洞见〡为什么你的Angular代码很难测试?

    上面的代码应该可以满足我们的要求(验证逻辑因为不是我们关注的重点,所以并不完善),而且这个directive实现起来也挺简单的,但是现在让我们一起来分析一下为什么我们认为这种写法是比较糟糕的。...在新的版本里面,我们只处理了业务逻辑,即判断一个邮箱地址是否合法,至于何时触发验证,验证失败或成功之后应该有怎样的样式,我们都统统交给了angular原生directive去处理了。...,有时候为了验证这些DOM更新,你还不得不创建真实的DOM结构添加到DOMtree上去,又增加了一部分工作量。...操作放在一个service中去统一管理。...这里的处理办法是将快递地址验证失败或成功之后的处理函数都传给了deliveryService,当验证结果从服务器端返回之后,相应的处理函数会被执行。这做写法其实是比较常见的,但是问题出在哪里呢?

    1.5K30

    是如何在SQLServer中处理每天四亿三千万记录的

    对了,验证,我们现在是跑在现场环境下,之前没有问题,不代表现在的压力下没有问题,要在一个大型系统中分析这么个小功能,影响太大了,我们应该分解它。...是的,是“单元测试”,就是单个方法的测试,我们需要验证每个函数,每个独立的步骤到底耗时在哪里?...那个时候还没有学会这个技能,看了下网上的文章,好像挺复杂的,时间不多了,不敢尝试。 停止其他程序 我知道这个肯定是不行的,因为软件、硬件的架构暂时没法修改。但是我希望验证是不是这些因素影响的。...索引的存在会影响插入、更新 去掉索引 是的,去掉索引之后查询肯定慢,但是我必须先验证去掉索引是否会加快写入。如果果断把MgrObjId和Id两个字段的索引去掉。...仔细查看IO数据,发现,预读是一样的,就是说我们要查询的数据记录都是一致的,物理读、表扫描也是一直的。而逻辑读取稍有区别,应该是缓存命中数导致的。

    80850

    这个反人类的智障网站,能成功注册算我输!

    按照正常的交互逻辑来说,好的交互设计一般会引导用户去做下一步操作,尽可能减少用户思考的成本,所以一般来说,被做成显眼图标的那个按钮,一定就是正确的按钮。 可在这里,它不是。。。...简直跟卸载的套路一模一样! 点击最显眼的 “ NO ” 并不能进入下一个页面 ? 如果不点图标,那应该点哪儿?...最关键的条件信息,也当然不会放在最显眼的地方。 当我换了十个密码都选不了 “ 下一步 ”的时候,才看到最下面快要融化在蓝色背景里的绿色密码设置要求。 ?...其实,交互设计作为一个专门的专业发展到现在已经有一套很成熟的逻辑体系了。 ? 按理说,我们在一个正常的产品里,也很难再碰到游戏里这样用脚做出来的设计。...就像是总会有些人会因为过程太复杂繁琐放弃卸载,或者以为自己卸载了;骚扰短信也少了更多被退订的机会;广告商可以获得更多的点击。

    1.5K3129

    我是如何在SQLServer中处理每天四亿三千万记录的

    对了,验证,我们现在是跑在现场环境下,之前没有问题,不代表现在的压力下没有问题,要在一个大型系统中分析这么个小功能,影响太大了,我们应该分解它。...是的,是“单元测试”,就是单个方法的测试,我们需要验证每个函数,每个独立的步骤到底耗时在哪里?...那个时候还没有学会这个技能,看了下网上的文章,好像挺复杂的,时间不多了,不敢尝试。 停止其他程序 我知道这个肯定是不行的,因为软件、硬件的架构暂时没法修改。但是我希望验证是不是这些因素影响的。...索引的存在会影响插入、更新 去掉索引 是的,去掉索引之后查询肯定慢,但是我必须先验证去掉索引是否会加快写入。如果果断把MgrObjId和Id两个字段的索引去掉。...仔细查看IO数据,发现,预读是一样的,就是说我们要查询的数据记录都是一致的,物理读、表扫描也是一直的。而逻辑读取稍有区别,应该是缓存命中数导致的。

    1.6K130
    领券