设计思想之数据与逻辑分离问题?
来源:5-8 偏函数

慕田峪8379950
2017-11-04
设计思想常说将逻辑分离出来。
我有个疑问,
例:我在java中定义一个表示<坐标>的纯数据类,仅有两个Double类型的值,我需要一些方法(求两坐标直线距离,求一个坐标相对于另一个坐标的角度,将坐标转化为其他坐标系,将坐标转化为数组),这些方法中都是纯运算方法。
我是直接在这个类中定义这些方法,还是重新定义一个helper静态类来定义这些方法?如果直接定义,那么在调用时,可以只需要传入一个值,否则需要传入两个值。在简洁与可读性方面都没有直接在这个类中定义好。在kotlin中可以与java一样先写一个helper类来实现,再些扩展方法来定义这些方法。可是我想知道有必要吗?
以此衍生出一个问题,java/kotlin 传递对象仅仅是传递对象的属性吗?(上面例子中的两个Double)。
在不失去逻辑分离的设计模式下,是否以下才是较好的解决方案,这也是我目前的方式:
java中额外定义一个helper类来实现这些方法,接着在纯数据类导入这个helper类,并声明这些方法调用helper类中的方法?
在kotlin中与java类似,还是先定义一个helper类来实现这些方法,之后再使用扩展方法二次实现。
依此又衍生出一个问题,我如果需要在重写的toString()中使用这些helper中的方法是直接使用吗,这样岂不是增加了耦合程度吗?
希望大神能解决小弟的迷惑。
1回答
-
凡事没有绝对啦。通常说的数据、逻辑分离,逻辑得是业务逻辑、交互逻辑这样的东西,你提到的与数据紧密相关的数学逻辑其实实现在数据类当中没有什么问题,就像你说的坐标。
data class Point(val x: Double, val y: Double){ fun distanceFrom(other: Point) = ... }
这样的写法其实是很自然的,这个逻辑就存在于 Point 本身存在的意义当中。这其实没什么问题的。
至于说 Helper,Java 当中我们如果非要将这些代码移出来,那么我们没有选择,只好搞一些 utils 或者 helper 的东西,但 Kotlin 有扩展方法呀。
显然,如果一定要强调分离,完全可以考虑扩展方法:
data class Point(val x: Double, val y: Double) fun Point.distanceFrom(other: Point) = ...
如果后面 Kotlin 支持 partial class,那么这种分离的写法将更容易实现(类似于 C# 当中写界面和 UI、交互逻辑的做法)
嗯。。应该说你能思考这些问题,是一件很好的事情。我们通常在教科书上面也会条条框框的告诉大家应该怎么写,例如设计模式,实际上这些东西还是需要自己多动手写一些程序然后去感悟。
加油~~
022017-11-04
相似问题