Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

CSS 与 OOP

  OOP 中一直强调要「低耦合,高内聚」,但是这样会造成代码的复用率降低(这也是近年来软件越来越大的原因之一,更重要的原因是 UI)。什么样的代码该重用,如何重用,这才是最纠结的地方。什么时候该复制粘贴,什么时候该做成通用函数,什么该做成组件跨项目使用?

我都不知道自己在干什么

  最近做的一个项目,据说需要一个 UI 库,但是这个 UI 库存在的意义仅仅是为了满足一个项目的 UI 需求。我无法理解为什么要为不打算重用的东西做一个可以跨项目的通用库,这是不是在浪费开发成本呢?

我不希望耦合低过头

  抛开这个库存在的意义本身不说,在做这个库的时候我的想法确实有违「低耦合,高内聚」。我希望组件之间存在依赖,比如写一个滚动条控件就应该可以用于所有其他需要滚动条的控件中。这么做分明是提高了其他控件的耦合度,但我还是希望这么做。复制粘贴当然也可以解决问题,但是代码量会多出很多。

高耦合的问题

  到底是该复制粘贴代码还是在控件之间搞依赖关系,这应该取决以以后对这个项目的修改需求。如果都复制粘贴代码,以后就没法统一对所有滚动条做修改过。但是如果只需要修改某个组件的滚动条,可能就需要在组件上覆写滚动条样式(相当于 OOP 中做了一次类继承,子类上 override 吧),如果之后再修改滚动条基类就要考虑所有其子类的兼容,这就是耦合带来的灾难。

分层设计

  也许是我们什么地方搞错了吧?比如存在一个滚动条基类,某系组件直接依赖于这个滚动条基类,有些组件(需要重新滚动条样式的那些)使用了滚动条的子类,这就有点黄飞鸿娶了十三姨的感觉。要是我们能把辈分搞清就不会这么蛋疼了,于是就需要分层。比如让所有基类不用于业务,在基类中放几乎不需要改变的代码,所有业务类都从基类继承,互相引用是业务类的事情。当然,我这里只是简单地分了两层,实际上可能有多层。

关于复制粘贴

  该不该把所有可重用的代码都重用又是个问题,我本人是非常不提倡复制黏贴的,或者就算要复制粘贴,代码不要超出一屏。也就是不要粘贴到太远的地方,更不要跨文件复制粘贴。建议定义到基类的公共方法中,如果真有跨文件需求可以抽取成公共类。或者如果跨项目可以考虑抽取成组件(在 Github 上搞个开源组件更好)。但要是没有复用需求就别去做无意义的抽取,比如我现在正在做的 UI 库,感觉完全是针对某一项目而做的,做成独立的库干嘛?

那么问题来了

  我们说,基类里的东西是几乎不会去修改的。如果是编程语言的话其实确实存在很多这样的东西,而且即使修改也没问题,只要保持接口不变即可。但如果说 CSS 的话,除了 Reset 还有什么可以保证不修改呢?三天一小改,五天一大改,这已经是家常便饭了,要从 CSS 中抽取出基类简直困难到爆。而且 CSS 这东西不仅仅是 CSS 那么简单,还关联了 HTML。从纯静态的前端来看,HTML 就是 Model 层,实际上它和 View 层(CSS)完全无法切断关联嘛。我觉得这些就是为什么 OOP 思想对 CSS 不太管用的原因吧。

网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^