请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

设计思想之数据与逻辑分离问题?

设计思想常说将逻辑分离出来。

我有个疑问,
    例:我在java中定义一个表示<坐标>的纯数据类,仅有两个Double类型的值,我需要一些方法(求两坐标直线距离,求一个坐标相对于另一个坐标的角度,将坐标转化为其他坐标系,将坐标转化为数组),这些方法中都是纯运算方法。
     我是直接在这个类中定义这些方法,还是重新定义一个helper静态类来定义这些方法?如果直接定义,那么在调用时,可以只需要传入一个值,否则需要传入两个值。在简洁与可读性方面都没有直接在这个类中定义好。在kotlin中可以与java一样先写一个helper类来实现,再些扩展方法来定义这些方法。可是我想知道有必要吗?

    以此衍生出一个问题,java/kotlin 传递对象仅仅是传递对象的属性吗?(上面例子中的两个Double)。

     在不失去逻辑分离的设计模式下,是否以下才是较好的解决方案,这也是我目前的方式:
         java中额外定义一个helper类来实现这些方法,接着在纯数据类导入这个helper类,并声明这些方法调用helper类中的方法?
        在kotlin中与java类似,还是先定义一个helper类来实现这些方法,之后再使用扩展方法二次实现。

    依此又衍生出一个问题,我如果需要在重写的toString()中使用这些helper中的方法是直接使用吗,这样岂不是增加了耦合程度吗?

希望大神能解决小弟的迷惑。

正在回答

1回答

bennyhuo 2017-11-04 12:35:39

凡事没有绝对啦。通常说的数据、逻辑分离,逻辑得是业务逻辑、交互逻辑这样的东西,你提到的与数据紧密相关的数学逻辑其实实现在数据类当中没有什么问题,就像你说的坐标。

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、交互逻辑的做法)

嗯。。应该说你能思考这些问题,是一件很好的事情。我们通常在教科书上面也会条条框框的告诉大家应该怎么写,例如设计模式,实际上这些东西还是需要自己多动手写一些程序然后去感悟。


加油~~

0 回复 有任何疑惑可以回复我~
  • 提问者 慕田峪8379950 #1
    还有个问题,对象的传递是仅仅传递其定义的属性吗?上例中的两个Double值。
    回复 有任何疑惑可以回复我~ 2017-11-04 12:39:58
  • 是引用啦,不是值
    回复 有任何疑惑可以回复我~ 2017-11-04 13:10:32
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号