首页
学习
活动
专区
工具
TVP
发布

斑斓

张逸的技术分享
专栏成员
256
文章
272177
阅读量
61
订阅数
《企业级Java现代化》推荐序
人类的发展从来不是一蹴而就的,而是不断发展渐进演化而成。然而,从宏观的视角看,总会有那么几个特殊的标志事件引发变革,有那么一些璀璨的人物掀起风云,使得人类社会的发展呈现一种陡然跃迁的态势,历史学家因而得以将人类社会分割为不同的时代。
张逸
2023-03-23
4020
Java开发三大怪
Java语言规定了访问修饰符,目的在于隐藏无需公开的细节。其中,字段作为一个对象拥有的数据,往往需要隐藏起来,定义为私有字段乃是标准操作。如果外部调用者需要操作对象的数据,可以通过对外公开的get和set访问器进行读写。——但是,这并不意味着一个私有的字段一定需要对应公开的get和set。
张逸
2023-03-23
4670
Java规则:原子类的相等性判断
Java的规则S2204规定,对于Java并发库定义的诸如AtomicInteger、AtomicLong等原子类,不能使用equals()方法测试其值是否相等。
张逸
2023-03-23
1.2K0
设计概念的统一语言
有必要为领域驱动设计的设计概念定义“统一语言”,通过理解的一致保证交流的畅通,确保架构和设计方案的统一性。。
张逸
2019-12-05
7540
深入分析软件复杂度
Eric Evans的经典著作《领域驱动设计》的副标题为“软件核心复杂性应对之道”,这说明了Eric对领域驱动设计的定位就是应对软件开发的复杂度。Eric甚至认为:“领域驱动设计只有应用在大型项目上才能产生最大的收益”。他通过Smart UI反模式逆向地说明了在软件设计与开发过程中如果出现了如下问题,就应该考虑运用领域驱动设计:
张逸
2018-12-29
1.5K0
面向接口设计与角色接口
问题:在做项目的时候,是不是所有包含非静态方法的类,都要写一个接口?是因为这样的目的是为了解耦,然后通过DI注入实现吗?
张逸
2018-07-27
6910
一个完整的TDD演练案例(一)
实现猜数字的游戏。游戏有四个格子,每个格子有一个0到9的数字,任意两个格子的数字都不一样。你有6次猜测的机会,如果猜对则获胜,否则失败。每次猜测时需依序输入4个数字,程序会根据猜测的情况给出xAxB的反馈,A前面的数字代表位置和数字都对的个数,B前面的数字代表数字对但是位置不对的个数。
张逸
2018-07-27
1.6K2
一个完整的TDD演练案例(二)
在编写第二个测试时,由于测试样本与之前的测试完全不一样,之前的简单实现就不能满足新增的测试了。事实上,测试就是要去验证实现逻辑,这其中最重要的测试目标就是分支。不同的分支可能会返回不同的结果,如果我们根据分支来设计测试,就能有效保障实现的正确性。这称为“三角测试法”。
张逸
2018-07-27
8050
高质量代码的特征
回想起来,我觉得我们似乎在误读Uncle Bob的Clean Code,至少我们错误地将所谓Clean与可读性代码简单地划上了等号。尤为不幸的是,在Clean Code一书中,从第二章到第五章都围绕着可读性代码做文章,于是加深了这种错误的印象。 许多具有代码洁癖的程序员将代码可读性视为神圣不可侵犯的真理,并奉其为高质量代码的最重要特征,封上了“神坛”。殊不知,Uncle Bob在Clean Code的第一章就通过别人之口对所谓“Clean Code”进行了正名:所谓整洁代码并非仅仅是“清晰”这么简单。 按照
张逸
2018-03-07
1.2K0
限界上下文的边界
边界通过限界上下文来确定,这在领域驱动设计中具有非凡的意义。对应于通用语言,限界上下文是语言的边界,对于领域模型,限界上下文是模型的边界,二者对应于问题空间(Problem Space)的界定。对于系统的架构,限界上下文还确定了应用边界和技术边界,进而帮助我们确定整个系统及各个限界上下文的解决方案。可以说,限界上下文是连接问题空间与解决方案空间的重要桥梁。 那么,限界上下文所界定的边界,究竟是逻辑边界,还是物理边界?这并没有定论,需得依据不同场景而做出不同的决策。 逻辑边界 根据业务对领域进行逻辑分解时,
张逸
2018-03-07
1.4K0
构建你的技术标签
作为一名程序员,又或者IT工作者,拼搏在技术快速变迁的大潮流中,其实是一种幸运,毕竟我们无需陷入重复的枯燥生活之中。然而要跟上技术发展的脚步,真的太累了,就怕步伐太慢,一不留神你就落伍了。 或许有所谓通才与全才,又有那种最强大脑的天才们学什么都很快,除此之外,如我们这般的普通人,知识无涯生却有涯,就得聪明地利用有限的时间学习真正有用的。这种所谓“有用”,就是指学习之后能够给你贴上明显标签的那类知识。“标签”是一种信号,更像是某种声望。就是当团队面临对应问题时,人们会一拍脑袋首先想到你的那种声望。 例如说当我
张逸
2018-03-07
8050
代码诊所的第二次诊断
几年前,我有机会负责一个项目的咨询。团队很小,目标是对旧有系统的后端用Java改写,而团队的开发人员全为C程序员。我的工作职责是负责项目设计、开发,以及担任项目开发过程敏捷化的教练,并培养Java开发人员。 我在团队工作室的墙角落,开了一个小小的诊所,广而告之——“每日一贴,包治百病”。这是当时我在项目上的第二次诊断。 01 变量的声明应尽量与使用放在一起 本规则与代码的可读性有关,倘若方法还没有保持短小,这个问题就更要命。或许这是C语言开发者容易犯的毛病。当然也有许多Java程序员从前辈程序员处继承了这一
张逸
2018-03-07
7690
Java的ClassPath问题
在文章《Spark Submit的ClassPath问题》中,我探讨了针对spark-submit的Jar包,如何指定外部依赖的Jar包。同样的问题在本地部署时仍然存在。此时,运行Jar并不是通过spark-submit,而是通过java命令,例如: exec java -Xmx2000m -DMORT_HOME=$MORT_HOME -Ddata-set-parquet.path=$MORT_HOME/parquet -Dconfig.file=$MORT_HOME/mort.conf -jar $MOR
张逸
2018-03-07
1.5K0
当函数成为一等公民时,设计模式的变化
GOF提出的设计模式,其本质思想是封装变化。故而,创建型模式封装的是对象创建的变化,结构型模式封装的是对象之间的协作与组合结构,行为型模式则封装了对象行为的变化。所谓“行为”,不正是函数所能要表达的吗? 函数的抽象能力 从函数的抽象角度看,任何行为都可以理解为是一个对类型进行转换的函数,这是FP思想对OO设计模式的最大冲击。例如Strategy模式与Command模式,前者封装了算法策略的变化,后者则封装了命令请求的变化。无论算法策略,还是命令请求,都可以表现为一个函数。 譬如说将各种四则运算看做是一种算法
张逸
2018-03-07
1.1K0
代码诊所
几年前,我有机会负责一个项目的咨询。团队很小,目标是对旧有系统的后端用Java改写,而团队的开发人员全为C程序员。我的工作职责是负责项目设计、开发,以及担任项目开发过程敏捷化的教练,并培养Java开发人员。 C程序员的一个特点是基本不具备面向对象知识,在初步掌握Java语法之后,写出来的代码还是过程化的代码。团队开发人员的现状就是:没有Clean Code的意识,不知道何谓TDD与重构,写出来的Java代码质量很糟。如果从项目开初不针对这一问题进行有效的防治,就可能导致整个代码库陷入泥沼之中。 为此,我要求
张逸
2018-03-07
9090
编程实践 | Scala亮瞎Java的眼(一)
这是我在11月15日成都OpenParty分享的一个题目,确有标题党的嫌疑。Scala自然不是无所不能,Java也没有这么差劲,我只希望给Java程序员提供另外一条可能的选择。在Java 8后,我对Java的怨念已经没有那么强烈了,然而,Scala的优势仍然存在。 比较Java 8,我重点讲解了Scala的如下优势: 简洁代码 支持OO与FP 高阶函数 丰富的集合操作 Stream支持 并发支持 简洁代码 Scala提供的脚本特性以及将函数作为一等公民的方式,使得它可以去掉不少在Java中显得冗余的代码,
张逸
2018-03-07
7670
编程修炼 | Scala亮瞎Java的眼(二)
继续上一期的话题,介绍Scala有别于Java的特性。说些题外话,当我推荐Scala时,提出质疑最多的往往不是Java程序员,而是负责团队的管理者,尤其是略懂技术或者曾经做过技术的管理者。他们会表示这样那样的担心,例如Scala的编译速度慢,调试困难,学习曲线高,诸如此类。 编译速度一直是Scala之殇,由于它相当于做了两次翻译,且需要对代码做一些优化,这个问题一时很难彻底根治。 调试困难被吐槽得较激烈,这是因为Scala的调试信息总是让人难以定位。虽然在2.9之后,似乎已有不少改进,但由于类型推断等特性的
张逸
2018-03-07
1.4K0
闲话 | 代码的体格
Steve Yegge在他特立独行的作品《程序员的呐喊》中写道:“我坚信代码最大的敌人就是体格”。不过他过于自大了,以为这只是像他那样牛逼的程序员才拥有的少数派观点;又或者说他过于悲观,以为程序员的世界还在拼代码的肌肉男臆想中。殊不知只要是曾经挣扎在庞大代码库泥潭中的程序员,就不会盲目崇拜代码的大块头。 可惜,“知行合一”非圣人不可以做到,梦想的光芒常常难以照进现实的阴影。要缩小代码的体格,似乎比减肥还要艰难。软件系统像一条贪吃蛇,吃掉一切功能,最后越变越长,在局限的空间里再也无法做到从容的转折腾挪,最后活
张逸
2018-03-07
6430
设计匠艺 | 小即是美之二
小的益处还有一点,它可以使得我们在架构决策或技术选型时,可以变得更加从容。 譬如说,因为某些原因我们需要将整个企业系统从WebLogic上迁移到JBoss上,无疑,这是一个艰难的决定。即使在决策确定,要完成整个迁移也将是一个漫长的过程。如果系统是基于Micro Service的架构风格进行构建,每个服务根据各自情形选择自己的技术栈。倘若需要对某些服务进行技术栈迁移,相信这个问题不再变得棘手。——大象可以轻盈地跳舞,但付出的努力会百倍于一只敏捷的狐狸。 如今,Java已经发展到Java 8,引入的Lambda
张逸
2018-03-07
5490
编程修炼 | Scala中Stream的应用场景及其实现原理
假设一个场景需要在50个随机数中找到前两个可以被3整除的数字。听起来很简单,我们可以这样来写: def randomList = (1 to 50).map(_ => Random.nextInt(100)).toList def isDivisibleBy3(n: Int) = { val isDivisible = n % 3 == 0 println(s"$n $isDivisible") isDivisible } randomList.filter(isDivisibleBy3).ta
张逸
2018-03-07
6450
点击加载更多
社区活动
【纪录片】中国数据库前世今生
穿越半个世纪,探寻中国数据库50年的发展历程
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档