- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写软件已经很多年了,并且一直试图创建富有表现力、清晰可读、可维护、健壮的代码。最近,我加入了一个使用 Spring 托管对象开发 Web 应用程序的团队。但我对这项技术感到非常不舒服。对我来说,感觉所有的封装和信息隐藏原则、数十年软件工程的成就都被抛弃了。我清楚地看到使用控制反转容器的优点,将系统依赖项从程序代码移到配置文件中。但现在,我认为 Spring 的使用方式只是增加了不必要的复杂性,而没有产生任何好处。
使用 Spring 创建 Web 应用程序支持 Bean,对象不再清晰地组织在模块中,也不再具有最小的可见性。相反,现在有一个单一的全局 Bean namespace 。因此,对象往往会得到像“pendingOrderCustomerName”这样的糟糕名称,更糟糕的是,这些名称甚至不能清楚地标识一个定义良好的实体,因为 bean 定义可以来自各种定义源,从公开指定的位置收集: Spring bean 不是简单地定义为包中的类,而是从 xml 文件组装而成,具有自由覆盖的可能性和松散定义的关系。
例如,当我在纯java中具有“Account”类型时,在“my.webstore”包中,我通常可以在一个地方(“my/webstore”)了解该类型的属性、关系和能力/Account.java”文件。 “Account”的实例作为与帐户一起使用的对象中的引用而存在,任何实例的状态都由该类精确定义。然而,对于 Spring beans,事情变得更加复杂:“Account”的实例现在存在于全局名称下,位于容器管理的范围内,具有从 xml 文件组装的状态,沿着基于命名模式的文件搜索路径找到...
要了解对象的作用及其行为方式,您只需阅读其程序源代码的日子已经一去不复返了。今天,您需要对象的 java 源代码(可能很复杂,难以理解),此外您还必须找到可能更改该对象的任何配置文件,这并不容易,因为您必须找出配置可能来自的所有方式你必须找出它们相互覆盖的顺序
也许这只是一个品味问题,但我也想知道为什么人们更喜欢冗长、笨拙的 xml 语法,如下所示:
<bean id="p1" class="Point" scope="prototype">
<property name="x">
<value>20</value>
</property>
<property name="y">
<value>80</value>
</property>
</bean>
在此:
p1 = new Point(20,80);
这个例子可能看起来有些夸张,但我告诉你我见过更糟糕的!
我无意批评 Spring 框架本身,它非常强大,在很多情况下都是一个优秀的成分。我关心的是如何防止误操作,如何保持可维护性,如何保证质量和稳定性,如何寻找依赖关系,如何记录代码......您的经验是什么?
最佳答案
正如您所看到的,如果您没有正确理解面向对象设计的原理,很容易误用 Spring。 Spring IoC 容器(让我们暂时忘记其余的,因为 Spring 旗下有大量的库)当您使用它来执行以下操作时,它确实会大放异彩:
当然,如果你开始定义Account
,你不会获得任何东西(实际上会失去很多)。和 Point
s 作为 Spring 组件。这些仍然应该被设计为实体或值对象。它们仍然应该是正确包的一部分,并且应该应用适当的可见性修饰符。如果您的应用程序未利用 IoC 容器,则仍应使用您将使用的策略来实例化、操作和管理它们。
看来您已经了解声音设计原则,所以我鼓励您相信自己的直觉。如果一个类是可重用的(通常是无状态的)组件,那么将其声明为 Spring 组件并将其注入(inject)到适当的位置。如果您不确定,请将其保留为普通的非托管类并正常使用它。您将了解声明组件在哪里有意义以及在哪里没有意义。
我还鼓励您研究如何利用 @Component
和<context:component-scan>
声明以减少 XML 占用空间。
祝你好运。
关于spring - 您如何应对 Spring beans 增加的额外复杂性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16893554/
我正在尝试将游戏中的 GPS map 系统复制到网络中。基本上游戏中有 12 张 map ,每张 map 都有不同的安全区域,你可以在其中扭曲你的 Angular 色或走动,但我一路上遇到了一些问题。
给定一个根目录,逐行读取 rootDirectory 或子目录中的所有文件,并对每个文件中的所有数字求和。每个文件的每一行都有一个编号。所以我只需要读取所有文件并对所有数字求和并返回。我想出了下面的代
我使用的是 MySQL 5.5,有两个表 T1(ID, NAME) 和 T2(ID, MARKS),下面是表中的数据。 T1的数据 ID NAME 1 A 2 B 3 C T2的数据 ID MA
我必须确定以下函数的时间复杂度(大 O): void BET::makeEmpty(BinaryNode* &n) { if(n != NULL) { makeEmpt
我基本上了解如何计算函数的复杂度。这同样适用于确定数学函数的增长顺序。 [我可能不像我想的那样理解它,这就是为什么我可能会问这个。] 例如: an^3 + bn^2 + cn + d 可以用大 O 表
我有一个家庭作业问题,一段时间以来我一直在努力解决,但我终其一生都无法解决。 我有一张尺寸为 X*Y 的纸和一组尺寸较小的图案,以及与之相关的价格值。我可以水平或垂直切割板材,我必须找到优化的切割模式
我写了这个字符串所有排列的解决方案。我对这个解决方案的时间和空间复杂性有疑问。我假设时间复杂度为 O(n³),因为嵌套循环和递归以及空间复杂度为 O(n),因为递归。 我的假设是否正确?如果可以,有没
刚遇到这个问题: 子集求和问题:求给定数组中两对数字的总和等于给定数字的个数 例如:给定总和为 9,数组为 { 0, 1, 2, 7, 13 } => O/P 为 1 对(2 和 7) 似乎这可以在
鉴于我有一个包含一组单词的文件: 1) 如果我选择一个哈希表来存储单词 -> 计数,查找特定单词出现的时间复杂度是多少? 2) 我怎样才能按字母顺序返回这些单词? 如果我选择哈希表,我知道 1) 的时
我很难理解大 O 时间复杂度。 Big O 的正式定义: f(n) = O(g(n)) means there are positive constants c and k, such that 0
有人知道 ECMAScript5 的 Object.keys() 在常见实现中的时间复杂度吗? n 个键的时间复杂度是 O(n) 吗?假设采用哈希实现,时间与哈希表的大小成正比吗? 我正在寻找语言实现
我需要知道,就复杂性而言,什么更好。要么为每个按钮从 xml 中标识一个单独的 onClick 方法,如下所示: android:onClick:"clickHandler" 和java代码: pub
无论如何我都不是 Javascript 的新手;也就是说,我对 bind 的作用及其行为方式有了基本的了解。但是,我遇到了一个我对结果有点不确定的用例。让我详细说明一个示例设置: 示例设置 首先,我有
这个问题在这里已经有了答案: Python list.clear() time and space complexity? (4 个答案) 关闭 1 年前。 Python 3 方法 list.cle
我创建的这个计算两个数组的交集是线性的方法的复杂度(在良好、平均、最差的情况下)? O(n) public void getInt(int[] a,int[] b){ int i=0; int
假设我已经使用 PriorityQueue 实现了 dijkstras,因此在未访问的节点中添加和删除需要 O(log n)。 PQ 最多包含 E 个节点,因此清空它我们得到 O(E)。当 PQ 不为
我能得到一些帮助来理解如何解决这个教程问题吗?我仍然不明白教授的解释。我不确定如何计算第三个/最内层循环的大 0。她解释说,该算法的答案是 O(n^2),并且第二个和第三个循环必须被视为具有 O(n)
有人可以告诉我这个过程在 for 迭代中的时间复杂度吗?这段代码是FloydWarshall算法的“重构路径”部分。prev[n][n]是最短路径中源节点和目的节点之间的节点矩阵。printAllSP
运行时间、复杂性、编译时间和执行时间有什么区别? 运行时间与时间复杂度有冲突,执行时间和执行时间有什么区别? 最佳答案 您真正需要的是如何将大O时间复杂度转换为运行时。这不像一开始看起来那么容易。 因
我对算法复杂度的计算很困惑。对于一项任务,我们被赋予以下功能并要求找到它的复杂性。 int selectkth(int a[], int k, int n) { int i, j, mini,
我是一名优秀的程序员,十分优秀!