哲学上说变与不变,讲的是绝对运动与相对静止的道理,在代码设计中,也有许多变和不变之间的辩证故事。
有一些类在创建以后,整个生命周期内都不会发生变化,这种模式被称为Immutable Pattern。
较弱的不变模式:指的是一个类的实例状态是不可变化的,但是这个类的引用的实例却可以变化。
比如说:Visitor模式常常是这样的,整个流程是不可变的,但是我为我的整个流程提供灵活的切入点,提供出来访问接口,供变化的部分完成。
较强的不变模式:一个类实例状态不可变,其内部引用的所有实例也不可变。
这个就比较多了,JDK中的String、Integer、Byte等都是不可变的。
变化的场景需要考虑许多事情,因为变化带来了“状态”的概念。但正因为有了状态,整个世界才丰富多彩。变化需要考虑共享访问的情形,需要考虑状态之间的关系。当我们享受到代码变化带来的愉悦,也开始追求不变的代码,那一份古朴和单纯。
不变,引伸出对象复用的好处来。无状态的单例,很多场景下可以看作简单的工具类;更多的对象在一定时期内无状态,比如Prototype模式,比如线程池、缓存,这些都将哲学中的变与不变最终结合到代码中去。不变,是快速的、简单的、敏捷的,将变化的状态连结起来了。
程序=算法+数据,算法是不变的,数据是可变的。仿佛从软件的一开始,变与不变就给后续的万事万物埋下了伏笔,代码的世界围着这个特殊的视角旋转。随着动态语言的兴盛,以往不可变的方法也可以被改变,方法本身也能变成对象,数据和算法轻而易举地在代码中变幻,我们越来越疑惑,还有什么不变的东西,可以让我们彻底看清和相信一次?
Action是具备状态的,线程独立的;Service和DAO是无状态的,是可以被池化的。不变得再极致一点,我希望从编译之后它就是不变的,而不是对象创建之后不变,这就是方法。静态语言中的方法逻辑本身就是不可变的;而另一方面,当方法内部所使用的一切变量,都严格被控制在方法内部的临时变量或者按值传递的参数中,这说的,不正是函数式编程吗?
也许,其实软件的本质很简单,我一直在思考,软件复杂化的本质就是为了追求简单的东西。就像这个变化莫测的世界,不变的故事,总是那么淅淅沥沥的,却又惊人地相似。
本文的最后,Rod Johnson说:
If possible, design applications to use a stateless service layer. Hold state in the web tier, rather than in the business logic tier, if possible.
文章系本人原创,转载请注明作者和出处
分享到:
相关推荐
根据您提供的文件信息,本篇文章的主要内容是围绕信息学中“变与不变”的关系进行讨论,并在论述过程中没有涉及具体代码的编写。下面将从信息学中的几个关键知识点来详细说明这一主题。 ### 算法与数据结构 首先,...
该工程使用python脚本调用c代码实现wav音频的变速不变调。 1.gcc编译生成动态库speed_change.dll:gcc -o speed_change.dll -shared -fPIC runsonic.c sonic.c sonic.h。 2.使用python代码speedup.py调用speed_...
Java标准库中的String、Integer和BigDecimal类就是不变对象的典型例子,它们分别表示不可变的字符串、整数和大数。 1. **简化编程**:由于不变对象只能处于一种状态,它们在正确初始化后就不会进入不一致的状态。这...
在本资源中,"MATLAB计算机视觉与深度学习实战代码 - 基于不变矩的数字验证码识别.rar",我们关注的是使用MATLAB这一强大的计算工具进行计算机视觉和深度学习的应用,特别是在数字验证码识别上的实践。这个压缩包...
9. **重构**:当代码变得复杂难以理解时,重构是必要的。通过重构,可以提炼出重复的代码,改进设计,使代码结构更加清晰,同时保持功能不变。 10. **持续集成/持续部署(CI/CD)**:自动化测试和部署流程,确保代码...
标题中的“基于自适应信息素、决策变量高斯变异和决策变量边界自调整三种改进的混合改进蚁群算法”指的...通过对代码的研究和运行,我们可以深入理解这些改进策略如何提升蚁群算法的性能,并可能将其应用到实际问题中。
这个项目中提供的Matlab代码可能包含了以下部分:图像预处理函数、不变矩计算函数、边界框检测算法、分类器训练和测试脚本等。使用者可以通过运行代码,了解每个步骤的实现细节,并根据自己的需求调整参数和算法,...
【标题】中的“音频加速变慢、男女声变换matlab代码”是指利用MATLAB编程实现对音频信号进行速度改变和音调变换的功能。在信号处理领域,这种操作通常涉及到时间拉伸(time stretching)和频率变换(pitch shifting...
根据文件大小,代码设置了不同的质量值,如0.6f、0.75f、0.85f和0.9f,以平衡文件大小和图片质量。 3. **判断是否需要压缩**:`CompressPicTools`类检查输入图片的文件大小,如果文件大小低于200KB(最小长度),则...
这个插件的出现弥补了OneNote在处理代码片段时的不足,使得在OneNote中插入和查看代码变得更加专业和便捷。安装过程通常很简单,用户只需按照提供的指南或安装向导进行操作,即可快速在OneNote中启用代码高亮功能。...
通过学习和理解这个Matlab代码,不仅可以掌握图像检索的基本流程,还能了解到如何应用Hu不变矩这一经典特征描述符。此外,由于该压缩包提及了其他领域的Matlab仿真代码,如智能优化算法、神经网络预测等,这表明这是...
**Forall.js** 是一个针对JavaScript的工具,它引入了静态类型检查和不变性检查的概念,以提升代码质量、减少运行时错误,并提高开发效率。在JavaScript开发中,特别是"其它杂项"这类非标准或特定场景的应用,这样的...
这篇“长江消费龙头复盘系列之美的集团:唯一不变的就是变”深入探讨了美的集团的发展历程、战略调整以及在不断变化的市场环境中的应对策略。 一、美的集团的发展历程 美的集团自成立以来,经历了从单一产品到多元...
《Matlab计算机视觉与深度学习实战》是一本深入探讨如何使用Matlab进行计算机视觉和深度学习...通过学习和实践这个章节的代码,读者可以提升自己在图像识别领域的技能,并为其他复杂的计算机视觉任务打下坚实的基础。
当代码变得难以理解和维护,或者在增加新功能或修复错误时发现需要改进代码结构时,都应考虑重构。同时,代码审查过程也是重构的好时机,经验丰富的开发者可以提供重构建议。然而,并非所有情况下都适合重构,如项目...
在编程领域,尤其是在软件构造中,可变性和不变性是两个关键概念,它们对程序的稳定性和维护性有着深远的影响。本节将深入探讨这两个概念,以及如何在Python和Java这两种语言中应用它们。 首先,可变性(Mutability...
【利用不变性】不可变对象具有很多优点,包括代码安全、易于理解和并发友好。不可变对象不能被意外改变,因此它们在函数之间传递时不会引发副作用。此外,不可变对象可以被安全地共享,因为知道它们不会改变,这可以...
5. **图片容器**:为了在放大图片时保持网页布局不变,通常会创建一个覆盖整个屏幕的容器元素,将放大后的图片放入其中,并调整其大小和位置。容器元素通常具有半透明背景,以便用户能看到背景内容但不会分散注意力...
这允许以这样的方式对图像块进行局部表示,使得可以将它们与变形和照明都具有很强的不变性进行比较。 该代码的核心是用C编写的,旨在嵌入到应用程序中。 还应该可以编译为库并安装在系统级别。 执照 Copyright (C) ...
这套源代码文件将成为您的得力助手,帮助您展示自己的才华和技能。通过使用这套源代码文件,您可以轻松地完成网站搭建任务,为您的课程设计或毕业设计增添亮点。总的来说,这套HTML源代码文件是一个高效、实用、易用...