请教关于项目结构、编码技巧的一堆问题,或求类似的能够帮助我的书籍,谢谢 QAQ

本贴最后更新于 2893 天前,其中的信息可能已经事过境迁

想请教各位大佬自己在做项目过程中的很多问题。
自己以前在大学学 java 非常随意,基本都没怎么看过别人的代码。一直自己学自己的,做自己的,全都是挑自己喜欢的去学去用,不喜欢的基本抛一边不管了,以前不喜欢 web 开发,所以学 java 完全在搞些其他东西,比如拿 java 写小游戏,扫雷什么的(是不是很奇葩?哈哈),同学学 java 很多是做业务逻辑,调用 api,我就不想,我偏要自己去实现这些 api,自己写数据结构和一些算法。喵了个咪的,然后就是一堆 java 的 api 不会,自己写的又因为各种水平关系,垃圾得一比,反正就是自己对 java 的认识以前一直不是很正常,前段时间看了一下别人的经验才知道应该拿什么样的态度去 java 和 c\c++ 这两种语言,虽然他们感觉好像都差不多,java 还比 c\c++ 简单很多。但是实际上是关注层面不同罢了。
扯远了,总之自己对 java 的认识刚纠正过来就快要实习了= =。
结果刚工作...在公司就遇到了总监总是让我一个人做项目,或者是让我一个菜鸟领着几个更菜的菜鸟写代码。
写出来的项目感觉结构好差..自己都看不下去那种。
所以诚心想要请教各位一个关于项目结构设计和编码技巧方面的东西。希望各位大佬能够分享分享自己的一些经验,
谢谢各位了 QAQ。

举个例子:

比如我现在遇到的一个情况,目前在用 spring boot+react 这种前后端结构,做 restful 风格。
当前端需要 json 数据,数据库存储的某个字段是用数字表示一种状态,
比如 0 代表未发放,1 代表发放成功,2 代表发放失败。
我应该在前段进行这种数字到字符串的转换还是在后端去做。我现在想到的是在后端做,
因为我想前端尽量只控制简单的页面逻辑,数据处理全部在后端。然后我在后端就写成了这种形式:
7512981645314bf299585edbff1031c3-YAH6XPRIVAUJEXESBW8.png
,然后在字段的 getter 方法中根据值来进行各种映射:
a24f6a2913db43fdbe81ada2b94f051b-XL6873L8D4U59B6K.png
。这样的解决方案可行吗?有没有更好的解决方案?或者说还是由前端来进行转换?
或者说有什么好的优化方式?我感觉自己对这些东西没有什么好的办法

还有

比如说一个前端提交的添加的一个商品保存到数据库,但是呢,表单的数据肯定是不完整的,我们应该在服务端
最这个商品进行默认的字段填充,应该放在 controller 中还是 service 中?还有商品的数据肯定不可能只对应一个表。
比如商品的一些预览图片会将其 URL 地址存储在另一个表中,并与商品进行关联,
这种情况,应该写一个商品 service(GoodsService)和一个图片 service(ImgService),
我应该在 controller 中调用两个 service 的插入方法还是说我在 GoodsService 中调用 ImgService 的插入方法?怎么处理最好?

然后就是对于错误处理,比如 service 中的插入方法,然后限定的商品名不能相同,我应该在 service 中进行判断还是在 controller 中进行判断?如果是 service 中,那么出错原因我应该怎么发送给前台?通过 throw 一个 exception,然后使用统一异常处理(我查了一下,好像都建议能不用异常就不用异常)?还是说让 service 返回一个值,然后 controller 去接收?那么我应该返回什么值?多种错误呢?没法区分啊。

感觉自己很迷茫

好想抽时间看看大神的代码,但是从仅公司到现在,差不多半年了吧。。天天加班到两三点。。。根本没时间啊,计划年假看 hackpai 的源码,希望能够学到很多的解决方式帮助自己解决很多的问题。希望大佬们也能分享一些看源码的建议,真的有点迷茫。

再次谢谢大家了

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    943 引用 • 1460 回帖 • 3 关注
  • 编程技巧
    2 引用 • 28 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • Angonger

    个人认为编程不是某本书,或者某个人指点一下就能 OK 的。项目结构完全可以参考一下开源的比较好的项目的结构。你举得例子其实不是个事儿,在我们公司因为框架的原因吧,前端和后端沟通成本比较大,所以数据的哪怕在页面处理,也要后端来搞。其实这种情况开始把数据结构什么的设计好了,约定好了不是问题。你说的 Service,搞个 BaseService 实现通用的,有特殊的再扩展别的 Service 吧。特别细节的反应异常是需要成本的,做些全局的异常提示可以么。至于加班问题,是个很大的问题 😂 我也遇到了,解决不了,换工作吧

    1 回复
  • 88250

    具体情况具体分析:

    1. 文案这个可以搞个配置文件,key 上面加状态码
    2. Service 层主要是进行事务封装,一个 service 方法要做到对于一个完整业务事务以保证一致性。
    3. 异常和返回码是两种编程范式,我一般是混用,Java 中大部分用异常,golang 用返回码。文案的问题最好也在 service 里面解决。

    设计方面保持 MVC 风格就行,不用纠结,赶紧实现业务才是正经的 😅

    PS 是 hacpai,不是 hackpai

    3 回复
  • Angonger

    我忘了纠正他了……

  • yangyujiao

    感觉你现在做的,就跟我刚进入的一个项目功能差不多。

    1. 我一般直接返回状态码,前端去显示文字。
    2. 一般的逻辑都是在 ctrl 处理的,service 主要就是数据库方面的,因为涉及到事务。
    3. 我们用 throws 比较多,写了一个共同的异常处理。

    我们用的就是 spring-boot 前端用的啥我不太清楚。反正是前后端分离的,我做服务端了。
    我工作都好几年了,你的这些迷茫我也会有,但是主要框架一般不是我搭,然后别人搭好了,我就用,所以很多问题,不需要我去处理。

    2 回复
  • 88250

    不知不觉,饺子也工作好几年了..

  • alanfans

    github 上有成品的 demo,当然也有 hacpai,上面有很多值的学习的东西(代码上的东西多些)。

  • alanfans

    看了半天,ide 的代码背景是亮点

    1 回复
  • yourShitCode

    这个问题本身没有答案 实现需求才是领导看中的能力 . 想要快速提高 建议做个有人盯着的项目 比如说一个人撸一个商城系统出来. 然后在过程中不断的学习你觉得牛逼的技术 并应用到其上 然后就一直滚雪球吧

    1 回复
  • wuhongxu
    作者

    恩,我的想法也是看开源项目,我只是想请教有没有这方面的书而已。那求一个结构好点的开源项目参考参考,我目前参考的项目自有黑客派和猫宁商城(感觉猫宁结构比较一般)

  • Eddie

    Patterns of Enterprise Application Architecture 我觉得这本书是神作
    如果你真想做有个高大上的系统的话,其实你可以了解一下 领域模型驱动设计
    但是我觉得只要做好 mvc 就差不多了。因为时间一般都是很紧的。
    1:我其实的话会返回状态码,而且都会送有结果描述,但是一般前端都会根据自己的情况修改他显示给用户的信息。
    2:如果在 contr 里面填充默认数据的话是否就影响了业务逻辑的判断??假如很多的 contr 都用到了这一类型的数据,那你岂不是每个都要填充默认数据一次??而去填充默认数据的话是跟数据库的字段的是否非空联系起来的。越靠近数据读写的方法越好。。。
    3:还是搞个同一异常处理吧。

    1 回复
  • wuhongxu
    作者

    文案我已经搞了配置文件,819d04a982394e20b4d1c84954804ca8.png

    ,我在 service 中就是想要确保完成一个完整的业务逻辑,但是我目前就是不太清楚,系统给实体添加属性属于哪一块?我看到的 hacpai 的结构里面,controller 也有,service 中也有,怎么区分?我现在就是摸不到这块分界线,想找一个好点的完整的结构

    1 回复
  • wuhongxu
    作者

    kacpai 是我的锅,我的天啦噜,我一直写的 hackpai,QAQ

  • 88250

    我的观点是不区分..

    1 回复
  • wuhongxu
    作者

    我目前是这样,在 service 中使用的抛异常的方式,但是我目前还是在 service 中处理很多的逻辑,因为有这样的问题,我想要尽量使用一次操作只用一个 sql 去完成,特别是查询,这样的代码结构就是 controller 只需要调用 service,service 完成默认操作调用一下 mapper(也就是 dao),然后 dao 中完成数据库操作。刚开始还可以,但是很多时候的业务逻辑并不能简单的一个 sql 就完成,需要联合其他的 service,然后就出现了代码结构混乱的问题

  • wuhongxu
    作者

    动漫宅,见谅见谅,哈哈

  • wuhongxu
    作者

    我目前就是这样,所以我需要花费很多的时间去做,我做项目都是一直在努力寻找新的技术= =,目前也算是学到了很多的东西,毕竟想学东西,不想仅仅局限于一些老本

    1 回复
  • yourShitCode

    就是就是 多写才是硬道理 写代码 眼界还是需要的

    1 回复
  • alanfans

    书啊?推荐《代码大全》吧,(超级无敌厚)

    1 回复
  • wuhongxu
    作者

    1、但是我觉得返回状态码给前段的话,很多的文案不好管理。
    2、你的意思是什么?应该更多的使用数据库默认值,或者在 service 中进行默认值封装?
    3、我有统一异常处理,自己也定义了几个异常事件6b8183356b05413d89f5e9c39d1ee0d2.png
    9c6ba1bbc4534a0a9c53dbd45c64cd4f.png

    1 回复
  • meikaiyipian

    我们 Service 中是统一返回一个 Message 封装类,里面有成功或失败 success,信息 msg,结果 result,很少用异常的方式

    处理数据设置属性之类的,基本在 service controller 都有涉及,不怎么区分,不过主要是在 service 调用其他 service,确保一个业务的完整

    编码规范什么的可以搜一下各大公司的内部规范,好像前段日子有人在论坛上发表了阿里的 JAVA 规范

    或者可以看下 官方的 demo,好像有个商店的 demo,忘了

    总之适合自己的就是好的,多写多练习吧,共勉~

    1 回复
  • wuhongxu
    作者

    不区分会很乱吧 QAQ,我现在就感觉很乱,对不起,我有点强迫症,看不得乱的

  • wuhongxu
    作者

    恩恩,哈哈,共勉共勉

  • wuhongxu
    作者

    哦哦,嗦嘎,其实我一直有这个的 pdf,但是我一直觉得看 pdf 有点看不进去,想要实体书,但是又穷,不知道买哪本 QAQ,代码大全我收下了,哈哈

  • wuhongxu
    作者

    哦,这种 message 好像很可取,对哈,我特么自己把自己搞昏了,我封装的 message 都能在 controller 中返回给前端用,为啥不能 service 中返回给 controller 用,不错不错,学到了,共勉~

  • Eddie

    1 前端显示啥,文案是啥?你这干后端的艹什么心,你又不需要编写前端的代码。
    2 到达 control 的数据越真实越好。。
    3 这个没有啥的,有空就自定义的处理,没有就写个全局的吧

    2 回复
  • wuhongxu
    作者

    我是前后端全包的哈~
    越真实越好什么意思?也就是说 controller 之前尽量不做更多的封装操作吗?

  • Angonger

    每次前端出的东西为了数据交互我都需要大改,怎么不操心这个

    1 回复
  • Eddie

    。。。。

请输入回帖内容 ...