关于fillCircle()和drawCircle()个人的一些见解
来源:2-5 整理绘制工具类
JeffreyW_
2018-04-03
就目前的2-5章节的情况来看,fillCircle和drawCircle的区别仅仅是在最后调用fill和stroke的时候不一样,但是之前用于构造圆的代码是一样的。如果将来用于构造圆的代码量增大后,整个类的代码量就会nearly双倍增长。
个人感觉可以通过下面这个小改动,在基本不牺牲代码可读性的情况下,来进一步降低代码的冗余度:
在AlgoVisHelper类里面增加一个枚举,里面含有stroke和fill两个“选项”。这样用户在调用这个方法的时候可以写成drawCircle(mode: stroke)这个样子。
同样,这个改动也可以用在drawRect, drawOval等等画图方法里。
仅个人观点,并没有在否认什么:-)
2回答
-
赞!完全可以:)
但是,我还是要说“但是”,为自己的设计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方法,声明一下具体的绘制是否填充,就可以完成任意图形的绘制了。嗯,这样设计的接口,已经是大多数正规图形库真实的设计理念了:)
012018-04-03 -
liuyubobobo
2018-04-05
我又看了一遍你的问题。你说的mode参数是一个枚举型。非常非常赞!在这种情况下,使用drawCircle,也具有很好的表意性!
00
相似问题