关于java包_关于Java包

关于java包

我希望大家都同意,类的方法应该很小,并且只有很少的依赖关系。 这种观点被广泛接受,而对“小”的解释则各不相同。 关于这一点有很多文献。 但是包裹呢?

有些人将包视为名称空间。 因此,包仅仅是允许您为类重用名称的东西!

几年前,我对方法进行了思考:只是用于可重用代码的容器。

今天,我不同意这两种说法。 方法是命名事物,将事物与其余事物分开的非常重要的工具,即使仅被调用一次也是如此。

同样,即使我们忽略名称问题,软件包也起着重要的作用。 软件包将某些功能捆绑在一起。 他们为该功能命名,应该对其进行封装,以便我们重新使用它。 就像方法一样,程序包应具有单一目的。 它可能比方法的目的“更大”,但它仍然应该只做与该目的直接相关的事情。

不幸的是,在许多项目中,效果并不理想。

这是一个挑战。 从当前项目中随机选择一个软件包。 对于此软件包,请回答以下问题

  • 该软件包的目的是什么? 请使用一个简单的句子。 这句话与包裹名称相符吗?
  • 遍历该程序包的类,它们是否都共同努力以达到该类的目的? 还是那里偶然出现的课程?
  • 遍历系统的所有其他类。 他们都不关心包裹的单一用途吗? 还是有一些类在您应该查看的包中真正浮动的其他地方?
  • 如果您在下一个项目中的同事需要基本相同的软件包,那么从您的代码库中提取该软件包并将其构建为独立的jar将有多困难?

以我的经验,上述问题的答案很可能令人沮丧。 他们肯定参与了我合作过的大多数项目。

即使该项目中的类和方法合理干净。

这是为什么?

我认为原因是程序包的问题不如方法或类明显。 如果某个方法跨越整个监视器,则您每次都会看到使用该方法的所有时间。 而且由于该方法很长,因此可能需要做很多工作。 类相同。 但是跟套餐不同。 我花了一整天的时间编写代码,却不看包装里面的东西。 我使用快捷方式和基于名称的搜索打开类,而无需查看包内部。

因此,您不会注意到与完全不同的问题相关的类放在一个包中。 您不会注意到包中的类数超过了任何合理的阈值。

如果涉及到最后一个问题,那么关于依赖关系的问题将变得非常丑陋。 软件包还依赖其他哪些软件包? 哪个类包含该依赖项? 对于此类问题的工具支持非常有限。 而且问题只会在项目后期才问到,也许是当产生了一个姊妹项目时,该项目应该重用一些代码库,因此应该在一个通用的基础项目中移动。

由于我去过几次,所以我建议在项目开始时使用JDepend或Dependency Finder进行一些测试:

  • 包之间没有循环依赖
  • 每个包的最大类数
  • 固定的命名架构,例如<domain>。<project>。<module>。<layer>。<package-of-package-name>
  • 模块之间的依赖关系的固定方向(模块是垂直切片,通常基于某些域概念)
  • 层之间的依赖关系的固定方向(gui,表示,域,持久性是典型示例)

但请注意:这些测试往往很难保持满意。 但是,如果您付出额外的努力来保持程序包的清洁,则会对应用程序结构产生重大的积极影响。

参考: 关于 Schauderhaft博客上JCG合作伙伴 Jens Schauder的软件包 。


翻译自: https://www.javacodegeeks.com/2012/05/about-java-packages.html

关于java包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端布局的一些收获

前端布局的一些收获这段时间做前端样式的改造&#xff0c;有一些收获&#xff0c;来记录一下(吐槽一句IE垃圾) 1.calc()函数 定义与用法 calc() 函数用于动态计算长度值。 需要注意的是&#xff0c;运算符前后都需要保留一个空格&#xff0c;例如&#xff1a;width: calc(10…

lua菜鸟教程_Lua语言学习

根据百科描述&#xff1a;Lua是一个小巧的脚本语言&#xff0c;是巴西里约热内卢天主教大学里的一个研究小组&#xff0c;由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中&#xff0c;从而为应…

如何使用插件生成自定义Java 8代码

大多数程序员讨厌的一件事就是编写样板代码。 无休止的时间花费在设置实体类和配置数据库连接上。 为了避免这种情况&#xff0c;您可以让Speedment Open Source之类的程序为您生成所有这些代码。 这样可以很容易地以最少的人工就可以启动和运行数据库项目&#xff0c;但是当将…

下拉被下面列表遮住

下拉被下面列表遮住在上面布局添加 style"overflow: visible;z-index: 100"

jmeter之-用Firefox录制https协议证书问题

录制脚本的时候&#xff0c;比如录制https协议的百度网站 https://www.baidu.com &#xff0c;所有录制设置均正常&#xff0c;但是在jmeter录制控制器里面就是没有任何录制的请求。 这个时候提示说证书不对 1、打开火狐选项——高级——证书 也可以在浏览器输入about:preferen…

七点人脸姿态估计_Github开源库简单配置即可上线的3D人脸检测工具箱

【导读】人脸识别/检测是计算机视觉方向的一个基础的任务。小编在Github中找到了一个轻松配置即可上线使用的3D人脸检测工具箱&#xff0c;该工具箱包括多种特性&#xff1a;2D稀疏点、稠密点、3D、深度图、PNCC、UV纹理展开、姿态估计、序列化等等。对人脸识别/检测相关工作感…

springboot编写自定义过滤器

springboot编写自定义过滤器首先引入依赖&#xff0c;其次编写过滤器 Configuration public class FilterRegisterConfig {Beanpublic FilterRegistrationBean<SecurityFilter> securityFilter(){FilterRegistrationBean<SecurityFilter> re new FilterRegistrat…

数组置换(基础)

点击打开链接 求转置矩阵问题 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;2描述求一个三行三列的转置矩阵。 输入第一行一个整数n<20&#xff0c;表示有n组测试数据&#xff0c;下面是n组数据;每组测试数据是九个整型数&#xff08;每个…

广度优先遍历类似于二叉树的_二叉树的各种遍历方法的简单解释

二叉树顾名思义&#xff0c;最多两个孩子。一般规定一个二叉树&#xff0c;因为节点间有相互连接的原因&#xff0c;所以只要给定根节点&#xff0c;那么顺着寻找左孩子和右孩子便可以遍历到所有的节点&#xff0c;这就是遍历的直观解释。而遍历分为深度遍历和广度遍历&#xf…

基于jsf的项目_JSF基于事件的沟通:过时的方法

基于jsf的项目用JSF编写的Web应用程序由相互交互的bean组成。 在开发Web应用程序时&#xff0c;bean之间的通信是主要的设计模式之一。 有时&#xff0c;一个bean需要将事件发送给其他bean&#xff0c;以通知它们某些更改或其他任何更改。 通常&#xff0c;我们可以将托管bean或…

构建XML

构建XML举个小例子 //构建入参xmlDocument document DocumentHelper.createDocument();Element root document.addElement("wss");Element lajgEle root.addElement("wsss");lajgEle.addElement("c").addText(c);lajgEle.addElement("n&…

[CATARCS_2017] Week 1

SAE J1939 1234567891011121314151617181920212223242526272829303132 SoF SIGSRRIDE 1234567891011121314151617181920212223242526272829303132 转载于:https://www.cnblogs.com/cragoncan…

oracle数据库如何写翻页_oracle数据库如何写翻页

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

使用Java 8 Lambda简化嵌套循环

对于每个经常需要在Java 8&#xff08;或更高版本&#xff09;中使用多维数组的人来说&#xff0c;这只是一个快速技巧。 在这种情况下&#xff0c;您可能经常以类似于以下代码的结尾&#xff1a; float[][] values ... for (int i 0; i < values.length; i) {for (int …

onpropertychange替代方案

onpropertychange替代方案1.onpropertychange的介绍 onpropertychange事件就是property(属性)change(改变)的时候&#xff0c;触发事件。 这是IE专有的&#xff01; 如果想兼容其它浏览器&#xff0c;有个类似的事件&#xff0c;oninput&#xff01; 可能大家会想到另外一个事…

SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)

二、完整的锁兼容性矩阵(见下图) 对上图的是代码说明&#xff1a;见下图。 三、下表列出了数据库引擎可以锁定的资源。 名称 资源 缩写 编码 呈现锁定时&#xff0c;描述该资源的方式 说明 数据行 RID RID 9 文件编号&#xff1a;分页编号&#xff1a;Slot编号 用于…

vue数组变化视图_vue对象数组数据变化,页面不渲染

data() { // data数据return {arr: [1,2,3],obj:{a: 1,b: 2}};},// 数据更新 数组视图不更新this.arr[0] OBKoro1;this.arr.length 1;console.log(arr);// [OBKoro1];// 数据更新 对象视图不更新this.obj.c OBKoro1;delete this.obj.a;console.log(obj); // {b:2,c:OBKoro1}…

jsp里面编写java代码注意加双引号

jsp里面编写java代码注意加双引号 if("<%type%>""open"){document.getElementById("e").focus();}

angularjs1访问子组件_Vue学习笔记之组件的应用

Vue组件的应用&#xff1a;1、基础使用&#xff1a;第一步创建组件&#xff0c;第二步注册组件&#xff0c;第三步使用组件。在注册组件是需要用到template的属性。全局组件和局部组件组件的嵌套(父子组件)&#xff1a;注意先后顺序&#xff0c;先声明&#xff0c;后面才能用2、…

Qt 程序打包发布总结

1. 概述 当我们用QT写好了一个软件&#xff0c;要把你的程序分享出去的时候&#xff0c;不可能把编译的目录拷贝给别人去运行。编译好的程序应该是一个主程序&#xff0c;加一些资源文件&#xff0c;再加一些动态链接库&#xff0c;高大上一些的还可以做一个安装文件。 QT开发…