代码交叉拷贝悖论

一直以来写代码会把自己逼到某种非常难受的死角,明明是非常类似的代码,却不能方便的剪切粘贴,也无法用重构代码的方式合理的解决问题。就是他恰好类似于数据库交叉表那种情况,好像冥冥中指定了他的复杂度就是n平方。。。

从自己写的一个scroll bar的类里面找了一段代码出来。

m_thumbCap->SetVOffset(m_Height);
m_thumb->SetVOffset(m_Height);
m_thumbBottom->SetVOffset(m_Height);

m_thumbCap->SetRotation(270);
m_thumb->SetRotation(270);
m_thumbBottom->SetRotation(270);

滚动条的thumb由三块Image组件构成,cap,body和bottom。滚动条的图片默认是纵向的,横向滚动条是将图片横过来用的。这一段是将滚动条设置为横向的时候,分别将三块图片的垂直位置设置为属性里设置的高度,并将他们的图片旋转270度来横向使用。

我想说的是,这块代码的两组语句之间有着高度对称性,却难以利用这个对称性高效的开发出来,反而费时费力。。很纠结。不知大家遇到这种情况没有。

m_thumbCap->SetVOffset(m_Height);
m_thumbCap->SetRotation(270);
m_thumb->SetVOffset(m_Height);
m_thumb->SetRotation(270);
m_thumbBottom->SetVOffset(m_Height);
m_thumbBottom->SetRotation(270);

这个例子比较幸运,恰好修改一下分组方式修改起来会比较方便。甚至可以写个函数将这两句话包装起来。但有时遇到的情况就没这么方便了。


int coordinaryValue;
if(m_Orientation == ScrollBar::vertical){
coordinaryValue = value / (double)(m_Max-m_Min+m_PageSize) * m_Height;
m_thumbCap->SetVOffset(coordinaryValue);
}else if(m_Orientation == ScrollBar::horizontal){
coordinaryValue = value / (double)(m_Max-m_Min+m_PageSize) * m_Width;
m_thumbCap->SetHOffset(coordinaryValue);
}
setImagePos();

这段代码根据滚动条是纵向的还是横向的重新计算thumb块的位置并更新图形显示。横向和纵向的计算方式雷同却不相同,复制之后仍需修改几个地方,假如更复杂些的话就会更麻烦。并且这里甚至找不到很好的包装函数的方式。且不说由于整个项目只有这里用到了这一小块代码,封装函数可能对于开发效率也没啥提高。

啊啊貌似举了两个例子都不是很要命的那种,一时找不到非常典型的例子了。不过假如以前遇到同类问题的话,应该会有印象吧。也有可能所有类似问题都有解决办法的只是我有时困西西的编程没有仔细想吧。欢迎砸我~