太阳系剧变-每月天数的建模

Laki 2024-2-27 19:44

有个疑惑想麻烦潘老师解惑。

最近看公司内部分享的幻灯片,给出两段代码对比OO编程(上)和函数式编程(下),感觉紧凑一些但改进不大,还是硬编码。记得老师课上说过,有硬编码说明领域概念没有提炼充分。

可否加这样一个领域类Month(id, NumberofDays, isLeapYear)?

UMLChina潘加宇

讲师应该是在这个地方鼓吹类似“模式匹配”的内容吧,你的感觉“紧凑一些但还是硬编码”是对的。

不过,你的这个类应该满足不了要求。

isLeapYear是Month的属性→这个就说不通,isLeapYear是Year的属性还可以。

改成下面这个可以:

Month(id, NumberofDays, NumberofDays_LeapYear)

属性:正常天数,闰年天数。

这样建模的话,里面的数值还是有很多相同的,就像代码里说的,1,3,5,7,8,10,12这几个对象,属性值完全一样,4,6,9,11这几个对象,属性值完全一样。说明这个结构不是最佳的。

下面这样更好一些:

注意,之前和现在说的“月”并非指具体的某个月(例如2024年3月),而是“规格”,人类的历法中,有12个“月规格”对象。天数放到“月类型”,“月类型”有3个对象,天数的值分别是(28,29)(30,30)(31,31)。

“天数”操作里写:

return 是闰年 ? m月类型.闰年天数 : m月类型.正常天数;

应该就可以了。

当然,(30,30)(31,31)还有冗余,因为“闰年天数”只适用于其中一种类型,还可以引入泛化,进一步消除冗余。

=====以下是扩展=====

仅就这个领域知识而言,硬编码倒是无所谓的。

除非太阳系发生了剧变,月-地-日之间的运行规律被打乱,人类社会也不会轻易更换历法。

如果像下面这个,就不一样了。

以下是《星之继承者》(詹姆斯·P·霍根)的片段:

《星之继承者》写于1977年,非常优秀的故事:

21世纪,地球内部已经消灭了战争。

2027年(只剩3年了),人类的勘探队在月球发现一具穿着太空服的尸体。

经检查,该尸体属于人类,但死亡时间是5万年前!

答案用我们当前所到达的科技水平就可以解释,不涉及“穿越”等各种无根基的“玄幻”。


weixinpanjiayu2