1.å¦ä½è¯ä»·Marsèå¸çJava4Android
2.delphi源码,计件三层源码中间件
3.请问,工厂ERP软件哪个好哪个比较好一些?
4.Java开发规范:关于提高开发体验的源码源码分享记录
å¦ä½è¯ä»·Marsèå¸çJava4Android
ä½ä¸ºæå¸ï¼è·è®¡ä»¶å·¥ä½ä¸åï¼ä¸è½ç¨å¹å »å¤å°å¦ç为è¯ä»·æ åï¼å ä¸ºä½ å¹å »å¤å°å¦çï¼æ¯å¦æ ¡çå®æï¼ä¸æ¯åååé£æ ·ï¼æ人æ¾ä¸é¨æ¥ï¼æéåªè¦ææºä¸åå¹²èå°±å¯ä»¥äºï¼èæ¯ç±å¦æ ¡æçï¼åæç级ï¼ç¶åç»ä½ 派任å¡ï¼è®©ä½ å»å®æãå¦æä½ çç级åºäºä¸ªå¤§æåï¼é£æ好å ä½èå¸è¸ä¸æå ï¼å ä¸ºä½ çç级ä¸å®ä¸æ¢ä½ ä¸ä¸ªäººï¼èæåçå¹å »ââå¦æä»/她确å®æ¯ä½ 们å¹å »åºæ¥çââä¸å®æ¯éä½å³å¨çç»æ¶ï¼è·ä½ æå ³ç³»ï¼ä½ä¸å¿ 大å 大æ½ã é£ä¹ï¼ç¨å·¥ä½éæ¥å计ç®å¦ä½ï¼ä¹ä¸è¡ãè¿æ¯ä¸è¿°åå ï¼ä½ çå·¥ä½æ¯é¢å¯¼åé çï¼å·¥ä½å¤å°ï¼å¾å¾æ¯ä½ èªå·±é¾ä»¥å¹²æ¶çãï¼å½ç¶ï¼æ¶ä¸ç大å¦æå¸ä¸ï¼å¤æ°å·²ç»ä¸ææå¦å·¥ä½å½æèªå·±ç主è¦å·¥ä½äºï¼å°½éå°ä¸è¯¾ï¼å¤å¨å®¶éå¹²ç§ç ï¼æè å«çä»ä¹äºæ ãä½æ¯ï¼è¿æ¯å¯ä»¥å¼å¯¼çãï¼åæ¶ï¼å¹²çå·¥ä½æ°éå¤çï¼ä¸è§å¾æ¯å¥½èå¸ï¼ç¸åï¼å¹²çå°çï¼ä¸è§å¾ä¸åå¦ç欢è¿ã é£ä¹ï¼çä¸ä¸ªèå¸åå¦ç欢è¿çæ åµæ¥å®å§ï¼æè§å¾å°¤å ¶ä¸è¡ãä¸åï¼å¦ççç¼å å趣å³æ¯å 个人ææ个éä½èä¸åçï¼æ们å¾é¾ç¸ä¿¡ï¼è¿ä¸ªä¸ªäººæéä½å°±æ¯ç»å¯¹çå ¬å¹³çãæ¯å¦ï¼ä¸ä½èå¸ä¸è¯¾ç¬è¯å£°å§ï¼é£ä¸å®æ¯å欢è¿çï¼ä½æ¯æªå¿ æå 容ï¼å½ç¶ï¼å¤æ°ä¸è¯¾æ´»è·çï¼å 容ä¹å å®ï¼ï¼ç¸åï¼æçèå¸ä¹ æ¯äºä¸æ¿ä¸ç¼ï¼å¤´å¤´æ¯éï¼è¿æ ·çèå¸ææ¶æ¯ä¸å欢è¿çãå°¤å ¶æ¯é£äºä¸å¤ªæä¹æ ·çå¦æ ¡ï¼ä¸è¦ç¸ä¿¡å¦ççç¼å ã åç大å¦çå¦çæ¯å¦å°±å¯ä»¥ä¿¡èµå¢ï¼æ认为æ£ç¸åãä¹æ以è½èä¸åç大å¦ï¼å¹¶ä¸æ¯ç±äºä»/å¥¹å ·æç¬å°çç¼å ï¼èèä¸åçä¹åï¼ç±äºäºèå¿ã人äºå ³ç³»çååçåå ï¼å¦ççå¿çä¹ä¼åå°å½±åãä»ä»¬å¾é¾ä»¥å¾å®¢è§çç¼å å»çèå¸ãåæ¶ï¼è¿äºå©åæ»çæ¥è®²è·ä¸è¬å¦æ ¡çå¦çï¼çè³æ¯å¾å·®å¦æ ¡çå¦ç没ææ¬è´¨å·®å«ââæ们常常æ个认è¯ï¼çéæé¾ç¢ç£¨çæ¯ä¸¤å¤´ï¼æå·®çåæ好çï¼ä»ä»¬å ·æåæ ·çåå±è½¨è¿¹ï¼å æ¤ï¼å¦æä½ ä¸ç¸ä¿¡å·®çï¼ä¹æ好åæ ·ä¸å¿ ç¸ä¿¡å¥½çã æé¾ç¢ç£¨çå°±æ¯å¤å½çå¦çï¼ç°å¨æ们åºæ¬ä¸ææ大å¦é½æçå¦çï¼ä»ä»¬æ¥èªåç§å½å®¶ï¼å¨åç§æåä¸çé¿ï¼å¯¹äºç»èå¸æåçäºæ ï¼ä»ä»¬çååºççæ¯äºè±å «é¨ãä½ä¸ç®¡æä¹è¯´ï¼æ»çæ¥è®²ï¼æä¸ç§æ åµï¼ä¸æ¯å¥½å¥½åï¼ä¸ç®¡è¿ä¸ªèå¸æä¹æ ·ï¼æ»è¦ç»é¢åï¼æé«åï¼äºæ¯è®¤çåï¼è¦åæèªå·±ççæ³ï¼èä¸ç¸ä¿¡è¿ç§çæ³ä¼çå®å°åæ å°æ ¡é¿é£éå»ãå ³é®æ¯ï¼ä»/她ç¸ä¿¡èªå·±çæåä¸å®æ¯æ客è§çï¼ä¸å®¹è®¸å«äººè¯´ä¸éåãæ以ï¼è¿äºäººï¼è¦ä¹æåå¾å®¢è§ï¼è¦ä¹ææ°ç¨äºä½æ»ä¸ææ¹ã常常åç°æåå¦å¦ï¼èå¸ï¼ææåå¦ç»ä½ æäºæä½åï¼çè³æçé¶åãä½ å»çé£ä½åå¦ï¼æ£æ¯ä½ ç¹å«æ¬£èµçï¼ä½ä¸ç¥éä»ä¹æ¶åï¼ä»ä¹ä¸è¥¿ï¼è®©ä»/她æå°ä¸ç½äºãä¸æ¯æçµçåï¼ççèå¸é£éé½ä¸å¥½ï¼æå¾å¤ç¼ºç¹ï¼ææçï¼æ以ï¼ç¦»çæ³ä¸çèå¸çæ åå·®å¾å¾è¿ãè¿ç§äººä¹å¾å¤ã ä¸è¬æ¥è®²ï¼ä¸å½å¦ççæåç¸å¯¹éä¸ä¸äºï¼ä¸è¬æä½åä¹è½è®©èå¸è¿å¾å»ï¼å³ä¾¿æ个ææªè¯çåå¦ï¼å¨ä¸ä¸ªçéä¹å°±æ¯ä¸ä¸¤ä¸ªï¼èçå¦çåå¦ï¼ä»ä»¬å¸¸å¸¸æå¤ä¸ªåå¦ååºå¤±å¸¸ï¼èè¿äºæ¶å¸¸çåå¦å常常ç»ä½ çåè®©ä½ å¾è·ç¼éã å¦çæåï¼å¯¹èå¸çå¯ä½ç¨å¾å¤§ï¼æçèå¸ä¸ºäºå¾å°é«åï¼å¯¹å¦çè½¯ç¡¬å ¼æ½ãæ¯å¦ï¼æçèå¸è¯·å¦çåé¥ï¼ç»å¦ç礼ç©ï¼ä¹°å¥½å¦çï¼æçååè¯å¦çï¼ä½ é¨çåå¹´é½å¨æçææ¡ä¹ä¸ï¼å¦æä¸å¥½å¥½è¡¨ç°ï¼é£ä¹æä½ ä»¬å¥½ççãç»æå½ç¶ä¸æ¯é½è§æï¼ä½æ¯åªè¦ä¸ç§æ¹æ³å¿ ç¶å¼å¯¼åºå¥æªçææ°ï¼é£ä¸å®æé®é¢ã ç°å¨å¸¸å¸¸å®æ½çèæ ¸åæ³æ¯å¦æ¯å½å ï¼æ ¸å¿æåçæç« æ°éââè´¨éé½ä¸è®²ãææ¶å讲质éï¼å°±æ¿ç¤¾ä¼ååºè¯´äºââä½ æ人ç»ä½ ååï¼åªææ¯éªä½ çè¯ï¼é½ç®æ°åï¼ä½ ææ¿å°å¥éåï¼åªæä½ çå¥éæ¯è´¿èµçè§ä¸å¾äººçæ¹å¼åå¾çãä½ æ项ç®åï¼åªæä½ ç项ç®æ¯ä½ ç导å¸éè¿æç§ä¸æ¿å çéå¾è·å¾çãè¿æ ·çåææ¯ï¼å¾å°å¥½å¤ç人ï¼ä»ç好å¤ä¼ç»§ç»éæ¥ï¼å¾ä¸å°å¥½å¤ç人ï¼ä¸æ¬¡å¥½å¤ä¹ç¦»ä½ å¾è¿ãæç« çå表ä¹æ¯ï¼ä½ å表è¿æ ¸å¿äºï¼ä¸ä¸æ¬¡å°±å¥½ä¸äºãï¼å¦æ没å表è¿ï¼å«äººé½æ²¡è§è¿çä½ çå头ï¼é£ä½ å°±æ»æå§ï¼ ä¸èæ¯å¦ä¸ä¸ªç¡¬å¤´è´§ï¼ä½æ¯æ¶ä¸åºé±å°±åºççäºæ ä¸åå°æ°ï¼ä»è½å¤ä¿è¯è´¨éåï¼ ä»ä¹åæ³æ¯æ好çââä¸è¦è¯´æ好çï¼å 为è¿æ²¡æ好çââå¯è¡çï¼æè¿æ³ä¸åºæ¥ãå¦ææçæ³çå¦è æ¥ä¸»æå ¬éï¼é£ä¹ï¼å¦è èªå·±çè¯ä»·æ¯æ好çãä½æ¯ï¼éè¡å¦éå±±ï¼ç°å¨çå¦æ¯å°±æ¯è¿æ ·ï¼å¦æä¸å®¶çå¦æ¯éå¾å¤ªè¿ï¼å¾é¾è¯´ä¸è¯ï¼å¦ææ¯ä¸ªä¸ä¸çæ¯ä¸ªé¨åé½è®¾ä¸å®¶ï¼é£å¾é¾ä¿è¯ä¸å®¶çå ¬è¯ã人å¿æ¯å¯ä»¥ååçï¼ä¹æ¯å¾é¾ç¢ç£¨çãç®åçç¶åµæ¯ï¼æ²¡æåæ³ã
delphi源码,三层源码中间件
这套Delphi源码设计用于企业级应用系统开发,如ERP、分享MES、平台HRMS和库存管理系统,计件相较于常规中间件,源码源码源码代码查询它具有更丰富的分享功能和更直观的开发体验。对于需要处理高并发、平台跨平台、计件高效实时系统的源码源码开发者,可能需要自行优化。分享该框架不依赖第三方控件,平台以简单明了的计件方式封装常用功能,注重实用而非复杂技术。源码源码
开发环境方面,分享原基于Delphi ,已升级至Delphi ,采用DataSnap架构。服务器使用SQLite存储配置参数,客户端使用MS SQL数据库,并结合DevExpress VCL和FastReport控件。
服务端部分,专注于功能实现而非图形展示,而客户端则是一个针对制造业的MES系统,核心功能包括计件工资计算、产量分析和生产进度跟踪。此外,还有一个Java版APP和H5手机端应用,用于数据上报和查询,但并未包含在公开分享的源码400nk内容中,如有需要,可单独联系获取。
请问,工厂ERP软件哪个好哪个比较好一些?
工厂需要什么样的管理软件,如何引入ERP生产管理系统,主要有哪些功能,能解决什么管理问题?相信这是正在选型中的制造业老板都想了解的问题。
带着这些问题,我们一起深入探讨一下制造业如何通过管理系统,打造数字化工厂,实现智能化管理!
我们以实际案例来阐述,中之杰公司服务的一家中小型制造企业-苏州良浦。该企业主营砂加气混凝土砌块、灰加气混凝土砌块、五金、设备、油品等。伴随着他们企业的快速发展,传统管理模式下的各类弊端展露无遗。随着公司业务量的增长,车间管理人员发现,每日生产、销售、库存、财务等数据无法及时汇总,且采用手工统计,不仅效率低下,还容易出错。返回顶部代码源码在生产环节上,无法有效控制产品的生产、库存和发货,容易造成大量成本浪费。而良浦这家企业的产品又多是非标定制化,产品的库存库位管理极度复杂,如果无法精准定位产品及物料的库存位置,那么,要找某个产品就非常困难。
良浦的信息化负责人曾经告诉我们,有一次他们要找一块板(水泥板墙),他们十几个人在六万平方米的露天仓库找了一天没有找到,由于赶时间,重新生产了一块,结果几天后又在某个角落里找到了这块板,实在是让他们哭笑不得。这不仅使工作效率下降,还造成成本的增加。以小见大,企业的管理问题都是在这种细节中体现出不足,然而,激烈竞争之下,企业抢占的就是1%的效率和价格差异。
所以,企业到底应该如何使工厂管理进入数字化阶段呢?中之杰专家认为,靠单一的企业管理系统只能解决部分问题,并不能从根本上扭转局面。在良浦公司的项目上,中之杰的自编CYS无穷源码项目服务团队通过详细的需求调研,对良浦现有业务流程进行了重新梳理,确定项目范围后,为良浦量身打造了一套数字化转型解决方案。
通过ERP+MES的集成性数字化解决方案,结合条码等智能终端硬件设备,在经过一年多的运营后,良浦各方面的效率得到了大幅提升。能够实时反馈生产数据,结合数据报表,批量打印每块产品的检验表格,减少了每月将近张表格的制表工作,统计室员工由原来的8人减少为3人,而且数据准确性也提升到%以上。通过PDA实时扫码入库,实现了实时的产品出入库,满足了库存精准定位的需求,大幅减少仓管人员的工作量。而且,在库存积压这一块得到了根本性的解决,仓管人员告诉我们,现在他们库存里的积压还是在使用ERP+MES系统之前的积压,上系统后都是按单采购,按单生产,基本零库存积压。
我们总结一下,管理工厂生产环节,需要根据公司具体业务和管理流程的需求,且需要一套ERP+MES系统的集成解决方案,从产品、课程培训系统源码业务、执行和管理上全面实现数字化。这样你的生产管理问题就不再存在啦!
Java开发规范:关于提高开发体验的分享记录
前言
大家有没有想过程序员为什么这么累,其实作为一个程序员对于个人来说,技术很重要,但是对于工作来说,编码的习惯比技术更加主要。工作中你面试的大部分技术都不需要用到的。工作中,因为你的编码习惯不好,写的代码质量差,代码冗余重复多,很多无关的代码和业务代码搅在一起,导致了你疲于奔命应付各种问题。
良好的编码习惯加上各种开源的工具可以是提高我们的生产效率,减少很多不必要的加班时间。衡量一个开发人员的产出、质量和效率不是流水线一样计计件越多越好,在我看来有以下几点
可阅读性(团队开发,高效协作)
可拓展性(面对需求更变,高效开发)
健硕性(少点BUG,就算出了BUG更容易定位问题)
本次会议的目标改善大家编码习惯,提高代码可读性与开发效率,降低维护与问题定位的成本
使用开源框架降低不必要的重复造轮子时间
编码规范装一个代码规范插件首先推荐装一个阿里的插件:alibaba-java-coding-guidelines,可以帮你更正很多不健康的写法
POJO类命名规范概念:像DTO、Entity等业务对象统称POJO
关于对象类的后缀,业界没有一个硬性统一,只要做到好理解,同一个项目规范统一就好了,比如实体类,有的项目叫Entity,有的叫Model。以下是我个人觉得最优的方案:
视图对象Result:返参结果,例:OrderResult
视图对象VO:用法跟Result一致,个人觉得Result更有辨识度,所以推荐使用Result
数据对象Entity:跟数据表名对应,例:OrderEntity
业务对象BO:内部使用的类,无需暴露在外面(不能在controller使用)
关于CRUD操作相关DTO的全命名方式推荐格式:{ 业务单词}{ 动作}{ 后缀}.java
例:TeacherQueryDTO、TeacherUpdateDTO
反例:ClasscourseDTO(无法从命名获得业务场景)
Controller编写规范接口返参一定要使用泛型,除非只是返回成功或失败的操作,如:Result<此处一定要写返回的类>
原因:可读性强,调用方可直接查看返回的对象属性,并且Swagger、smart-doc等框架支持自动生成文档
Controller原则上只能做参数校验、属性补充、格式转换等操作,不能写业务逻辑,就算有也不能超过5行
原因:解耦,职责问题,不同的类有不同的职责
领域层若只是返回简单的数据,不需要错误提示的接口,如获取xx详情,可不使用Result<>,直接return对象即可
原因:若不需要错误提示信息,没必要再包一层,直接返回所需对象即可
不建议在Controller类加上@RequestMapping,请直接在方法的@PostMapping或@GetMapping写接口全路径
原因:方便搜索且方便根据业务拆分重构Controller时可随意copy移动代码
禁止使用request.getParameter()获得参数,请直接声明在方法体,若参数过多请使用DTO
原因:可读性,且符合文档自动生成规则
禁止使用Map/JsonObject入参或返参
请不要为了方便就这样写,不利于阅读与维护
不建议使用@PathVariable
原因:调试时(浏览器F)无法直观查看接口的参数名是什么;springmvc下非RESTful的风格的接口响应性能会比RESTful风格高2倍(因为涉及正则解析);另外对URL进行权限控制的时候也不好做
控制代码宽度方法参数数量请控制在4个内,如果不是%肯定以后不会加参数,请建一个DTO,像多条件查询的方法,一定要建对象,不然以后加需求就无线叠加方法参数,后果就是:
另外请控制代码长度,太长的方法请学会换行,原则就是不能出现滚动条,例:
/***获取所有表单模板*@paramformId*@paramonlyShowChecked只返回需填的字段*@return*/List<PduFormListResult>getFormDetail(@Param("formId")intformId,@Param("onlyShowChecked")booleanonlyShowChecked);控制代码高度一个类的代码与方法不宜过多,如果可以预见的是一个类会有很多方法,应该根据单一设计原则进行拆分,比如教师拥有教师资料、教师下单、教师数据同步等等,拆分成多个Service,不建议一个Service完成所有的职责,一个文件行数超过千行后,维护成本会渐渐变高。
一个方法的行数也不应该太多,根据阿里的规范,一个方法超过行就应该拆分出来。
异常处理原则能不使用trycatch就不要使用,大家不要害怕有异常就隐藏掉它,只要交给全局异常处理器就可以了,一切异常往外抛
/***不推荐*/@PostMapping("/test1")publicAjaxResult<TeacherSyncDetailDTO>test1(HttpServletRequestrequest){ try{ //业务代码returnAjaxResult.success();}catch(Exceptione){ returnAjaxResult.fail("错误啦");}}/***推荐*/@PostMapping("/test2")publicAjaxResult<TeacherSyncDetailDTO>test2(Stringid){ if(1!=1){ thrownewNsbCommonException("错误啦");}returnAjaxResult.success();}原因:业务代码不应该自己捕获异常,不要关心异常怎么处理,交给全局处理器来处理,这也是职责的问题,解耦代码,错误的日志、邮件通知等等的逻辑可以交给全局异常处理器记录,这样就可以做到代码的复用,更重要的是代码美观,可读性更强。
比方说我要对某个异常出现时特殊处理,比如发邮件,如果用trycatch那是不是我要写很多重复的代码?就算你封装成一个方法,那也得在很多的catch中调用,那也一点都不优雅。
//例:业务异常,尽情往外抛@TransactionalpublicvoidsubmitUnConfirm(OrderTourConfirmDTOdto){ OrderBaseModelbase=orderBaseService.getByOrderNum(dto.getOrdernumber());OrderTourModelorder=this.getByOrderNum(dto.getOrdernumber());if(!order.getStatus().equals(OrderTourStatusConst.REVIEW)){ thrownewCommonException("提交失败,该订单非审核中状态");}if(base.getAdultQty()==null||base.getAdultQty()==0){ thrownewCommonException("提交失败,请填写订单的成人数、儿童数");}if(base.getPduId()==null){ thrownewCommonException("提交失败,请选择商品和规格");}order.setStatus(OrderTourStatusConst.APPOINT);order.setSubmitTime(newDate());this.updateById(order);}合理的注释这个大家都懂,只要你维护过没有注释的代码你就明白这个事情的重要性。
在此提出几个建议
重要流程请加上注释
无用的代码请删掉,不要一顿注释就完事
废弃但不能删除的代码请使用@Deprecated告知
可分模块的流程善用分割符=========优雅的注释可以降低很多维护成本
关于service层的写法我们在定义Service层的时候有两种常规做法:
直接一个service实现类
定义service接口+serviceImpl实现类
思考1:使用service在日常业务开发中,在常规的三层架构(controller+service+mapper)中写业务,使用service+serviceImpl其实没有带来设计上的优点和使用interface的初衷,反而带来一些不必要的工作量。
开发/维护的时候我需要改2个文件,实现类也没法直观查看接口注释,浪费了一些开发时间,而且阅读的代码的时候链路多了一层
在大部分业务开发场景不需要一个service一个impl,因为你的实现类基本只有一个,无法体现接口的初衷,也没有所谓的解耦
这里有一篇更完整的文章大家可以看看:/s/ykEno7L5Xr1VHQ-ItQ-FYQ
所以大部分开发业务的场景,并不需要使用interface定义一层接口,如果不需要多实现,也没有用到设计模式去解耦,直接定义一个实现的Service其实开发效率更高
当然了,也有缺点就是:
不用使用接口,使用this.xx()调用本类方法会使AOP失效,如事务;当然也有解决方法,有兴趣自行百度。
当一个类的方法太多的时候,不方便查阅,但其实可以缩进,而且一个service层不应该承担太多的职责,代码行数是可控的
思考2:使用service+serviceImpl其实网上很多开源项目大多数都是使用service+serviceImpl,只是我觉我们日常业务开发没有把这种模式的优势发挥出来,比如:
需要用到一些设计模式,比如策略模式、工厂模式等
我和同事分别做项目的2个不同功能模块,但是同事的功能中却需要调用我这头实现的部分逻辑.为了让他有一个"占位符"可用,我可以快速的写个接口扔给他
某个service需要多继承
结论引用网络上的文章:这些情况其实可以说是接口好处的体现,所以java有面向接口编程的建议.但是说回Service层一定要有接口吗?那到未必,因为说到底,多一个接口仅仅是扩展性和某些情况下有优势,但是是否会用到接口的便利性,不确定的情况下我们未必一定要为"可能"买单.只是多写那几行代码,付出一点就可能避免"未来"的大"麻烦",何乐而不为
所以这里给到的建议是根据实际情况按需使用。
工具类编写规范相信大家都知道Hutool这个神器,建议写工具类的时候去看看这个文档,如果有重复的就不要再造轮子了
但是如果遇到没有的呢,比如在做学段学科需求的时候发现,CollUtil就没有取两List的笛卡尔积,那请新建一个ExtCollUtil,并且继承它,这个类即同时拥有hutool的方法,也有自定义的方法。
PS:其实公司应该有自己一个工具工程,原则上开发人员不可以偷偷在各自的工程写Util,若有需要提PR到专门的工具类工程,可以有效降低重复造轮子的时间
Lombok更优雅的用法Lombok相信大家都会用,但除了@Data还有更多优雅的用法
在对象上加上注释@Accessors(chain=true),可以使用链式写法
this.save(newMemTeacherEntity().setId("id").setTeacherTypeName("名字"));@RequiredArgsConstructor替代@Autowired构造注入,多个bean注入时更加清晰
@RequiredArgsConstructor@ServicepublicclassMemTeacherSyncService{ privatefinalMemTeacherServicememTeacherService;privatefinalMemTeacherEduServicememTeacherEduService;}@CleanUp清理流对象,不用手动去关闭流
@CleanupOutputStreamoutStream=newFileOutputStream(newFile("text.txt"));@CleanupInputStreaminStream=newFileInputStream(newFile("text2.txt"));byte[]b=newbyte[];while(true){ intr=inStream.read(b);if(r==-1)break;outStream.write(b,0,r);}包分级与类的存放合理的代码结构可有效降低代码的维护成本,在常规的项目中一般有2种存放的思路
按照技术角度或者文件类型来分(by-techorby-type),下文简称by-tech
按照业务功能来分(by-featureorby-business),下文简称by-biz
先了解一下这两者具体是什么
by-tech以文件类型作为顶层包,其次再以业务进行划分
com└─github└─heys1├─common│├─exction│└─util├─controller│├─student│└─teacher└─service├─student└─teacherby-biz以业务作为顶层包,其次再以文件类型进行划分
com└─github└─heys1├─common│├─exction│└─util├─controller│├─student│└─teacher└─modular├─student│├─dto│├─mapper│└─service└─teacher├─dto├─mapper└─service使用modular/modules根据业务对类进行拆分
controller比较特殊类似聚合层,可以按by-biz拆分,也可按by-tech拆分,根据业务情况选择即可
通用的util、异常、处理器、拦截器等等放在common包
如何选择在我以往的项目中我是采用第二种,理由如下:
开发方便,只需在一个包下即可开发,左侧的IDE菜单无需切来切去;
要添加或者移除一块业务时通常更加方便。比如大的应用做拆分,一般都是按照业务功能拆分的,则直接拆出某个包到新应用即可;
通过应用的包结构目录,就能大致知道这个模块在做什么,贴近DDD的思想,以controller作为聚合层、module作为领域层,结构清晰。
在《聊一聊DDD应用的代码结构》一文中作者写到:
按照业务来分包的思路在网上占绝对优势
所以建议选择方案二。