当前位置: 首页 > news >正文

工程之殇

今天晚上的心路历程好让人泄气。

继续揣摩laravel项目中ValidationException的设计,看到里面的status,觉得好奇怪,为什么是叫status,不是直接把code设置一下呢?然后想想,好像也对,code是异常的代码,而status是http response的代码,两个不应该混为一谈。

接下来我想看下既然ValidationException没有设置code,那laravel中是怎么做到在渲染的时候把http response statuscode 设置为status的。然后就看到了render里面。

136188-20180114023603332-2117032120.png

第一次看到这个代码,恶心坏了,这个分支的结构,真是太恶心了。然而琢磨了几个小时之后,直到写这篇文章的时候,我有种错觉,我已经把这坨shi吃下去了...

首先我想着是不是能优化下这个函数,是不是能把这里的渲染逻辑放到exception中呢?嗯,好像很完美。但是想想,不对啊。。。我定义一个异常的时候还需要定义好它的渲染方式,定义好它的json输出,html输出?明显不好。。。好,我只能接受在一个大类handler.php里面统一作处理。

其次我想,是不是可以再定义一个基类,让所有的类继承这个类。这里几个类最好的可能就是HttpResponse了。然后其他两个都继承这个类?然后在这个基类里面写一些逻辑?不对啊。。。不管你这个基类是什么,它还是一个异常,不应该在这个异常里面做这么复杂的事情啊。同上。而且,都继承这个类,子类里面也要有各种实现。。。不妥不妥。

好,那么我整理下handler类可好,封装一个函数,把所有的异常都进行遍历可好。但是这个方法可能就是二维的了,request是否json,和异常类型,两个纬度。那么,又是一个很恶心的函数。

呵呵,总而言之,好像没有最优美的解决方案了。遂放弃优化这块。

想想,这个明显是作者的设计不足。设计不够有扩展性。我又详细看了下laravel的异常,几个很大的问题:

1 异常继承随便继承,没有收口,以后要做统一处理,只能一个个遍历处理。有的继承Exception,有的继承Sysforny的Exception,有的继承Responseable接口。。。各种混乱。

2 输出格式没有统一。各种不同的异常需要不同的输出格式,再加上是否调试模式,这里已经有好几个分支了。没有考虑过统一的格式过滤。

哎,优雅的laravel内部还是很多问题的。这个地方,不是很优雅。但是,只能说,介于历史包袱,它只能做到这样了。

于是我想到我们平时的业务工程,不就是和这种项目一样么,越来越久之后,背上承重的壳,也就这么痛苦不堪了。so,这就是工程之殇。

于是,我只能啥都不改,悻悻地上床睡觉。又是一个胡思乱想晚上。

相关文章:

  • 2018第2周日
  • 自我介绍
  • 小程序完整对接 pingpp支付
  • 解决IntelliJ IDEA无法读取配置文件的问题
  • JAVA多线程之wait/notify
  • 出现次数最多的k个数 Top K Frequent Words
  • 异步拷贝文件
  • 用lua实现ByteArray和ByteArrayVarint
  • 作业2
  • 缓冲区溢出漏洞(2)
  • Visual Studio VS如何重置所有设置
  • Twirp:一个很酷的基于Go的新RPC框架
  • Nginx+Tomcat搭建高性能负载均衡集群
  • 我的第一篇博客
  • 我讲个事情哈,编程其实是文科
  • 【Leetcode】104. 二叉树的最大深度
  • axios 和 cookie 的那些事
  • Brief introduction of how to 'Call, Apply and Bind'
  • css的样式优先级
  • CSS中外联样式表代表的含义
  • C语言笔记(第一章:C语言编程)
  • es6
  • exif信息对照
  • Github访问慢解决办法
  • HTTP中的ETag在移动客户端的应用
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript设计模式系列一:工厂模式
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • MySQL的数据类型
  • SOFAMosn配置模型
  • Solarized Scheme
  • TypeScript迭代器
  • 从重复到重用
  • 算法---两个栈实现一个队列
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • ​Java并发新构件之Exchanger
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (Python第六天)文件处理
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET正则基础之——正则委托
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @vue/cli 3.x+引入jQuery
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [2544]最短路 (两种算法)(HDU)
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [acm算法学习] 后缀数组SA
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [Android] 修改设备访问权限
  • [Angular] 笔记 21:@ViewChild
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [C/C++]数据结构 深入挖掘环形链表问题