来源:zhihu.com/question/58410621/answer/156868800为什么我们需要好的代码结构好的代码结构不仅仅是为了清晰,它更像是我们对一个系统的拆装。一个好的代码结构可以让你在遇到代码交接不合理的情况下,减少拿刀砍人的可能性。好的代码结构可以让多人更容易协作开发,而不是天涯海角缠绵,然后相爱相杀。我们经常将糟糕的代码结构描述为狗屎。我们称它为一坨屎,老实说,没有比shit更好的词来形容我在接管糟糕的代码后的感受了。“屎”代表混沌、一团、各种杂质。接手一堆烂代码,就像用一堆屎吸沙子。有时候我们也用一团毛线来描述代码,大概是这样的。是的,这种感觉绝对没有错。而我们要做的,就是要把这团毛线,变得像瑞士军刀一样清晰。你觉得哪个更有成就感?二什么是好的结构一个好的结构应该保持职责单一。一个好的结构应该是通用的。一个好的结构应该被很好地定义。这其实就是所谓脚手架提供的最大价值。一般来说,Java、Android、IOS都有一个清晰的框架体系。.他们开始了战斗。喜欢。..他们是一样的。喷火的,喷水的,大家分工明确。三、每个分类的含义是什么?1.ModelModel是一个模型。一般来说,有些人会把它分成更细的类别,比如VO,DTO等等。我不建议让它更详细。这个Model往往对应的是持久化数据,比如Mysql、MongoDB。Model承载的作用是对数据的抽象,描述了一个数据的定义,Model的实例就是一组数据。整个系统可以看作是数据的流动。既然要流量,就必须有流量的载体。红色圆圈标记模型。应该是纯数据的集合,也就是被各种东西传递和处理的数据组。通常有很多模型,一个业务流对应一个或多个数据流。以知乎为例。一篇文章就是一个Model,一般称为Article,包括Title、Summary、Author、Content等。Comment也是一个Model,一般称为Comment,包括Content、userID等。对于初学者来说,首先要学习的是建模,将业务逻辑映射到数据模型中。2.UtilUtil是工具的意思。一般来说,它常用于描述与业务逻辑无关的数据处理。Util一般是和私有方法比较:私有方法一般只在特殊场景下使用,私有方法越多代码结构越乱。一种常见的重构策略是先从行数较多的代码中抽象出几个私有方法,然后再抽取公共Util。如果可能的话,尽量少用私有方法,而是用一个公共的Util代替,这意味着它与业务逻辑无关。通常名字还有ArticleUtil,CommentUtil之类的。就这样打包吧,不管是充气娃娃还是别的什么的,就打包吧。你可以理解为图中的黑衣人是一个Util。在一定程度上,也会和Service有些接近。但一般来说,Service包含业务逻辑,很少能进行单元测试。一般来说,Util就是一个明确的输入,一个明确的输出结果。在单元测试中,大部分也是在测试Util。积累自己的Util是一件很重要的事情。3ServiceService比Util的概念大很多,它的重点是提供一个服务。这个服务可能包括一系列的数据处理,也可能调用多个Utils,或者调用其他服务。一句话,就是有什么事,你来找我。就像这张照片中的姐姐一样,她是一个服务。她能提供什么样的服务?这必须被定义。如果是洗脚,她会给你脱鞋,用盆烫脚。在这里,你的脚就是一个模型,盆里的水就相当于Util,不管往里面放什么都能烫到。帮助您脱鞋可以是服务、私人功能或Util。就看你是让这个小姐姐给你脱,还是让另一个小姐姐给你脱,还是自动脱鞋机。如果你自动取下它。..意思就是如果你给Model加上功能,你脚下的不是纯数据模型,而是包含业务功能的血腥模型。不是很好。老老实实请小妹帮你穿拖鞋不是很好吗?4.一般来说,DaoDao是用来和底层数据库通信的,负责数据库的增删改查。是的。他是道。他从不关心货物的去向,他只关心。入站、出站、查询和更换。所谓CRUD就是create,read,update,delete。最好是独立的。到目前为止,最佳实践是一个Service只对应一个Dao。服务会做一些额外的检查,比如货物是否损坏,签收是否完整等等。我不推荐在一个Service中调用多个Daos,我也推荐在一个Service中调用多个Service。在大多数情况下,我不建议这样做。具体原因以后再说,这也是一个开放的话题。现在我们把Model、Util、Service、Dao区分开来了,但是谁来做整体的调度呢?5.控制器控制中心,所有的指令和调度都是从这里发出的。哪个Service做什么,谁的数据提供给谁,一般来说,都是在Controller中实现的。Controller也是最容易产生脏代码的地方。通常他们会把一些不该放的东西放到Controller里面。大概就是这种感觉吧。你在干什么?想一想,如果小打针、抽血、验尿都在门诊大厅里混在一起,会是什么感觉?但这就是大多数人编写代码的方式。4、是否适用于WEB、Android和IOS?Java后台结构非常清晰。毕竟在JSP中写Sql语句的狂野时代已经过去了。Android本身就是一个很好的框架系统,基本上没有太大的问题,最多的就是MVP和MVC的区别。虽然IOS官方并没有提供这样的框架体系,但是特别是很多人喜欢直接在Dict中使用key取数据,这本身就破坏了代码的层次结构。不过毕竟有李明杰提供的Json分析工具,只是各家公司需要的实力而已。最难理解的是WEB,也就是JS。我不是在黑JS,我是在黑JS程序员。层次结构从来都不是JS社区最重要的东西,尤其是在JQuery时代。不管是Html、JS还是CSS,混在一起很正常。当时叫插件,现在改名为组件。你很难在JQuery中找到一个清晰的层次结构,就像十几年前大家在Jsp中写逻辑语句的原因一样。直到谷歌大神偶尔走过来看看,嗯?你怎么还在刀耕火种?让我为您添加一些现代的东西。于是Angular横空出世,一时间构建了清晰的框架结构。每次看到Angular都忍不住惊叹,原来前端代码也可以做到!这就是它的感觉。..现在基本上可以分为两个阵营,一个是React和Vue,一个是Angular。React和Vue更可插拔,哦不,组件化。所以他们需要便宜的桶来拼接整个前端架构体系。Angular是典型的Java架构风格,妥妥的硬汉。所以,其实这个系统也可以在WEB上应用,就像Android和IOS一样,但是你喜欢不喜欢,你可以自己选择。5为了进一步学习,是否要学习系统架构?是的。要进一步学习,而不仅仅是学习系统架构。没有提到服务之间的服务设计、相互调用、解耦、通信和管理。消息队列这个神器还没有出现,也没有像MongoDB这样的战略堡垒。因此,以上内容仅适用于2年以内的各类工程师。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!
