Java 的那些框架曾经疯狂地使用 xml ,不用硬编码,但现在怎么又“去 xml 化”回归硬编码了_-ze ran
Java后端有时候就是解耦解魔怔了。
如果一个java项目,不用Spring,不用DI,自己初始化配置,服务,Dao,无状态的就用 static method,singleton,业务逻辑里想用那个服务类就直接调用。这样的开发会怎样?
会很爽。
我试过,这样对代码流程100%的掌控,没有任何意料以外的行为,大量减少在stack overflow查诡异错误的时间。所有逻辑聚合于一处,维护起来非常轻松,交给别人也可以快速上手。
代码写逻辑,配置写环境。
一些框架为了解耦,逻辑写到配置里,A依赖B,不能直接依赖B,要给B写个接口,再给接口写个实现,再把实现写到配置文件里,一个一句话的东西,写三个地方,还说是为了扩展,你写底层框架也就罢了,大家都是写业务逻辑的,要多少种花样实现?到项目下线也没有写第二个Impl。
该耦合不让它耦合,把低耦合写出低内聚的效果。
系统固有的复杂性只会转移,不会消解。把代码的逻辑,写到xml里,只会让维护更痛苦,不会让系统简单。
现在鼓励写在注解里,因为注解也是代码,本来就该是代码的逻辑,绕一圈发现,还是放在代码里最省心。注解现在也有被滥用的趋势,一个注解不行,还要了解几个注解合并怎么用,升个版本注解的意思可能还会变,总之,dsl不堪重用。
写代码,简单直接就好。
评论区
知乎用户wup71p: 我经常挂在嘴边一句话,你这辈子估计都不会把这个interface实现第二次 👍🏽629 💭浙江 🕐2022-11-06 18:17:20
│ └── 江畔何人初见月: 我草,太真实了 👍🏽0 💭广东 🕐2022-11-06 19:58:06
│ └── shiloh: 字词 👍🏽6 💭广东 🕐2022-11-06 22:04:48
│ └── 烂柯人: 太支持了 👍🏽0 💭山东 🕐2022-11-06 23:03:19
│ └── 思雨雨: UT需要mock的时候? 👍🏽2 💭上海 🕐2022-11-06 23:15:25
│ │ └── dragove: 使用mock框架,例如mockito,对象是代理对象,就不需要再手写代码实现一遍了。 👍🏽2 💭浙江 🕐2022-11-07 10:03:01
│ └── 踏遍青山人不悔: 多环境不一样的实现怎么办 👍🏽1 💭四川 🕐2022-11-07 08:33:27
│ │ └── 知乎用户wup71p: 我是Android开发,经常会有人莫名其妙用mvp模式,我主要是在这种场景下吐槽[大笑] 👍🏽23 💭浙江 🕐2022-11-07 09:51:38
│ │ │ └── RichRain: 哥们 mvc都打错了 锐评啥呢 好好干你的前端得了 👍🏽0 💭江苏 🕐2024-08-01 08:43:00
│ │ │ └── 洗洗更健康: MVC还好吧,当初一帮人跟风MVP那才是灾难,一帮人跟着写大堆的接口 👍🏽0 💭北京 🕐2024-08-13 20:59:40
│ │ └── 会飞的橙子: 情况很少的零星需求,多了就单独提包了 👍🏽0 💭上海 🕐2022-11-07 09:59:09
│ │ └── 大灰熊哈哈: [大笑]那你写的interface也没啥用 👍🏽1 💭北京 🕐2022-11-07 10:29:48
│ │ │ └── 昵称别取太长: 是的,interface确实没啥用了。我c#,Java都接触。现在c#很多项目直接不用interface了 👍🏽0 💭广东 🕐2023-01-23 12:39:47
│ │ │ └── 不吸血的蚊子: 我现在的原则是先不用interface,当我这个地方要有第二种实现的时候我再把它抽象成interface,结果发现一个项目从出生到不归我管了!只有几个关键地方需要抽象成interface 👍🏽1 💭湖南 🕐2023-11-07 18:02:35
│ │ └── 三碗儿: 具体问题具体分析。需要的时候写,不需要的时候就不写。现在是不需要写的也弄一大堆。 👍🏽1 💭广东 🕐2022-11-07 18:16:46
│ │ └── 踏遍青山人不悔: 团队开发试试,每个人是每个人的习惯,用spring反而大家习惯都一样,容易接手 👍🏽1 💭四川 🕐2022-11-08 09:14:17
│ └── 黄大雄: 哈哈哈哈哈 是真的。 👍🏽0 💭广东 🕐2022-11-07 09:42:29
│ └── 珍妮的小熊饼干: 是的,除非你要写客户端软件,或者框架等需求变化不大的东西 👍🏽2 💭上海 🕐2022-11-07 09:50:25
│ └── 知乎用户bz8P0S: 哈哈,扎铁了,老心 👍🏽0 💭浙江 🕐2022-11-07 09:56:12
│ └── 张一水: 是的,99.99999999%的interface都屁用没有 👍🏽7 💭浙江 🕐2022-11-07 12:52:44
│ └── sullix: 哈哈哈,强制分层[捂脸] 👍🏽0 💭四川 🕐2022-11-07 13:49:30
│ └── 麻辣味鱼卷: 真实[捂脸][捂脸][捂脸] 👍🏽0 💭北京 🕐2022-11-07 16:42:35
│ └── 小开不怕不怕: 如果是这种情况为什么抽象接口出来?逗 👍🏽0 💭辽宁 🕐2022-11-07 17:33:24
│ │ └── Iterator: 这不是实力不行么,公式化代码,起手就是个interface 👍🏽7 💭内蒙古 🕐2022-11-07 17:59:47
│ │ └── 狂踹瘸子那条好腿: 不是说抽象没用.而是你大概率不会用.火箭再牛逼,你也不会用火箭出行.但我说你这辈子大概率都不会用火箭出行,你反问我,那如果是这种情况为什么要造火箭?逗?你也是写代码的,不能这种逻辑吧.抽象接口是有用的,但大多数情况下用不到. 👍🏽0 💭江苏 🕐2024-10-28 10:11:22
│ └── 知乎用户G0HLE4: 可是事实上如果用了切面,事务之类的,你写的inteface早就被实现n遍了,只是你不知道,不信的话自己在实现类里面断点看看,解偶入魔是一个极端,疯狂否定框架作用是另一个极端。 👍🏽137 💭福建 🕐2022-11-08 09:19:15
│ │ └── 无段: 你实现第二遍的时候自然就知道把它抽象出来了,要框架给你定死作什么?框架的唯一作用是在多人开发时给定交互标准,不涉及到多人的部分框架毫无作用。 👍🏽0 💭江苏 🕐2023-12-22 11:31:38
│ │ └── 12345: 那为什么要用切面、事务呢?你的项目真的复杂到这种地步了?培训班上多了吧? 👍🏽0 💭北京 🕐2024-06-13 14:33:51
│ │ │ └── 其他玩家: 事务是很复杂的项目才会用到的吗?用切面的一大好处就是简化代码,结果为了少写几行interface代码弃用切面,真的省事儿了? 👍🏽0 💭上海 🕐2024-07-29 11:12:50
│ │ │ └── 12345: 真省啊,90%的灵活性都是摆设,不要over engineering,刷工作量不给涨工资 👍🏽0 💭北京 🕐2024-07-29 11:42:29
│ │ └── 行一: 那是框架应该考虑的事,不是我该考虑的。另外,用代理包一下或者用一些魔法织入代码,那不叫 implements 接口[微笑] 👍🏽1 💭北京 🕐2024-08-04 10:03:43
│ │ └── 千山我独行: 即使如此,把接口这个额外负担丢给程序员也是值得商榷的,如果动态代理需要接口,你编译期内部造一个接口类不就行了。 👍🏽0 💭新加坡 🕐2024-09-21 13:11:44
│ │ └── (def p 'proletar: cglib动态代理啊 👍🏽0 💭湖南 🕐2025-05-05 10:57:28
│ └── 西伯利亚在逃土豆: 很多看起来没什么鸟用的规范其实是码农用来防背刺的,所谓防御性编程 👍🏽6 💭上海 🕐2022-11-08 18:52:32
│ └── Ethan: interface更重要的作用难道不是给其他服务做远程调用么 👍🏽5 💭广东 🕐2022-11-10 19:53:05
│ └── zrz: 还有人吐槽interface的,java之父詹姆斯说过他后悔设计继承,应该多用interface 👍🏽4 💭浙江 🕐2022-11-11 09:39:54
│ │ └── 知乎用户wup71p: interface yyds,但是那种一辈子都不会实现第二次的接口,真的有必要设计接口吗?sdk开发和业务模块开发可是两回事 👍🏽2 💭浙江 🕐2022-11-12 12:19:24
│ │ └── zrz: 多个实现很常见啊,比如对某一块业务的抽象,需要兼顾多个渠道,每个渠道一个实现的策略模式 👍🏽0 💭浙江 🕐2022-11-13 09:11:51
│ │ └── Kaede: 抽象类做不到吗? 👍🏽0 💭上海 🕐2024-02-29 00:43:44
│ └── 知乎用户wup71p: 你说的当然都没问题,并且我也是这么做的,但是更多的情况下,业务几乎不存在多态的情况,依然设计接口是否不太合适?所以我经常说,估计这辈子都不会把这个接口实现第二次 👍🏽5 💭浙江 🕐2022-11-13 12:14:12
│ └── 绿灯修理工: 小项目为啥要用java??没懂,python、php不香??三下五除二,我还跟你class、英特肥死?你环境还没起来,我已经做完了[思考] 👍🏽0 💭四川 🕐2023-03-08 03:09:38
│ │ └── 乎里淦: 不至于,现在springBoot也非常快,IDEA直接起项目,一行代码起接口,一键打包。 👍🏽0 💭山东 🕐2023-11-09 15:35:12
│ │ └── oatnau: java快起来直接public也是三下五除二的事 👍🏽0 💭江西 🕐2024-07-26 00:05:48
│ └── 虾哔哔: 能不能实现第二次和你是不是真的实现了第二次是两码事… 👍🏽0 💭上海 🕐2023-11-07 22:01:16
│ └── 木香丘: 这是个好问题,接口本质是一种抽象。是对现实世界到编程世界的一种建模。面向对象编程有个原则叫面向抽象编程,那没有接口语法的语言能不能面向抽象编程,当然可以,接口只是一种外在的形式。而面向抽象编程是一种思维方式。回到主题,那为啥需要接口,以及只是实现一次的接口,还要不要定义?接口的定义有好处:接口即是代码,又是最好的文档。接口也是写好代码的起点。接口不是简单把类的中方法简单在接口中再声明一遍。而是将一个类的实现抽象为多个指责单一的一堆小接口,通过接口的组合完成大类的功能。接口之间要正交。举个例子,说接口没用的,可以回去看看自己的代码,是不是一个类的代码又臭又长,充斥着 if else,各种逻辑不正交,顶多抽取一个私有方法复用,方法签名很随意,怎么定义都好像没啥问题。代码也不敢改,牵一发而动全身。好的接口抽象是一个面向对象程序员最基本的要求,通过看接口名,大概能推测实现思路,以及接口里面可能的方法定义。举个例子,AuthenticationProvider 接口,一看我就知道它与认证相关,核心的接口方法就是提供一个认证相关的对象的方法,如果接口有一个 support 方法,说明可以存在多个实现,通过 support 来决定启用哪个实现。同理,SessionStore 接口一看就能推测出来可能有 set、get、clear方法。看过很多源码的人应该会有共鸣,看开源项目,首先从接口入手,知其设计逻辑,然后根据需要再深入细节。很多人以为自己就是面向抽象编程,其实可能只是照葫芦画瓢,并没有产生“独立意识”,会错误的认为,老员工都是这么写的,框架之所以那么抽象,是因为框架复杂,业务场景简单等等一些原因。我早期也是这样,并没有什么丢人的。那我再举个例子,假的面向抽象编程是个啥样子,就以上面两个接口为例,会这样定义接口 AuthenticationService、SessionService,连最基本的单一原则都没有意识到,我不认为这是一个觉醒“独立意识”的面向对象编程的程序员[飙泪笑]。所以面向对象编程,接口或者说抽象是灵魂。跟接口实现的次数没关系。就算你是一个面向抽象编程的高手,接口也很有必要,不要让其他开发者看你代码的时候,还需要从你的实现类中,排除掉逻辑代码和私有方法、保护方法,逆向识别出类本应有的接口样子。 👍🏽5 💭广东 🕐2023-11-08 01:58:20
│ └── 木香丘: 推简介一个项目给大家,openvsx,是一个业务型项目,本身项目不复杂。作者是面向对象编程领域很牛逼的一个人,写了很多工具和框架,看看人家怎么抽象业务项目的,如果换做自己来实现你会怎么做。 👍🏽0 💭广东 🕐2023-11-08 02:06:39
│ └── ayoux: 不用估计,就没可能写第二遍 👍🏽0 💭广西 🕐2024-01-11 05:27:04
│ └── Kaede: Interface除非你写一些非常复杂的东西,其实是没任何用处的 👍🏽0 💭上海 🕐2024-02-29 00:41:41
│ └── smallgd: 岂止是interface,dto的属性get set,这辈子都没有过不等价于赋值的实现,但是全都要用sb一样的属性,不用赋值。java体系里全是各种不看场合,一股脑全上的sb“最佳实践”。 👍🏽0 💭重庆 🕐2024-05-11 13:44:21
│ └── 高坂桐乃: 业务开发和底层开发不一样,底层是不想把细节暴露所以用接口。业务里接口没有意义 👍🏽0 💭北京 🕐2024-06-19 12:20:17
│ └── 李冲: 策略模式使用是很频繁的一个设计模式,新增一个策略就需要实现一次策略接口 👍🏽0 💭四川 🕐2024-08-13 11:50:59
│ └── 千山我独行: 接口概念是后来被Spring 搞魔怔了。在EJB 1/2 的时代,实现类都是远程对象,本地JVM里只有接口是标准Java 对象,这样的场景,接口与实现分离才是有意义的。 👍🏽0 💭新加坡 🕐2024-09-21 13:08:10
│ └── 狂踹瘸子那条好腿: 挺严谨了,99.9999999%的概率不会.[笑哭][笑哭][笑哭] 👍🏽0 💭江苏 🕐2024-10-28 10:07:46
rribx: 你说的是对的, 很多人动不动就谈什么大型项目的可维护性、设计、解耦这种屁话, 其实很多项目都没有真的大到需要谈这些东西的地步, 过早优化才是万恶之源, 知乎好像人均google阿里业务量一样 👍🏽179 💭广东 🕐2022-11-06 18:09:53
│ └── 江畔何人初见月: 我草,太真实了 👍🏽0 💭广东 🕐2022-11-06 19:57:55
│ └── 黄思永: 有些码农就爱吹牛,一个内部应用的系统,最多也就几十个人用,几千条数据还动不动说什么高并发大数据。 👍🏽88 💭北京 🕐2022-11-06 22:47:34
│ │ └── qnwang: 这些东西跳槽时用得到呀,不会的你去面试看看有没有地方要你 👍🏽5 💭北京 🕐2022-11-07 08:59:03
│ │ │ └── 黄思永: 因为我面过别人才这么说 👍🏽0 💭北京 🕐2022-11-07 13:31:02
│ │ └── 十字: 我们公司新的阿里领导就是这样的,一个5个人以内实际用户的系统,弄了nacos,负载,quickbi嵌入,authing接入,mq,华为云的日志lts,好像还有一些七七八八的东西。最后就是2成时间写业务代码,5成时间扯皮,最后3成时间解决问题,然后问题很多就是用这个用那个导致的,如果是一个单体应用,屁事没有。 👍🏽58 💭江苏 🕐2022-11-07 14:08:32
│ │ │ └── 蓝天: 其实我倒是很希望领导这样搞,因为我能学到很多东西,以后面试的时候也好吹牛逼[酷] 👍🏽13 💭湖南 🕐2022-11-11 15:32:00
│ │ │ └── johnsondiao: 我也希望领导这样搞,在公司拿着钱,可以有经历的学知识和经验,何乐而不为呢??[酷] 👍🏽3 💭广东 🕐2023-02-13 09:09:41
│ │ │ └── 大侠饶命: 这种人就是混子。 👍🏽1 💭中国香港 🕐2023-12-11 10:55:00
│ │ │ └── 天书小说: 你糊涂啊 👍🏽0 💭辽宁 🕐2024-03-20 05:51:46
│ │ │ └── 李迟之Moomarc: [捂嘴]脱裤子提裤子 👍🏽0 💭广东 🕐2024-04-12 20:52:37
│ │ └── 啥都不会的开发: 国企外包就是这样。就那几个领导点。微服务全家桶都上 👍🏽2 💭广东 🕐2024-07-11 07:48:42
│ │ └── RichRain: 几十个人用怎么了 财务系统也就几十个人用 复杂的一比 有问题吗?该 👍🏽0 💭江苏 🕐2024-08-01 08:43:30
│ │ │ └── 黄思永: 复杂也和高并发无关 👍🏽0 💭北京 🕐2024-08-01 17:06:46
│ │ └── hqxd: 这样内部的系统不是互联网数据直接.net搞定,快得很[捂嘴][捂嘴] 👍🏽1 💭江西 🕐2025-04-13 08:20:29
│ └── FanMo: KPI,KPI啊懂不懂[惊喜] 👍🏽5 💭陕西 🕐2022-11-07 00:34:58
│ └── 李浩宇: 面向简历编程 👍🏽4 💭浙江 🕐2022-11-07 08:56:03
│ └── ChildlessCatLich: 这个业务量无关 和业务复杂性有关 👍🏽0 💭日本 🕐2022-11-07 11:21:08
│ └── sullix: 啥也不说先写个工厂模式[doge] 👍🏽3 💭四川 🕐2022-11-07 13:51:53
│ └── 吴畏: 等你接手屎山你就知道是什么意思了[尴尬] 👍🏽1 💭江苏 🕐2023-04-04 00:52:45
│ └── DAVE: [飙泪笑]大型项目现在已经解耦微服务化了,之前的理论很多都用不上了。 👍🏽1 💭山东 🕐2023-12-20 10:03:57
│ └── 哪里的天空不下雨: 不这样的话,凸显不出架构师的能耐 👍🏽3 💭广东 🕐2023-12-27 08:13:45
│ └── 尼拉克: 不是到不了需要谈的时候,而是明明是搞得敏捷开发,压根没时间谈,能跑起来就行了 👍🏽0 💭天津 🕐2024-04-16 23:07:56
│ └── 晚安梦到我: 说得对 👍🏽0 💭湖北 🕐2024-06-11 02:22:41
│ └── DAVE: [大笑]大项目,天天微服务架构,结果微服务还没用过,硬件已经解决了微服务架构上的软件问题。哈哈 👍🏽1 💭山东 🕐2024-06-26 11:23:18
│ └── RichRain: 嘿嘿嘿 骂别人的烂代码的时候也好好想想为什么 👍🏽0 💭江苏 🕐2024-08-01 08:41:50
这什么神仙操作: “系统固有的复杂性只会转移,不会消解。“ 这句话很赞同,我工作好几年才领悟这个道理。 👍🏽140 💭云南 🕐2022-11-07 09:10:20
│ └── 王老五: 但有些复杂性是公用的,可以固定下来。比如我写了个轮子,我其他业务就是先复制一个轮子,然后套就好了。问题的根本在于,你用的是别人的轮子。根本不知道这个轮子是什么?好不好用。我靠那个轮子,至少摸了10人月的鱼。 👍🏽13 💭上海 🕐2024-02-02 11:27:51
│ │ └── liucen: 有些公用是基于业务逻辑,但业务逻辑不由程序员控制 👍🏽0 💭天津 🕐2024-10-25 16:55:42
│ └── javaichiban: 简单概括:没有银弹 👍🏽3 💭北京 🕐2024-04-20 09:56:17
│ │ └── 柠檬仙人: 请问下,像你这样自己new的话,你会怎样写请求级事务。是new完了带着尿袋到处跑吗[思考] 👍🏽0 💭广东 🕐2025-04-23 07:58:36
│ └── javaichiban: ? 👍🏽0 💭北京 🕐2025-04-23 11:54:32
钟华: 到项目下线也没有第二个impl 很真实 👍🏽123 💭湖北 🕐2022-11-06 18:56:28
│ └── undefined: 项目大部分时候不需要,产品是绝对需要的,最简单的单元测试的mock总是需要吧 👍🏽0 💭四川 🕐2024-11-01 20:09:12
│ └── 淮阴清夜驿: 没单元测试,单元测试直接写单元测试报告文档,代码中没有[捂脸] ,领导问就说测过了。 👍🏽0 💭陕西 🕐2025-06-17 21:31:20
杨hg也: 知音[赞]。但在商业社会,这么干不挣钱,1,000万的合同会被你干成100万。 👍🏽94 💭北京 🕐2022-11-06 16:44:23
│ └── FanMo: [捂脸]一定要把最复杂的技术架构写到方案PPT中 👍🏽30 💭陕西 🕐2022-11-07 00:36:35
│ └── database: 2000年左右,同样的项目,java做要一千万,Delphi做要200万 👍🏽7 💭广东 🕐2022-11-07 13:45:20
│ └── ugvihc2006: C#做只要20万[大笑][大笑][大笑] 👍🏽1 💭重庆 🕐2025-02-05 16:53:00
徐飞: 这个我要反对一下,主要问题是Java被大量用于写交付型业务项目,一套业务底层加很多个定制分支是最常见的情况,任何层面的定制都是有可能的,所以会使用大量依赖注入之类的设计。如果不是做这类事情的,碰不到给不同客户提供的到处都有的定制,确实会觉得这类设计很多余。 👍🏽52 💭上海 🕐2022-11-06 16:50:54
│ └── ze ran: 依赖注入作为技术本身是没有问题的,只是技术也有其适用范围,现阶段由于Spring的统治地位,DI在java里有些被滥用,很多人离了框架反而不会写了 👍🏽59 💭新加坡 🕐2022-11-06 17:39:02
│ │ └── 徐飞: 是否滥用,要看面临的业务状况,我说的那种情况,不得不这么用,否则就没法实现各层面的定制。从db到上层业务,没有哪个是固定的[大哭] 👍🏽0 💭上海 🕐2022-11-06 19:52:54
│ │ └── see: 其实工具就是提升生产力的,我离了高级语言也不会写汇编啊,关键只是看用的人和环境,di绝对是个跨越式进步,作为人类,就算你考虑得再周全,也总有缺漏,而全解开的链条随时都能互相链接,可比原来的new不论拓展还是维护都更方便[思考] 👍🏽0 💭福建 🕐2024-04-28 14:08:23
│ │ └── 叽呼: 框架的目的是便于快速开发,离了框架不会开发那是人的问题,不是框架的问题 👍🏽0 💭北京 🕐2024-08-22 12:31:12
│ └── 好好学习天天向上: 没错,而且还有一个,就是多团队合作开发模块等一些其他case,di非常好用 👍🏽1 💭上海 🕐2022-11-07 01:18:12
│ │ └── AlexMontainBig: 多团队不应该微服务化吗 👍🏽0 💭北京 🕐2022-12-07 13:14:45
│ └── DAVE: 分支,是我见过最恶心的东西,有的需求就不应该是分支,而是子类,代码开头一个分支判断,然后整个源文件的代码都在里面,而且有的代码仅仅是修改了某一个部分 👍🏽0 💭山东 🕐2024-06-26 11:24:30
ayanamist: 一看就是从来不写单元测试的,按你这样搞,可测试性无比差。 👍🏽45 💭浙江 🕐2022-11-06 19:00:04
│ └── 再行: 这跟单元测试有什么关系? 👍🏽63 💭四川 🕐2022-11-06 20:06:44
│ │ └── bb aa: new的时候写死了具体类,没法mock 👍🏽2 💭美国 🕐2022-11-07 15:13:37
│ │ └── 李兆星: java 可以运行时改字节码的 👍🏽1 💭北京 🕐2022-11-07 16:41:01
│ │ └── 再行: 这只是你没有相关的工具链,并不是不能做。其他回答中有说具体的工具名字,你可以看看。 👍🏽0 💭四川 🕐2022-11-07 16:47:16
│ │ │ └── bb aa: di还有个好处,如果constructor被用了一百次,新加parameter不用改一百个地方 👍🏽1 💭美国 🕐2022-11-08 00:11:32
│ │ └── 片总: 你的测试库太老了吧。现在不但new能mock,static方法也能mock。不然那些依赖当前时间的方法不是傻眼了? 👍🏽2 💭云南 🕐2023-12-25 21:58:03
│ │ └── bb aa: 确实不知道了,没有在非依赖注入的环境下写过test 👍🏽0 💭美国 🕐2023-12-25 23:02:56
│ │ └── bb aa: 回复一次显示两次,知乎不知道有没有写test 👍🏽1 💭美国 🕐2023-12-25 23:04:22
│ └── Kicey: 依赖更明确的话更好 mock,没有代理和接口的话测试的对象也是直接可见的,装配的话单元测试可以 mock 依赖,总体来说应该是更简单了吧…… 👍🏽20 💭天津 🕐2022-11-06 20:17:41
│ │ └── Ribes: 我也觉得应该是很容易测试了,毕竟少了那么多黑盒。 👍🏽41 💭江苏 🕐2022-11-06 20:20:21
│ │ └── Aman: 有些业务单元测试完全无用,金融交易几乎都是业务场景组合的测试[吃瓜] 👍🏽6 💭广东 🕐2022-11-06 22:16:28
│ │ └── 知乎用户iEk1IC: 单元测试覆盖工具类就够了吧。 👍🏽0 💭湖北 🕐2022-11-07 15:11:35
│ │ │ └── Aman: curd没啥工具类,写那些玩意纯属浪费时间 👍🏽0 💭广东 🕐2022-11-07 15:37:10
│ │ └── 王者不在: 业务场景测试表示认可 👍🏽0 💭北京 🕐2022-11-08 11:46:54
│ └── 锦衣: [doge]都已经选择这样开发了,单元测试估计压根不考虑 👍🏽9 💭广东 🕐2022-11-07 08:14:42
│ └── 陈年风楼: 一看你就不太会写单元测试 👍🏽11 💭陕西 🕐2022-11-07 09:11:13
│ └── qouteall: 怎么就可测试性差了,你不会还在用远古的不写interface就不能mock的框架吧 👍🏽9 💭江苏 🕐2022-11-07 10:05:01
│ │ └── 李兆星: 不用interface的话怎么mock?类加载的时候覆盖?有相关文档可以指点一下吗? 👍🏽0 💭北京 🕐2022-11-07 13:37:50
│ │ └── qouteall: 可以看一下jmockit 👍🏽1 💭江苏 🕐2022-11-07 15:22:14
│ └── 贾一饼: 明显这样更容易单元测试,反过来推,单元测试是不是因为为了糊各种过度设计的屎,连个helloworld也要单测一下 👍🏽8 💭广东 🕐2022-11-07 13:48:05
酩眸: 到项目下线也没用到第二个impl,不要太真实[赞同] 👍🏽39 💭广东 🕐2022-11-07 08:35:22
│ └── Mr.药: 其实真要有多实现的需求 再拆开也来的级 👍🏽6 💭上海 🕐2022-11-11 10:31:45
鱼丸粗面: 对于生命周期很长的软件,我司就有一个二十多年了还在加feature的软件,从第一行代码开始到现在,经手的人少说也有几百号人不知所踪,使用框架的好处就是大家都在一个约定下开发,什么情况该动哪里,新招来人也能猜到个大概。 👍🏽37 💭广东 🕐2022-11-06 17:15:20
│ └── 追风骚年: spring的配置和注释升级贼快,过几年就猜不到大概了。 👍🏽50 💭广西 🕐2022-11-06 17:59:53
│ └── 冻僵的野猪: 我就说一个spring security的saml扩展,两年不到的时间整个配置文件几乎全部换了个遍,更新个core版本原本的代码全部deprecated。你要有这种需要维护更新十几年的项目,建议自己搭建或者魔改一个框架自己维护,鬼知道十年后流行的又是什么标准什么语法 👍🏽6 💭新加坡 🕐2022-11-07 01:26:28
│ │ └── ze ran: 类似,我们有个十几年的项目,自己人写的代码都很好维护,但里面有一个spring security的依赖,每次升级出各种毛病 👍🏽15 💭新加坡 🕐2022-11-07 09:11:32
│ │ └── 北凉世子徐凤年: 这就不对了。鉴权框架应该单独抽离出一个服务才对。那个服务在security基础上升级。这属于基础架构不行。 👍🏽2 💭北京 🕐2022-11-07 12:42:34
│ └── 7mile: 还是答主说的那个意思,系统本身的复杂度只会转移,不会消解。 👍🏽0 💭北京 🕐2022-11-07 15:03:25
│ └── 两节课: 你说这个叫做约定大于规范,主要是编码规范,而不是什么框架。 👍🏽0 💭北京 🕐2022-11-07 18:36:06
Victor Yeh: 确实是框架用魔怔了。然后过几年框架升级了,一堆不兼容,bug一大堆,几个月都改不完。还不如一开始就不用框架全都自己写。 👍🏽26 💭广东 🕐2022-11-06 23:09:10
│ └── 天下大同: 兼容后没事干那就失业了[飙泪笑] 👍🏽12 💭广东 🕐2022-11-07 01:50:01
Rebound: 真的是,写一个简单的业务都要写service加上一堆接口,明明都没什么意义,也不会再复用这个接口,整个参数传八百遍才到dao层 👍🏽25 💭辽宁 🕐2022-11-07 11:18:14
│ └── 白雪公主的王子: 实际上分开会比不分开好。现在都是模板,为啥不分开呢? 👍🏽1 💭广东 🕐2022-11-11 09:38:04
│ └── 蓝天: 是的 无数层 套娃 我写个单表的curd 写了他妈的10几个类 👍🏽0 💭湖南 🕐2022-11-11 15:37:35
│ │ └── BugFixor: 单表写十几个?[机智] 👍🏽0 💭浙江 🕐2023-08-14 08:16:55
│ └── 半个西瓜: 现在大多数类我都不写impl了 👍🏽0 💭福建 🕐2024-03-22 15:24:48
│ └── Designer: 请说出你的工龄 👍🏽0 💭广东 🕐2024-08-28 09:48:11
│ └── Rebound: 比你命长,自己算 👍🏽0 💭辽宁 🕐2024-09-02 10:39:09
11232as: 没有DI就会存在一个贯穿流程的上下文或者工厂类,GitHub上有很多不使用spring框架的大型Java软件里就是这样得,跟实现了一个简单的注入框架差不多… 👍🏽25 💭浙江 🕐2022-11-06 18:25:11
│ └── 黄大河: 是的,不少提供了starter的项目接入spring之前做法都是这样的 👍🏽0 💭广东 🕐2022-11-06 18:57:22
│ └── 群星我之歸宿: Vertx 或者Akka 这类传递event的toolkit/framework,你会发现根本不需要DI来解耦,照样可以有很好的可测试性。 👍🏽19 💭日本 🕐2022-11-06 20:06:42
│ └── 11232as: 搜了下涨见识了… 👍🏽0 💭浙江 🕐2022-11-07 03:31:45
│ └── clion: 传递event的框架在某些场景下非常实用 👍🏽0 💭江苏 🕐2023-06-02 10:01:45
│ └── 人格独立: 阿里嘎多 👍🏽0 💭广东 🕐2024-04-15 19:29:25
│ └── 种花家的兔子: vertx[捂脸],那你为啥不用quarkus说呢?vertx就是一个异步web框架。只是个web框架。 👍🏽0 💭辽宁 🕐2024-05-08 07:42:16
│ └── Source: 你说的是akka actor ?固然它作为一种并发编程模型,有其优势,但是真正在项目里写业务逻辑用这个模型,大量的同步函数调用变成异步消息,查调用链都靠代码里搜消息定义拼凑出来,维护起来挺操蛋的 👍🏽1 💭上海 🕐2024-06-13 21:36:34
丢猫: 项目里不用di手工初始化,你就会看到有些人把同一个初始化调用了两遍这种事情。还有某些上下文没有初始化之前就调用这个上下文。无状态的你准备Singleton一把梭结果有一天你发现这个东西需要重构了状态需要复制重用。如果你把初始化用某个方式组织一下的话,恭喜你,你发明了另一个简陋的DSL而且还没spring好用。 👍🏽24 💭新加坡 🕐2022-11-06 19:30:38
│ └── 再行: 这跟用框架有什么关系,你用了di也阻止不了手贱的人new object。 👍🏽13 💭四川 🕐2022-11-06 22:23:13
│ │ └── 丢猫: 这不就是因为没有依赖关系管理代码瞎写么?有di把依赖关系声明出来问题不都没了。还new object,碰到有这种想法的同事建议你直接换工作。 👍🏽9 💭新加坡 🕐2022-11-06 23:42:11
│ └── 繁星若尘: 我见过一个古董项目。数据库连接用不同得方式初始化了N次。。。。 👍🏽1 💭上海 🕐2022-11-07 15:10:30
│ └── 丢猫: 古董项目是这样[捂脸] 有di的好处就是很多初始化流程在di里才有得做[飙泪笑] 👍🏽0 💭新加坡 🕐2022-11-07 15:46:56
│ └── 再行: 设计模式可以优化项目结构,但是用设计模式来管理项目结构是不是有点越俎代庖了,没有什么用了di就只能在di里面做的事,如果有,你可以举两个例子。 👍🏽0 💭四川 🕐2022-11-07 17:04:04
│ └── 丢猫: 笑死,所有的config envvar还有conn factory一类的东西都在di流程里初始化的,你不在di流程里获取它们的instance难道还要在外面自己做?你头发太多了么?di是依赖管理,只要你需要依赖管理,不管你用什么方式去做,做出来的东西都会是一个和spring差不多的玩意,希望你到时候能给一个自己实现这东西的好理由。 👍🏽3 💭新加坡 🕐2022-11-08 12:17:10
│ └── 丢猫: di和项目结构有什么关系?就算是spring也不要求你项目必须怎么怎么写OK? 👍🏽0 💭新加坡 🕐2022-11-08 12:17:51
GoGoGo: 还有各种姿势的拦截代码,写的时候非常舒服轻松,有点问题排查就费劲,尤其是文档不清晰的时候。 👍🏽16 💭北京 🕐2022-11-06 20:20:03
gang: 一个人做项目肯定是什么都不用最快,但是涉及到一个项目需要十几个水平各异的人去维护的时候,面临的问题又不一样了。java不是给一个人开发用的语言,而是一个适合工程落地的语言。 👍🏽15 💭北京 🕐2022-11-10 10:38:02
│ └── ituuz: 确实是,做架构设计时,总是有人质疑过度复杂了,直接撸更简单,但他们没考虑业务复杂度和开发环境问题。比如突然爆发式的业务需求上来,要扑上来30个水平参差不齐的外包时,这个复杂的架构设计就可以保证外包无论怎么搞,最多他自己写的东西不好使,不会影响其他部分。所以设计合不合理要占到更高点去理解,甚至有很多是防御性的,一线开发看不到的可能性。 👍🏽5 💭北京 🕐2022-11-18 18:41:15
│ └── 三才天地人: 那就到时候再重构比较好。因为业务变化的时候,你预先设计的东西也是很大概率不适用的 👍🏽0 💭上海 🕐2024-04-14 21:31:13
│ └── 粗糙: 实际上业务不会给你那么多时间重构的 👍🏽0 💭浙江 🕐2024-05-09 12:39:20
子豪sirius: 想起我刚从C转到Java,用spring开发,我就纳闷,为什么先定义个service接口再写个实现?我这个业务场景只可能有一个实现啊[捂脸] 👍🏽18 💭广东 🕐2022-11-08 09:33:42
│ └── ZzZ: 如果是我带的项目,我就让他们不要写接口,直接写实现 👍🏽0 💭重庆 🕐2022-11-12 09:09:11
│ └── 知乎用户fGvLs7: 因为要用jdk的代理吧 👍🏽0 💭湖南 🕐2022-12-05 12:12:07
│ └── 上善: 接口可以写注释,这个接口干什么用的,一眼就看出来了,而且一般搭建系统,都是先搭建接口。另一个切换实现类方便。比如在线支付的接口和微信支付和支付宝支付的的实现。如果没有这方面的考虑,只能说你是在面向过程编程。[思考] 👍🏽1 💭广东 🕐2023-10-27 08:10:15
│ │ └── 疯疯雨雨: 有切换需求的应该这样做,但是大部分时候,压根就没这个需求,比如系统内部的订单类,几乎不存在多实现的可能性 👍🏽0 💭上海 🕐2024-08-12 11:12:28
│ └── junekz: spring没有强制一定要先定义一个接口,没有接口的类也可以做为Bean 👍🏽1 💭浙江 🕐2024-01-09 09:26:38
│ └── 逝水流炎: 直接动手干活是这样的。过程代码写多了。 👍🏽1 💭四川 🕐2024-07-11 13:12:37
高旸: 现在写注解的趋势真要命,一个业务逻辑封装成注解,出个bug要查都无从查起 👍🏽17 💭山东 🕐2022-11-06 20:31:19
│ └── 两节课: 业务逻辑都能封成注解,这跟直接写个调用有啥区别? 👍🏽4 💭北京 🕐2022-11-07 18:38:21
│ └── 寒夜: 业务逻辑封装成注解也太逆天了,这有啥意义 👍🏽1 💭广东 🕐2022-11-12 09:13:53
│ └── LinuxSystem: [捂脸]让我想起来一个叫某依的orale版本,用的查询条件居然用到切面,搞得一开始找了半天代码。 👍🏽3 💭浙江 🕐2022-11-12 09:46:49
│ └── Kevin: 多租户? 👍🏽0 💭广东 🕐2024-04-13 17:24:17
维斯特·克瑞亚: 为了解藕而解藕,明明不可能会有其他实现,但也一定要提取个接口 👍🏽16 💭广东 🕐2022-11-06 22:33:10
│ └── Percy0601: 内部接口完全没必要,外部接口要抽象。总之要灵活,不能上来就写接口,是否有多态,根本不存在多态就没必要接口。让jvm理解多态或多出的接口浪费内存不说,还影响执行性能(虽然相差微乎极微)。 👍🏽1 💭北京 🕐2022-11-07 11:34:24
宋辉: 其实对前端我也是这种看法,用原生js就好,顶多用用杰阔瑞, 👍🏽10 💭广东 🕐2022-11-06 18:26:46
│ └── 三才天地人: 前端因为UI库的问题,不完全一样,一大堆的后台管理项目,都是用UI库搞的。换句话说是生态影响 👍🏽14 💭上海 🕐2022-11-06 19:25:34
│ └── IllTamer: 要考虑生产效率吧[思考] 👍🏽0 💭黑龙江 🕐2022-11-07 02:14:50
│ │ └── 深圳群众李大国: 先不说生产效率能提高多少,问题是不管效率提高多少,我们仍然永无止境的加班。[大笑] 👍🏽4 💭广东 🕐2022-11-07 09:47:21
│ └── 看着未来: 前端还是需要用架子的,js写还要处理分辨率适配问题,还有就是一些按钮效果,table效果,js写也挺麻烦的,jQuery感觉功能也不全 👍🏽1 💭重庆 🕐2022-11-07 11:09:41
│ └── 我想要开心: 他和你说的都不是同一个东西 👍🏽0 💭江西 🕐2022-11-10 18:19:12
│ └── 兔子的萝卜: [捂脸]你回头用jq写一个项目你就知道了 👍🏽0 💭江苏 🕐2022-11-11 08:35:06
gwb: 在游戏开发中,把代码和配置分开是很常见的做法,做好了怪物的配置以后就甩给策划策划去改伤害防御皮肤,大怪和小兵用的同一套模板,这才叫解耦 👍🏽7 💭北京 🕐2022-11-07 14:14:16
│ └── link.dovakin: 是的,游戏世界里,最贴合“对象”这个概念,很多编程模式可以很自然直观的应用在程序设计中 👍🏽7 💭河南 🕐2022-11-11 10:11:15
看着未来: 写了快6年java了,现在还没明白耦合是啥意思,以前面试问到就背标准答案[飙泪笑],我现在有一种冲动就是放弃使用spring架子,感觉现在spring架子越来越复杂了,越来越乱了 👍🏽9 💭重庆 🕐2022-11-07 11:04:34
│ └── 再行: 参考苟合。 👍🏽0 💭四川 🕐2022-11-11 10:32:37
│ └── 不吸血的蚊子: 看具体业务和团队大小,这玩意本来设计是给大型软件工程团队使用的,比如你现在写一个单表CRUD要弄一堆东西,但是最初这玩意是给系统分析师抽象出业务之后定义接口,和抽象类,定义了业务流程,写业务的是一波人,写底层实现的又是另外一波人,各自实现接口而已,但是如果团队小,一个人从前写到后就会觉得麻烦的要死了,我也是偶然给大佬帮忙设计的时候才明白为啥要这么用,所以具体问题具体看待 👍🏽1 💭湖南 🕐2023-11-07 18:11:05
│ └── 专业拉粑粑: 6年都没了解过设计模式吗 👍🏽0 💭四川 🕐2024-06-22 21:27:16
│ └── 迂魚語鬱: 现在流行的设计模式里面有很多是专门给Java打补丁搞出来的 👍🏽0 💭福建 🕐2024-08-19 00:20:55
SRv6: 最开始就设计分离解耦的原因在于,如果最开始不分离,后续将越来越复杂,逻辑越来越不可控。因为绝大多数的系统,在完全不能用之前都不会重构,只会在这个上面不断累积。以前分离是因为想的太多,现在大家都明白了,拿钱办事,能跑就行,后面怎么塌了跟我有什么关系,到时候我又不在了 👍🏽9 💭山西 🕐2022-11-08 12:18:53
DUO: 以前我也这么想,知道我们公司代码就是这样的,而且代码量在一百多万行[捂脸] 👍🏽6 💭福建 🕐2022-11-08 11:03:03
纯洁的兔子: 啧啧解耦了可以有活干啊!我原本的系统后端按DDD重构项目数量×10,代码行数没细看不过怎么也得原基础上×5~10吧!今年部门绩效都拿到手软,他不香吗[滑稽] 👍🏽5 💭浙江 🕐2022-11-09 13:15:02
│ └── Maizi: 你这一看就是华为吧 👍🏽6 💭浙江 🕐2022-11-10 17:11:34
│ └── zzzz: 哈哈哈哈哈,华为可太真实了 👍🏽0 💭上海 🕐2022-11-11 00:21:05
oneBigPear.s: 我是老板我也不会允许你这么干,你这代码只有自己能看懂能维护而已,而我要能够随时找个外包替了你,所以我选择斯普润[思考] 👍🏽3 💭北京 🕐2022-11-11 09:37:03
吓死隔壁老王了: [撇嘴][撇嘴]复杂的依赖自然用di最好,但是这有个问题,为啥你会设计出这样一个复杂的依赖关系?不能简化?[捂脸][捂脸]我喜欢new,我喜欢对象的主导权在我手上而不是框架给我分配 👍🏽2 💭重庆 🕐2022-11-06 23:53:53
北辞张: 我当年写java的时候就反对用spring全家桶,如果抽象合理,自己控制模块间的启动顺序和依赖关系其实很容易的,用spring看似高级,其实就是换了一种语法写代码,使用注解一定要在有限范围内,但spring尝试使用注解解决所有问题,这是蠢。 👍🏽3 💭北京 🕐2022-11-12 13:58:13
Dawn Dawn: 非程序员,学了两三个月,老师用原生的servlet,sql写在代码里的时候我都跟得上,到spring部分,学两天学不下去了。 👍🏽3 💭上海 🕐2022-11-07 14:16:21
│ └── 咫尺天涯: 注重业务就行,不用想其他的。用习惯了就好了。 👍🏽0 💭辽宁 🕐2022-11-11 08:54:54
│ └── 回到过去: 为啥?spring不就是弄几个xml文件,然后弄几个service dao文件夹,也没多复杂啊 👍🏽0 💭安徽 🕐2022-11-11 17:38:03
叶枯橙: 大多数人的业务代码,一个接口只对应一个实现类,根本没必要有这个接口,看着就烦,我就直接写service类,很爽. 👍🏽1 💭陕西 🕐2022-11-11 14:54:17
大侠饶命: 还有有些相对固定的需求,也要为了方便扩展搞出几倍的代码。最后是,需求真变动也不一定按他想象的方向扩展,还是得改这多出几倍的代码。不过这种模式适合谈价值。 👍🏽1 💭广东 🕐2022-11-07 16:29:41
│ └── 卫江朝: 不用框架的php就这么爽 👍🏽0 💭山西 🕐2022-11-07 19:02:11
知乎用户r3z2XB: 这不就是go , 没框架 👍🏽1 💭广东 🕐2022-11-11 23:48:10
不知道是谁: 到项目下线也没写出第二个impl。。。这个不能再同意了。为了面向接口而面向接口 👍🏽2 💭广东 🕐2022-11-09 22:41:53
YMayBe: 是的,很舒服。有幸独立开发过一个金融的风控系统。唯一用了一个ZMQ的包用于前后端数据交换。其他基本上都是源生JAVA代码,简直不要太舒服。运行三四年了,出问题屈指可数。出问题基本上也能十分钟内解决。 👍🏽2 💭上海 🕐2024-09-21 17:07:36
木香丘: 这是个好问题,接口本质是一种抽象。是对现实世界到编程世界的一种建模。面向对象编程有个原则叫面向抽象编程,那没有接口语法的语言能不能面向抽象编程,当然可以,接口只是一种外在的形式。而面向抽象编程是一种思维方式。回到主题,那为啥需要接口,以及只是实现一次的接口,还要不要定义?接口的定义有好处:接口即是代码,又是最好的文档。接口也是写好代码的起点。接口不是简单把类的中方法简单在接口中再声明一遍。而是将一个类的实现抽象为多个指责单一的一堆小接口,通过接口的组合完成大类的功能。接口之间要正交。举个例子,说接口没用的,可以回去看看自己的代码,是不是一个类的代码又臭又长,充斥着 if else,各种逻辑不正交,顶多抽取一个私有方法复用,方法签名很随意,怎么定义都好像没啥问题。代码也不敢改,牵一发而动全身。好的接口抽象是一个面向对象程序员最基本的要求,通过看接口名,大概能推测实现思路,以及接口里面可能的方法定义。举个例子,AuthenticationProvider 接口,一看我就知道它与认证相关,核心的接口方法就是提供一个认证相关的对象的方法,如果接口有一个 support 方法,说明可以存在多个实现,通过 support 来决定启用哪个实现。同理,SessionStore 接口一看就能推测出来可能有 set、get、clear方法。看过很多源码的人应该会有共鸣,看开源项目,首先从接口入手,知其设计逻辑,然后根据需要再深入细节。很多人以为自己就是面向抽象编程,其实可能只是照葫芦画瓢,并没有产生“独立意识”,会错误的认为,老员工都是这么写的,框架之所以那么抽象,是因为框架复杂,业务场景简单等等一些原因。我早期也是这样,并没有什么丢人的。那我再举个例子,假的面向抽象编程是个啥样子,就以上面两个接口为例,会这样定义接口 AuthenticationService、SessionService,连最基本的单一原则都没有意识到,我不认为这是一个觉醒“独立意识”的面向对象编程的程序员[飙泪笑]。所以面向对象编程,接口或者说抽象是灵魂。跟接口实现的次数没关系。就算你是一个面向抽象编程的高手,接口也很有必要,不要让其他开发者看你代码的时候,还需要从你的实现类中,排除掉逻辑代码和私有方法、保护方法,逆向识别出类本应有的接口样子。 👍🏽2 💭广东 🕐2023-11-08 02:13:11
醉书生: 很同意,提前把事情复杂化,本身就不是在解决麻烦,而是创造麻烦。 👍🏽2 💭山东 🕐2022-11-20 13:34:44
沉默黑羊: 你是否在寻找:ssm 👍🏽2 💭福建 🕐2022-11-10 21:00:19
知乎用户VVsVw7: java就是癌症,出现之后就没有新语言的可用之处了,苹果的oc都可以唱戏。脚本和混杂的前端,web3也是不知所云。sun公司挂掉就是报应,哪天orcle完了就开启新时代了、 👍🏽2 💭广东 🕐2022-11-08 10:49:06
挥金如土: 啊,我就喜欢各种static 👍🏽2 💭福建 🕐2022-11-06 16:52:38
梦之缘刃: dao是什么 👍🏽0 💭湖北 🕐2022-11-06 20:10:45
│ └── Victor Yeh: Data Access Object 👍🏽0 💭广东 🕐2022-11-06 23:07:05
│ └── 肉松饼拖肥: 数据访问层 👍🏽0 💭四川 🕐2022-11-07 08:42:55
│ └── 牛哥: 持久层 👍🏽0 💭湖北 🕐2022-11-11 08:25:58
爱吃爱旅游: 以前我也不理解,但是这个世界上针对有很多宁愿写(抄)很多xml也不愿意写两句代码的人[思考] 👍🏽1 💭北京 🕐2024-09-04 22:27:43
专业拉粑粑: 之前看一个设计模式的课,讲了一个概念就是,设计模式的本质就是 “变与不变” 。如果一个功能开发从始至终都不会发生变化,那给他设计一堆扩展就是错误的。而把握这个变与不变就是码农要有提前感知的。 👍🏽1 💭四川 🕐2024-06-22 21:24:17
蒸发杰作: 这就是我们java高贵的设计模式 👍🏽1 💭上海 🕐2024-06-29 21:58:42
垃圾公司打工版: 不用spring就不复杂了?写得更加复杂看不懂 👍🏽1 💭广东 🕐2025-01-23 18:59:00
海岛奇兵: 注解也挺恶心的,因为还要搞清楚在哪个jar包里会扫到这个注解,然后做了什么。 👍🏽1 💭北京 🕐2024-06-13 16:54:06
是使用: 我在小公司后端用的node, 也就一个fastify框架简单包一层, 甚至连OOP思想都没用, 项目运行三年了, 各种功能往里加也没见不好维护. 几年前接收维护一个JAVA项目, 那个酸爽啊… 👍🏽1 💭上海 🕐2024-05-14 16:03:03
Yuna: 我可太讨厌大炮打蚊子的事了[衰] 👍🏽1 💭湖北 🕐2024-05-08 08:15:13
温开水: 业务逻辑分接口和实现类,难道不是因为工作中在接口层找方法比在实现层找方法方便么?正经业务内部用的极少会有多实现的吧! 👍🏽1 💭浙江 🕐2022-11-11 10:58:34
Jinda.L: 系统下线都没有第二个impl[捂脸][赞] 👍🏽1 💭江苏 🕐2022-11-10 19:44:34
嗯嗯: 看评论北京那么多java程序员?都在搞外包生意吗?[好奇] 👍🏽1 💭内蒙古 🕐2022-11-08 09:22:56
crazy: service确实一层就能搞定了,一般来说不会有第二种实现,之所以要用接口是为了动态代理 👍🏽1 💭广东 🕐2022-11-08 02:31:07
Chair: springboot糊一层,然后找个bladex框架之类商业版本再糊一层,只开发biz,所有代码完全面向业务逻辑,框架更新也不会有影响,稳定性与漏洞补丁以及中间件兼容性交由商业化框架搞定。数据库和中间件直接云服务提供。ingress进来直接就是gateway做统一鉴权限流相比找个运维折腾折腾idc,养发成天百度在各种第三方兼容库,在配置文件写法中倒腾,对框架做各种debug,只能说有些钱该花还是得花的。 👍🏽0 💭广东 🕐2022-11-08 13:53:43
超 is buuusy: 没写过java,但是听起来和我目前写cpp很像[大笑] 👍🏽0 💭北京 🕐2022-11-06 16:58:21
│ └── 躺平的野比大雄: java本来就是C+±- 👍🏽5 💭广东 🕐2022-11-07 18:55:22
│ └── 敢敢: 不就是c#[大笑] 👍🏽1 💭湖北 🕐2022-11-11 07:55:15
知乎用户jKXLBa: 我现在只有涉及第三方的时候,才用interface,确实是有多种实现方式,不够这种基本不是交给spring去管理,而是我自己去写策略模式,模板模式的之类的管理。包括第三方支付,爬虫等 👍🏽0 💭湖南 🕐2025-03-30 11:05:07
match: 还是要分项目的,目前我们就已经发现这个问题了,好多一次性的项目(特指政策类项目和特殊需求小型项目)完全不用强行解耦,所以目前我作为架构师给他们提的思想就是,但凡这个项目不会二次修改或者维护期很短,你就给我一个类从头写到尾,快速交付,其余的稍大型项目,要立项的软件等等,再进行强解耦严格按照大型项目架构走,自从这么搞过后,好多政策性项目我们的开发周期基本上只需要3个小时就能完成(原来1天多),而大型项目又因为时间充裕,结构层次又十分明朗,二次迭代的方便程度也提高了很多,唯一不足的就是耦合度太低,代码和员工关联性不高,导致员工手里没有特殊代码,没法跟公司谈条件,被彻底拿捏了[笑哭] 👍🏽0 💭四川 🕐2025-02-09 20:02:38
啊哈哈: 如果你这项目只是个人项目那真无所谓,但凡有人接手就要炸了[飙泪笑]我这接手的项目就是这样的,没有分层,controller里根据参数的不同if else 能有几十个分支,各种static method互相乱调,各种魔法值和配置满天乱飞,想到哪写到哪,好几个服务之间也是互相乱调,有走ip的有走域名的,有服务挂了好几天都不知道的,有的连源码都找不到了,本来很简单的业务,现在维护起来真的要命[飙泪笑] 👍🏽0 💭河北 🕐2025-01-10 14:53:04
tmphb: 确实是,Java的Spring框架非常强势 👍🏽0 💭陕西 🕐2024-12-04 01:17:52
蚂蚁蚂蚁: 写接口个写实现的不一定是一个人,用接口写业务的可能是另一个人,大团队,大项目才有优势 👍🏽0 💭浙江 🕐2024-11-15 08:03:17
溪流: 对头,javaer中很多人在设计上魔怔了 👍🏽0 💭浙江 🕐2024-10-26 11:32:57
菜鸟一高: 开发人数上了十几个 几十个之后 你就知道框架的好处。如果只是5个以内的开发人数,为什么要选择java呢? 👍🏽0 💭上海 🕐2024-09-23 09:52:56
卢梭罗: 不能更同意了 👍🏽0 💭北京 🕐2024-09-22 23:00:44
pig345: 直说了吧,就是spring带来的流行病呗[捂脸] 👍🏽0 💭北京 🕐2024-09-22 17:02:34
Sirotire: 软件开发没有银子弹的观点 👍🏽0 💭加拿大 🕐2024-09-03 19:36:16
大王不巡山: java的某些框架真是啰嗦的要死[捂脸] 👍🏽0 💭贵州 🕐2024-08-30 14:44:03
如若未相遇C: 用框架是为了简答,避免犯错。 👍🏽0 💭四川 🕐2024-08-28 13:49:18
just soso: 一句话,实在没得玩了,自己和自己玩的开心就行,脱离了Jvm都是垃圾 👍🏽0 💭北京 🕐2024-08-12 13:07:16
小芳张: 很多设计就是这样,改来改去最后又回去了 👍🏽0 💭上海 🕐2024-08-08 13:44:25
Ted: 文艺复兴[酷] 👍🏽0 💭福建 🕐2024-07-29 15:40:13
逝水流炎: 你们真的不知道代码写出来是用来阅读的。管拉不管埋。 👍🏽0 💭四川 🕐2024-07-11 13:06:46
zzwzz: 说的太对了!就一个工程会用到的代码还写个接口是真的离谱,哪怕你有两个工程要复用都没这么离谱[大笑] 👍🏽0 💭陕西 🕐2024-07-06 20:07:52
Hale: 现在一般是到公司倒闭也没有写第二个Impl 👍🏽0 💭北京 🕐2024-07-02 18:52:22
undefined: 你怎么不说最重要的一点,他帮你节省了很大一部分的开发时间呢。难道时间不是成本吗 👍🏽0 💭北京 🕐2024-06-21 17:18:45
hjwww: 注解滥用这点深有体会,自己懂得怎么用,能应付面试就行了,工作中能别用就别用,增大项目的不确定性风险,这个风险给到的是同事,接手你代码的同事指不定就被滥用的注解恶心得不行 👍🏽0 💭广西 🕐2024-06-18 10:27:49
cddjr: 曾经看过一个俄罗斯的开源项目,那个安卓代码简直是一团屎山,全是过度封装、过度解耦、代码分布的稀碎。。。 光是看代码都能把自己绕进去。然后又看了一个同类型的美国的开源项目就舒服很多了,单纯的面向对象、面向过程,没那么多炫技的操作。[捂脸] 👍🏽0 💭四川 🕐2024-06-14 00:50:29
李大毛: 框架的好处是兜底下限,是工业化大规模开发的需要 👍🏽0 💭安徽 🕐2024-05-30 09:10:11
veqdy: 会不好写unit tests. 大部分所谓第二个impl就是mock 👍🏽0 💭四川 🕐2024-05-27 06:53:15
飞鸟球: [飙泪笑]我只有登录那里故意写了一个手机和电脑用两个impl处理,后来一些比较独立的功能交给我搞我都是直接一个service建锤子interface 👍🏽0 💭辽宁 🕐2024-05-17 10:17:30
永安坊的大蚂蚁: spring把可维护性和调试的难度提升了一个台阶,让更多程序员有了饭吃。这是好事啊! 👍🏽0 💭陕西 🕐2024-05-03 18:16:43
sxfreesky: 其实正是因为解耦才能把项目做大.因为程序员一般都是小坨小坨的拉.而不愿意一下子拉一巨大坨[捂脸].我们称之为强迫症[捂脸] 👍🏽0 💭四川 🕐2024-04-30 19:00:05
孙笑川: 框架是给对框架很熟悉的人用的,越熟悉开发越爽越快,不够熟悉你就自己达 👍🏽0 💭浙江 🕐2024-04-22 00:23:42
步子哥: 其实应该把逻辑写到脚本里,例如 Groovy。参考游戏引擎的成功经验,大部分游戏引擎的逻辑都是写在 脚本里面和关卡打包一起。 👍🏽0 💭上海 🕐2024-04-15 15:01:15
火锅底料: 不把代码写的复杂难懂,分分钟被裁员替代 👍🏽0 💭新加坡 🕐2024-04-13 12:29:26
│ └── takeGeneric: 原来裁员是tech leader打开git仓库一边blame一边对着裁啊,我还以为是hello world都不会写的HR裁呢 👍🏽0 💭江西 🕐2024-04-13 22:44:14
│ └── 火锅底料: 写得几个接手的人都看不懂那你原作者不就是 master shifu 了嘛,裁谁人家也不敢裁你。另外 @cmd5 不允许回复就不要回复别人,别不讲武得 👍🏽0 💭新加坡 🕐2024-04-13 22:59:20
随机播放123: 本来就是,后端有时候玩框架玩魔怔了为了上而上,而不问为什么 👍🏽0 💭上海 🕐2024-04-12 13:08:32
breezily: 不需要接口与impl,当有第二种实现的时候通过idea重构一个出来也是分分钟的事情。 👍🏽0 💭上海 🕐2024-02-06 12:54:53
Lajeas: 你可以发论文,看看计算机届的同仁们同不同意你的看法 👍🏽0 💭浙江 🕐2024-01-14 00:53:06
e熊u: …到项目下线也没有写第二个Impl。[捂脸] 这一句太赞了! 👍🏽0 💭广东 🕐2023-12-18 12:29:18
丢猫: [吃瓜]会读代码读到你想骂人 👍🏽0 💭新加坡 🕐2023-10-29 21:16:48
Rocky: 不需要多个实现 非写个接口的事情我是不会干的。确实存在很多基本代码复用做不到还要写各种接口的开发者。 👍🏽0 💭北京 🕐2023-06-23 07:48:52
dwangel: spring用接口 其实跟以前java代理技术不完善有关,后来 二进制级代理技术越来越稳定,加上ide提供了refactor抽取接口功能,真没必要一上来就接口和实现分离 👍🏽0 💭上海 🕐2023-06-08 23:35:08
手握绿宝书: 主要是易扩展性,项目一上规模。这种一把梭子的需求改动找起来简直要命。 👍🏽0 💭江苏 🕐2023-04-16 09:24:10
知乎用户c128zE: 渣子为了搏上位ppt+poc得到老板点头后就全公司推行不理你适不适用,多年后渣子拿到镀金跳槽留下一地鸡毛走回老路能笑死[飙泪笑] 👍🏽0 💭广东 🕐2023-04-15 01:17:53
millz-inspir: 只负责写,不负责升级维护的话!我就按你这样写! [捂脸][捂脸],内聚,是模块的内聚,模块相关的功能聚集在一起!不是代码的内聚呢!代码内聚的一个类2万行,里面动不动五层ifelse,类似功能不是重用,而是复制!还各种 字符串码值在眼前飘! 我对生活没有太高的要求,只求不要和你近同一个组,最起码,不要让我接你的代码![捂脸][捂脸] 👍🏽0 💭湖南 🕐2023-02-23 10:18:34
SHUAIS: Spring boot的自动化配置给我恶心坏了,xml年代,所有配置一目了然,现在一大堆注解像套娃一样 👍🏽0 💭广东 🕐2022-12-22 12:11:40
江浔: 没人拦着你从HTTP和JDBC开始手写全套 👍🏽0 💭上海 🕐2022-12-16 20:04:55
猜猜我是谁: 不这么玩,怎么去下一家更牛的公司[蹲] 👍🏽0 💭广东 🕐2022-12-02 15:38:23
单面打印王玄策: 不用框架你会发现:抢占市场懂不懂,明天必须上线,没事儿,听我的,小步迭代,大不了多发布几个版本,我不管,最迟周末必须上线,不要给我说技术,抢占不了市场的技术一文不值算了,毁灭吧 👍🏽0 💭青海 🕐2022-11-17 21:51:37
普通人: 用框架就是框住了自己[doge]简单的任务越简洁越好。春天batch内部还有不稳定的漏洞让我吃了亏 👍🏽0 💭广东 🕐2022-11-17 09:59:53
Right: 逻辑写在配置里可真的是太艹了,刚接手的项目没个一两周别想理清代码逻辑 👍🏽0 💭陕西 🕐2022-11-13 02:12:10
花拉子米: 老师说低耦合是为了以后扩展 👍🏽0 💭辽宁 🕐2022-11-12 17:09:14
日尔曼的夕阳: 一个功能非得一百种实现方法才肯罢休builder 模式注解模式,new 出来再set…有必要吗。一个最优失望 👍🏽0 💭浙江 🕐2022-11-12 10:25:45
横竖一体: 卧槽,我就是这么干的,我怎么讲不出来!公司一百多套系统,就是这么干的,我还没办法跟新来的同事交代的这么彻底…. 👍🏽0 💭上海 🕐2022-11-12 11:01:05
尼克学长: 这样说php就很有用了,简洁,但又说php简单,工作难度不够高,工资低[捂脸]有些问题确实人为创造难度,不是选择适合的。就几百个人用的,说以后业务大了,考虑性能,问题都熬不到都倒闭了。。。[捂脸] 👍🏽0 💭广西 🕐2022-11-12 14:12:58
骥云: 过度面向对象了 👍🏽0 💭上海 🕐2022-11-11 10:58:46
视线相接: 有些小应用脱离框架开发确实很爽。 👍🏽0 💭北京 🕐2022-11-11 15:28:43
知乎用户y4kfgc: 很多类似逻辑,确实用接口来抽象比较好。你当然可以部分地方用单例模式啊,没啥问题 👍🏽0 💭上海 🕐2022-11-10 21:34:08
一位hao人: 确实,深有感触 👍🏽0 💭湖北 🕐2022-11-10 22:55:37
Soap: 全部自己new,单元测试不太好做啊会不会?不容易mock数据 👍🏽0 💭澳大利亚 🕐2022-11-11 08:02:33
悬置枯野的园丁: 已反对 👍🏽0 💭上海 🕐2022-11-10 18:06:53
王大虾: 这样的话带来的代价就是代码可维护性可扩展性极差,后续开发成本越来越高,最后推倒重做 👍🏽0 💭北京 🕐2022-11-10 17:27:22
观密: 最后一句,再同意不过了。逻辑清晰,通俗易懂就是好代码。 👍🏽0 💭北京 🕐2022-11-08 23:06:49
沁兰沐风: 简直不能再赞同,很多时候,还是直接梭哈最舒服 👍🏽0 💭浙江 🕐2022-11-08 11:44:34
西伯利亚在逃土豆: 然后一个顾客进来点了一张椅子,整个应用就炸了?[doge] 👍🏽0 💭上海 🕐2022-11-08 18:50:00
PWhy: 如果是你自己一个人的项目那就是越简单越好,但如果是在大厂,那就是越复杂越好……因为人在在江湖能装X比能解决问题更重要[惊喜][惊喜] 👍🏽0 💭广东 🕐2022-11-08 01:42:07
Coldwind: 这就是一种病态的审美观,过度的设计,跟那些什么后现代的行为艺术差不多 👍🏽0 💭江苏 🕐2022-11-07 17:49:15
关心则乱: 现在的springboot不是很简单吗? 👍🏽0 💭广东 🕐2022-11-07 17:36:46
│ └── 两节课: 他的意思是好好的一个service为啥要写个接口,直接实现不好吗? 👍🏽1 💭北京 🕐2022-11-07 18:41:23
│ └── 嗯嗯: 按代码量算钱?[好奇] 👍🏽0 💭内蒙古 🕐2022-11-08 09:21:04
│ │ └── 两节课: 一帮理工直男癌晚期患者,对代码艺术的魔怔追求。 👍🏽0 💭北京 🕐2022-11-08 14:32:22
│ └── 千山我独行: 因为spring要搞很多动态代理增强bean,不写接口实现不来啊 👍🏽0 💭新加坡 🕐2023-11-20 00:31:45
│ └── 两节课: 简单用自然是麻烦,但是等他需要整个切面控制,比如数据库事务、自动缓存的时候就知道spring香了。 👍🏽0 💭河北 🕐2023-11-20 01:03:24
│ └── 千山我独行: 有人不明白何为“代价”,这些小脑瓜打死也想不通为什么Java/Spring的生态那么丰富完善,语言层面不付出点代价怎么行? 👍🏽0 💭新加坡 🕐2023-11-22 22:49:54
Elpie Kay: java已经进化到可以在注释里写代码了吗[捂脸]好消息是我不用写java代码,坏消息是我有时需要解析java代码[尴尬]看来以后再接到这种活还是提供个接口让java用户自己写解析逻辑吧[笑哭] 👍🏽0 💭江苏 🕐2022-11-07 00:24:01
│ └── Dion: 註解是 annotation,不是註釋 comment 👍🏽12 💭中国香港 🕐2022-11-07 00:46:32
│ │ └── Elpie Kay: 原来如此,是我浅薄了[笑哭] 👍🏽0 💭江苏 🕐2022-11-07 00:49:38
│ └── ayoux: 你真要在注释里写代码也不是不行 👍🏽0 💭广西 🕐2024-01-11 05:33:22
momo: 这咋感觉和go写业务的风格这么像[大笑] 👍🏽0 💭上海 🕐2022-11-07 09:29:06
xcc: cpp 这种没有di的 大家都怎么用的 👍🏽0 💭美国 🕐2022-11-06 18:34:23
│ └── xswl38600: 重新编译一遍[好奇] 👍🏽0 💭北京 🕐2022-11-06 18:57:21
│ └── Patpat: 有ad-hoc polymorphic就有di,cpp的di要做多的是办法。 👍🏽3 💭广东 🕐2022-11-06 20:49:00
快丶放开那御姐: 不用框架是很爽,感觉自己掌握全局。不过会写很多重复代码[捂脸] 👍🏽0 💭江苏 🕐2022-11-07 09:23:21
│ └── MadMax: 继承聚合甚至非面向对象语言的function不都是解决重复的办法么 👍🏽0 💭新加坡 🕐2022-11-07 09:36:23