关于fillCircle()和drawCircle()个人的一些见解

来源:2-5 整理绘制工具类

JeffreyW_

2018-04-03

就目前的2-5章节的情况来看,fillCircle和drawCircle的区别仅仅是在最后调用fill和stroke的时候不一样,但是之前用于构造圆的代码是一样的。如果将来用于构造圆的代码量增大后,整个类的代码量就会nearly双倍增长。


个人感觉可以通过下面这个小改动,在基本不牺牲代码可读性的情况下,来进一步降低代码的冗余度:

在AlgoVisHelper类里面增加一个枚举,里面含有stroke和fill两个“选项”。这样用户在调用这个方法的时候可以写成drawCircle(mode: stroke)这个样子。

同样,这个改动也可以用在drawRect, drawOval等等画图方法里。


仅个人观点,并没有在否认什么:-)

写回答

2回答

liuyubobobo

2018-04-03

赞!完全可以:)


但是,我还是要说“但是”,为自己的设计justify一下:)


事实上,很多图形库,会采用我的这种接口设计方案,这是因为fillCircle和strokeCircle的方式看似冗余,但提供了更加良好的代码阅读体验。最典型的例子,比如要绘制一个填充色为红色,外边圈为蓝色的圆,圆心坐标(0,0),半径为10。用我的设计方式,写法是这样的(伪码):

setColor(red)
fillCircle(0, 0, 10)

setColor(blue)
strokeCircle(0, 0, 10)


用你的方法写则是这样的:

setColor(red)
drawCircle(0, 0, 10, false)

setColor(blue)
drawCircle(0, 0, 10, true)


我觉得我的写法可读性更强:)当然了,现代IDE对于代码阅读有参数注释功能,不过,这段代码要是在github上,以纯文本的形式展示给别的用户阅读呢?不过,工具都在发展,所以,依然是,这是一个见仁见智的设计问题:)


至于,在这种设计方式下,万一你说的“构造圆的代码量太大”怎么办?当然是把构造圆的代码提出来,形成一个“圆轮廓”的生成方法。这个圆轮廓生成方法在fillCircle和strokeCircle中,都是一行的调用。万一圆轮廓生成的算法发生改变,也只修改一个地方嘛,怎么可能两个地方都保存相同的逻辑?说好的“复用性”呢?:)


更进一步,这个圆轮廓生成的方法,可以和其他图形轮廓生成的方法(矩形,多边形等)做成公共接口,提供给用户,用户自由组合要绘制的轮廓图案,生成图形轮廓之后,只需要一次调用fill方法或者stroke方法,声明一下具体的绘制是否填充,就可以完成任意图形的绘制了。嗯,这样设计的接口,已经是大多数正规图形库真实的设计理念了:)

0
1
JeffreyW_
原来是这样!看来我还是没考虑太周全~谢谢
2018-04-03
共1条回复

liuyubobobo

2018-04-05

我又看了一遍你的问题。你说的mode参数是一个枚举型。非常非常赞!在这种情况下,使用drawCircle,也具有很好的表意性!

0
0

7个经典应用诠释Java算法精髓

课程重应用、重实践、重思维,真正应用于实际工作开发中

1888 学习 · 112 问题

查看课程