【linux安装gcc源码】【源码搭建app价格】【股道稳赢背离源码】JAVA计件源码_java源码分享平台
1.å¦ä½è¯ä»·Marsèå¸çJava4Android
2.delphi源码,计件三层源码中间件
3.请问,工厂ERP软件哪个好哪个比较好一些?
4.Java开发规范:关于提高开发体验的源码源码分享记录
å¦ä½è¯ä»·Marsèå¸çJava4Android
ä½ä¸ºæå¸ï¼è·è®¡ä»¶å·¥ä½ä¸åï¼ä¸è½ç¨å¹å »å¤å°å¦ç为è¯ä»·æ åï¼å ä¸ºä½ å¹å »å¤å°å¦çï¼æ¯å¦æ ¡çå®æï¼ä¸æ¯åååé£æ ·ï¼æ人æ¾ä¸é¨æ¥ï¼æéåªè¦ææºä¸åå¹²èå°±å¯ä»¥äºï¼èæ¯ç±å¦æ ¡æçï¼åæç级ï¼ç¶åç»ä½ 派任å¡ï¼è®©ä½ å»å®æãå¦æä½ çç级åºäºä¸ªå¤§æåï¼é£æ好å ä½èå¸è¸ä¸æå ï¼å ä¸ºä½ çç级ä¸å®ä¸æ¢ä½ ä¸ä¸ªäººï¼èæåçå¹å »ââå¦æä»/她确å®æ¯ä½ 们å¹å »åºæ¥çââä¸å®æ¯éä½å³å¨çç»æ¶ï¼è·ä½ æå ³ç³»ï¼ä½ä¸å¿ 大å 大æ½ã é£ä¹ï¼ç¨å·¥ä½éæ¥å计ç®å¦ä½ï¼ä¹ä¸è¡ãè¿æ¯ä¸è¿°åå ï¼ä½ çå·¥ä½æ¯é¢å¯¼åé çï¼å·¥ä½å¤å°ï¼å¾å¾æ¯ä½ èªå·±é¾ä»¥å¹²æ¶çãï¼å½ç¶ï¼æ¶ä¸ç大å¦æå¸ä¸ï¼å¤æ°å·²ç»ä¸ææå¦å·¥ä½å½æèªå·±ç主è¦å·¥ä½äºï¼å°½éå°ä¸è¯¾ï¼å¤å¨å®¶éå¹²ç§ç ï¼æè å«çä»ä¹äºæ ãä½æ¯ï¼è¿æ¯å¯ä»¥å¼å¯¼çãï¼åæ¶ï¼å¹²çå·¥ä½æ°éå¤çï¼ä¸è§å¾æ¯å¥½èå¸ï¼ç¸åï¼å¹²çå°çï¼ä¸è§å¾ä¸åå¦ç欢è¿ã é£ä¹ï¼çä¸ä¸ªèå¸åå¦ç欢è¿çæ åµæ¥å®å§ï¼æè§å¾å°¤å ¶ä¸è¡ãä¸åï¼å¦ççç¼å å趣å³æ¯å 个人ææ个éä½èä¸åçï¼æ们å¾é¾ç¸ä¿¡ï¼è¿ä¸ªä¸ªäººæéä½å°±æ¯ç»å¯¹çå ¬å¹³çãæ¯å¦ï¼ä¸ä½èå¸ä¸è¯¾ç¬è¯å£°å§ï¼é£ä¸å®æ¯å欢è¿çï¼ä½æ¯æªå¿ æå 容ï¼å½ç¶ï¼å¤æ°ä¸è¯¾æ´»è·çï¼å 容ä¹å å®ï¼ï¼ç¸åï¼æçèå¸ä¹ æ¯äºä¸æ¿ä¸ç¼ï¼å¤´å¤´æ¯éï¼è¿æ ·çèå¸ææ¶æ¯ä¸å欢è¿çãå°¤å ¶æ¯é£äºä¸å¤ªæä¹æ ·çå¦æ ¡ï¼ä¸è¦ç¸ä¿¡å¦ççç¼å ã åç大å¦çå¦çæ¯å¦å°±å¯ä»¥ä¿¡èµå¢ï¼æ认为æ£ç¸åãä¹æ以è½èä¸åç大å¦ï¼å¹¶ä¸æ¯ç±äºä»/å¥¹å ·æç¬å°çç¼å ï¼èèä¸åçä¹åï¼ç±äºäºèå¿ã人äºå ³ç³»çååçåå ï¼å¦ççå¿çä¹ä¼åå°å½±åãä»ä»¬å¾é¾ä»¥å¾å®¢è§çç¼å å»çèå¸ãåæ¶ï¼è¿äºå©åæ»çæ¥è®²è·ä¸è¬å¦æ ¡çå¦çï¼çè³æ¯å¾å·®å¦æ ¡çå¦ç没ææ¬è´¨å·®å«ââæ们常常æ个认è¯ï¼çéæé¾ç¢ç£¨çæ¯ä¸¤å¤´ï¼æå·®çåæ好çï¼ä»ä»¬å ·æåæ ·çåå±è½¨è¿¹ï¼å æ¤ï¼å¦æä½ ä¸ç¸ä¿¡å·®çï¼ä¹æ好åæ ·ä¸å¿ ç¸ä¿¡å¥½çã æé¾ç¢ç£¨çå°±æ¯å¤å½çå¦çï¼ç°å¨æ们åºæ¬ä¸ææ大å¦é½æçå¦çï¼ä»ä»¬æ¥èªåç§å½å®¶ï¼å¨åç§æåä¸çé¿ï¼å¯¹äºç»èå¸æåçäºæ ï¼ä»ä»¬çååºççæ¯äºè±å «é¨ãä½ä¸ç®¡æä¹è¯´ï¼æ»çæ¥è®²ï¼æä¸ç§æ åµï¼ä¸æ¯å¥½å¥½åï¼ä¸ç®¡è¿ä¸ªèå¸æä¹æ ·ï¼æ»è¦ç»é¢åï¼æé«åï¼äºæ¯è®¤çåï¼è¦åæèªå·±ççæ³ï¼èä¸ç¸ä¿¡è¿ç§çæ³ä¼çå®å°åæ å°æ ¡é¿é£éå»ãå ³é®æ¯ï¼ä»/她ç¸ä¿¡èªå·±çæåä¸å®æ¯æ客è§çï¼ä¸å®¹è®¸å«äººè¯´ä¸éåãæ以ï¼è¿äºäººï¼è¦ä¹æåå¾å®¢è§ï¼è¦ä¹ææ°ç¨äºä½æ»ä¸ææ¹ã常常åç°æåå¦å¦ï¼èå¸ï¼ææåå¦ç»ä½ æäºæä½åï¼çè³æçé¶åãä½ å»çé£ä½åå¦ï¼æ£æ¯ä½ ç¹å«æ¬£èµçï¼ä½ä¸ç¥éä»ä¹æ¶åï¼ä»ä¹ä¸è¥¿ï¼è®©ä»/她æå°ä¸ç½äºãä¸æ¯æçµçåï¼ççèå¸é£éé½ä¸å¥½ï¼æå¾å¤ç¼ºç¹ï¼ææçï¼æ以ï¼ç¦»çæ³ä¸çèå¸çæ åå·®å¾å¾è¿ãè¿ç§äººä¹å¾å¤ã ä¸è¬æ¥è®²ï¼ä¸å½å¦ççæåç¸å¯¹éä¸ä¸äºï¼ä¸è¬æä½åä¹è½è®©èå¸è¿å¾å»ï¼å³ä¾¿æ个ææªè¯çåå¦ï¼å¨ä¸ä¸ªçéä¹å°±æ¯ä¸ä¸¤ä¸ªï¼èçå¦çåå¦ï¼ä»ä»¬å¸¸å¸¸æå¤ä¸ªåå¦ååºå¤±å¸¸ï¼èè¿äºæ¶å¸¸çåå¦å常常ç»ä½ çåè®©ä½ å¾è·ç¼éã å¦çæåï¼å¯¹èå¸çå¯ä½ç¨å¾å¤§ï¼æçèå¸ä¸ºäºå¾å°é«åï¼å¯¹å¦çè½¯ç¡¬å ¼æ½ãæ¯å¦ï¼æçèå¸è¯·å¦çåé¥ï¼ç»å¦ç礼ç©ï¼ä¹°å¥½å¦çï¼æçååè¯å¦çï¼ä½ é¨çåå¹´é½å¨æçææ¡ä¹ä¸ï¼å¦æä¸å¥½å¥½è¡¨ç°ï¼é£ä¹æä½ ä»¬å¥½ççãç»æå½ç¶ä¸æ¯é½è§æï¼ä½æ¯åªè¦ä¸ç§æ¹æ³å¿ ç¶å¼å¯¼åºå¥æªçææ°ï¼é£ä¸å®æé®é¢ã ç°å¨å¸¸å¸¸å®æ½çèæ ¸åæ³æ¯å¦æ¯å½å ï¼æ ¸å¿æåçæç« æ°éââè´¨éé½ä¸è®²ãææ¶å讲质éï¼å°±æ¿ç¤¾ä¼ååºè¯´äºââä½ æ人ç»ä½ ååï¼åªææ¯éªä½ çè¯ï¼é½ç®æ°åï¼ä½ ææ¿å°å¥éåï¼åªæä½ çå¥éæ¯è´¿èµçè§ä¸å¾äººçæ¹å¼åå¾çãä½ æ项ç®åï¼åªæä½ ç项ç®æ¯ä½ ç导å¸éè¿æç§ä¸æ¿å çéå¾è·å¾çãè¿æ ·çåææ¯ï¼å¾å°å¥½å¤ç人ï¼ä»ç好å¤ä¼ç»§ç»éæ¥ï¼å¾ä¸å°å¥½å¤ç人ï¼ä¸æ¬¡å¥½å¤ä¹ç¦»ä½ å¾è¿ãæç« çå表ä¹æ¯ï¼ä½ å表è¿æ ¸å¿äºï¼ä¸ä¸æ¬¡å°±å¥½ä¸äºãï¼å¦æ没å表è¿ï¼å«äººé½æ²¡è§è¿çä½ çå头ï¼é£ä½ å°±æ»æå§ï¼ ä¸èæ¯å¦ä¸ä¸ªç¡¬å¤´è´§ï¼ä½æ¯æ¶ä¸åºé±å°±åºççäºæ ä¸åå°æ°ï¼ä»è½å¤ä¿è¯è´¨éåï¼ ä»ä¹åæ³æ¯æ好çââä¸è¦è¯´æ好çï¼å 为è¿æ²¡æ好çââå¯è¡çï¼æè¿æ³ä¸åºæ¥ãå¦ææçæ³çå¦è æ¥ä¸»æå ¬éï¼é£ä¹ï¼å¦è èªå·±çè¯ä»·æ¯æ好çãä½æ¯ï¼éè¡å¦éå±±ï¼ç°å¨çå¦æ¯å°±æ¯è¿æ ·ï¼å¦æä¸å®¶çå¦æ¯éå¾å¤ªè¿ï¼å¾é¾è¯´ä¸è¯ï¼å¦ææ¯ä¸ªä¸ä¸çæ¯ä¸ªé¨åé½è®¾ä¸å®¶ï¼é£å¾é¾ä¿è¯ä¸å®¶çå ¬è¯ã人å¿æ¯å¯ä»¥ååçï¼ä¹æ¯å¾é¾ç¢ç£¨çãç®åçç¶åµæ¯ï¼æ²¡æåæ³ã
delphi源码,三层源码中间件
这套Delphi源码设计用于企业级应用系统开发,如ERP、分享MES、平台HRMS和库存管理系统,计件相较于常规中间件,源码源码linux安装gcc源码它具有更丰富的分享功能和更直观的开发体验。对于需要处理高并发、平台跨平台、计件高效实时系统的源码源码开发者,可能需要自行优化。分享该框架不依赖第三方控件,平台以简单明了的计件方式封装常用功能,注重实用而非复杂技术。源码源码
开发环境方面,分享原基于Delphi ,已升级至Delphi ,采用DataSnap架构。服务器使用SQLite存储配置参数,客户端使用MS SQL数据库,并结合DevExpress VCL和FastReport控件。
服务端部分,专注于功能实现而非图形展示,而客户端则是一个针对制造业的MES系统,核心功能包括计件工资计算、产量分析和生产进度跟踪。此外,还有一个Java版APP和H5手机端应用,用于数据上报和查询,但并未包含在公开分享的源码搭建app价格内容中,如有需要,可单独联系获取。
请问,工厂ERP软件哪个好哪个比较好一些?
工厂需要什么样的管理软件,如何引入ERP生产管理系统,主要有哪些功能,能解决什么管理问题?相信这是正在选型中的制造业老板都想了解的问题。
带着这些问题,我们一起深入探讨一下制造业如何通过管理系统,打造数字化工厂,实现智能化管理!
我们以实际案例来阐述,中之杰公司服务的一家中小型制造企业-苏州良浦。该企业主营砂加气混凝土砌块、灰加气混凝土砌块、五金、设备、油品等。伴随着他们企业的快速发展,传统管理模式下的各类弊端展露无遗。随着公司业务量的增长,车间管理人员发现,每日生产、销售、库存、财务等数据无法及时汇总,且采用手工统计,不仅效率低下,还容易出错。股道稳赢背离源码在生产环节上,无法有效控制产品的生产、库存和发货,容易造成大量成本浪费。而良浦这家企业的产品又多是非标定制化,产品的库存库位管理极度复杂,如果无法精准定位产品及物料的库存位置,那么,要找某个产品就非常困难。
良浦的信息化负责人曾经告诉我们,有一次他们要找一块板(水泥板墙),他们十几个人在六万平方米的露天仓库找了一天没有找到,由于赶时间,重新生产了一块,结果几天后又在某个角落里找到了这块板,实在是让他们哭笑不得。这不仅使工作效率下降,还造成成本的增加。以小见大,企业的管理问题都是在这种细节中体现出不足,然而,激烈竞争之下,企业抢占的就是1%的效率和价格差异。
所以,企业到底应该如何使工厂管理进入数字化阶段呢?中之杰专家认为,靠单一的企业管理系统只能解决部分问题,并不能从根本上扭转局面。在良浦公司的项目上,中之杰的庄家精准抄底源码项目服务团队通过详细的需求调研,对良浦现有业务流程进行了重新梳理,确定项目范围后,为良浦量身打造了一套数字化转型解决方案。
通过ERP+MES的集成性数字化解决方案,结合条码等智能终端硬件设备,在经过一年多的运营后,良浦各方面的效率得到了大幅提升。能够实时反馈生产数据,结合数据报表,批量打印每块产品的检验表格,减少了每月将近张表格的制表工作,统计室员工由原来的8人减少为3人,而且数据准确性也提升到%以上。通过PDA实时扫码入库,实现了实时的产品出入库,满足了库存精准定位的需求,大幅减少仓管人员的工作量。而且,在库存积压这一块得到了根本性的解决,仓管人员告诉我们,现在他们库存里的积压还是在使用ERP+MES系统之前的积压,上系统后都是按单采购,按单生产,基本零库存积压。
我们总结一下,管理工厂生产环节,需要根据公司具体业务和管理流程的需求,且需要一套ERP+MES系统的集成解决方案,从产品、年会抽奖excel源码业务、执行和管理上全面实现数字化。这样你的生产管理问题就不再存在啦!
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应用的代码结构》一文中作者写到:
按照业务来分包的思路在网上占绝对优势
所以建议选择方案二。