我正在一个React项目中工作,我们有自定义样式的表单元素。一个复选框和一个单选按钮都使用:
<input />
字段。<label>
的{{1}}。input
伪类,它更改了呈现的SVG元素。:checked
和checkbox
之间的唯一区别是CSS使单选按钮看起来是圆形的,复选框项目是方形的。现在,此组件的基本呈现的HTML是:
radio
所以我设置了radio.js React文件。而我的checkbox.js React文件只是扩展了收音机:
<input type={type} id={someid} />,
<label htmlFor={someid}>
<div className="icon">
{type === 'checkbox' && <CheckMark />}
{type === 'radio' && <CircleMark />}
</div>
{label}
</label>
与附加的CSS文件相同。它们使用SASS工作,所以我的checkbox.sass基本上可以做到:
export default class Checkbox extends PureComponent {
render() {
return <Radio {...this.props} type="checkbox" />;
}
}
无代码重复。一切都很好。
现在我的同事已经复制了整个radio.js和radio.scss文件,并复制了checkbox.js和checkbox.scss的代码。
我的团队100%同意他的看法,因为:“他们与众不同!”
结果是72行重复的JS和80行重复的CSS。
谁对谁错?
答案 0 :(得分:2)
在决定共享代码(创建抽象)时我问自己的问题是
不幸的是,那里并没有一个真正的魔术公式,但是我再次尝试变得非常悲观,避免在有危险信号的情况下创建抽象。稍后创建抽象并替换重复代码比删除不良抽象要容易得多。
对于您而言,我对问题的回答将是
因此,按照我的看法,由于不良的抽象而导致处于不良状况的风险很小,但是您也不会从中受益匪浅。我个人倾向于不在这两者之间共享代码,但是我也不认为这是对/错的情况。对我来说,好处并不能证明它的存在。
This talk from a few years ago来自React团队的塞巴斯蒂安·马克伯格(SebastianMarkbåge),确实改变了我对抽象的看法,总的来说,让我更加犹豫了。