Java 开发,你会过度设计吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
VoiceEXONE
V2EX    编程

ava 开发,你会过度设计吗

  •  
  •   VoiceEXONE 2023-03-30 18:03:51 +08:00 2205 次点击
    这是一个创建于 928 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    如果你学习过其他语言或者接触过其它语言的开发人员,你会发现 Java 开发人员好像更加倾向于过度设计。 也许是因为 Java 开发比较传统,也许是因为这是你的老师(教学视频、教学文档)教过你的。我在检查自己之前的代码的时候发现,尽管我尽量会在编写代码时不过度设计,但是总归会有许多不当的地方。 当然,你可能认为,你只是一个“初级”的开发人员,只有架构师才资格设计,所以只有他们才能承担过度工程的责任,对吗?恐怕并非如此,无数的开发人员一直都在这样做。在本文中,我将重点一个过度设计的症状,并将其扩展到其他方面。

    过度设计

    我在学生时期,我曾试图设计我的班级层次结构,并使其尽可能地可扩展,所以将它转换为由具体类实现的父接口。它们之间可能只有一个抽象类。像下面的图:

    avatar

    这看起来非常完美,构成了可扩展的层次结构,并且实现了面向接口编程。 在 Spring 的生态环境中,大量使用了类似这种形式的设计方案。例如 ViewResolver 接口,它具有丰富的子级层次结构和非常多的实现类。(例如:InternalResourceViewResolver 、VelocityLayoutViewResolver )。在框架的其他部分也有非常多的示例( beanFactory 、ApplicationContext )。

    但是,要明白的一些重点是:

    • Spring 在层次化的结构设计中组织了许多不同的子类。
    • Spring 是一个框架,框架的含义是可扩展,不可修改。

    在我们写过的大多数 Spring Web 程序中。找到我们定义的接口( Controller 、Service 、Dao ),会发现,大多数情况下,他们的实现类只有一个,而且可能会用 Impl 为后缀。如果接口位于 xyz 包中,那么实现类就会在 xyz.impl 包中,不知道大家会不会对与此种设计感到好奇?为什么要这样做?我们很难为接口的实现类提供一个相关的名称,因为实现类和接口之间没有语义上的区别,即实现类没有专门化接口。基于此得出的结论是:这种接口不是必须的。

    一些高级开发人员可能会说:“即便现在没有用,抽象设计在以后也有用!”。但是,为了将来的可能会有用这一点而在现在加入了一堆不必要的东西,只会浪费前期时间,而且对于大多数的 Web 程序来说,以后也不会有用。这种设计方法无疑与敏捷开发相冲突。

    当然,即使在以后真的有这种需求了,借助现代 IDE 的重构功能,也可以很方便的修改程序。

    早期的 Spring 动态代理只有 JDK 的动态代理,新版本的 Spring 早已经支持了 cglib 代理方式,所以创建一个接口只是为了可以实现动态代理这方面也是不成立的。

    结论

    如果有人说我设计接口就是为了未来做准备,那我我就非要说你这是过度设计。

    无用的接口只是过度设计的一个方面,另外的许许多多方面都有过度设计的影子,这是 Java 开发的特性,无法改变。

    过度设计是认知过程中的必经阶段,用什么语言都一样?

    6 条回复    2023-04-01 16:28:16 +08:00
    7911364440
        1
    7911364440  
       2023-03-30 18:48:52 +08:00
    如果只是 CRUD 的话确实没必要写接口,但是如果项目中所有 service 都是一个接口一个实现类,你写不写接口?
    接口也不是你说的那么一无是处,对于可配置和拓展性有要求的项目没有接口还真不行。
    watzds
        2
    watzds  
       2023-03-30 18:55:45 +08:00
    八股文而已,不是根据实际需要来的
    Bazingal
        3
    Bazingal  
       2023-03-30 19:01:54 +08:00
    能用一层解决的就用一层,将来需要了再重构,当然如果是给第三方用的另说,这种情况就要提前考虑好
    Ericcccccccc
        4
    Ericcccccccc  
       2023-03-30 19:12:51 +08:00
    我现在在改一个项目, 是 go 写的, 所有的东西都是 interface 结构.
    VoiceEXONE
        5
    VoiceEXONE  
    OP
       2023-03-30 19:2658 +08:00
    @7911364440
    @watzds
    @Bazingal
    @Ericcccccccc
    关键的就是过度设计会慢慢变成习惯;曾重构一个项目,业务服务基本就跟所有设计模式组合一样,慢慢就会陷入其中,变得为了设计而设计,习惯就会让你在动手去做的时候不停的在脑海重演各种设计思路,推翻再重来;之后细想重构是一个系统的必经之路,没必要太较真
    bytesmith
        6
    bytesmith  
       2023-04-01 16:28:16 +08:00 via iPhone
    没有银弹,都是在不断的改进而已
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3067 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 12:51 PVG 20:51 LAX 05:51 JFK 08:51
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86