DRY原则的精确性

Preciseness of DRY Principle

过去几周我一直在研究 html/css,现在正尝试使用 DRY 原则(以及 SMACSS/OOCSS/BEM)优化我的代码。我相信我对这一切都有一定的了解,但有一件事我还不清楚。

是否应该 100% 地应用 DRY 原则?例如,假设您将 'text-transform: uppercase;' 应用于两个不同的 class。根据 DRY 原则,您将从每个 class 中删除规则集,并将其放在两个 class 的逗号分隔列表下。但是过了一会儿,这不会让你的风格 sheet 变得一团糟,每个 class 在同一个 sheet 上被声明多次吗?还是您的 sheet 长什么样真的无关紧要,因为如果以后需要任何更改,您只需在搜索框中搜索 "uppercase" 即可?

您似乎不会从这种情况下获得任何性能改进。是的,您会从 sheet 中删除一个 属性,但您也会添加一个全新的规则集并重复 class 名称。

我知道这可以根据偏好和每个项目以任何一种方式完成,但我更关心什么可能是最有效的方式(尤其是在构建大型复杂网站时)。我希望在所有向前推进的项目中保持一致。

是否有任何指导方针可供参考?例如,如果您要删除的属性数量大于 X,也许只合并重复代码?或者仅在语义相关时合并重复代码?

DRY 原则就是 "not repeating yourself"。 如果只有您要处理同一个文件,那么我建议以您可以理解(足够干净)的方式进行编码,这样您就可以在需要时轻松地对其进行编辑。但如果其他人也打算在上面工作,那么保持干净和干燥就更重要了。

您可能会争辩说应用 DRY 原则并不是真正必要的,因为您可以重复自己,代码仍然有效。但是你可能会争论,为什么要使用 Sass(这是一个编译器,可以使你的 css 更短),你可能会争论为什么要压缩你的 css 文件(这样网站加载速度更快) 因为没有它,它仍然可以工作!

我的建议是始终考虑尽可能保持干燥和清洁。在您的示例中,您指出了一个小细节,当您清理 CSS 并且您意识到您只保存了 2 行额外的 CSS 时,DRY 方法不会产生太大影响.但是,如果当你有 10.000 行 CSS 时应用它会怎样?

它让你只定义一次属性。如果您需要一个示例来说明它有多重要以及它可以为您节省多少行代码,请查看:http://www.slideshare.net/jeremyclarke/dry-css-a-dontrepeatyourself-methodology-for-creating-efficient-unified-and-scalable-stylesheets

在较长的 运行 中,它将使您的样式表更加清晰,您和其他人更容易理解,并且更容易编辑! 所以我想说它非常重要,如果你能从一开始就深入了解它,你以后会非常感激:)

如果您针对可维护性进行了优化,而不是严格遵守任何特定教条,之后阅读您代码的程序员将会感谢您。

请不要误会。 DRY 很重要,但您应该通过简单完整性检查的变体来调整它(或任何其他设计模式):"Does this make sense?"。在 DRY 的情况下,这将类似于 "Are these actually related?".

如果答案是 "yes",强烈暗示如果 class 中的一个要删除 text-transform:uppercase;,另一个也会删除它,那么一定要把它提取出来。

如果答案是 "no",那么您实际上会使以后的维护变得更加困难,因为您需要取消两个 class 之间的人为耦合。

在这种情况下,简单地列出使用特定属性的 classes 的洗衣清单是假的 DRY,因为您肯定是在重复自己。重复只是从属性移动到 class.

Should the DRY principle be applied 100% of the time?

不,这不是故意的。

DRY 用于管理规范的信息源。 DRY是为了避免"this information appears twice but isn't the same - which is correct?".

的问题

与 DRY 之间没有区别:

.foo { text-transform: uppercase; color: red  } 
.bar { text-transform: uppercase; color: blue } 

.foo { color: red  } 
.bar { color: blue } 
.foo, bar { text-transform: uppercase; } 

因为 text-transform: uppercase 实际上是一个信息单元。 DRY 的目的不是让编码人员通过重构重复的字符串来复制压缩算法,而是识别多次表达相同语义关系的地方。

如果 .foo.bar 都用于需要大写的角色,则可能值得使用后一条规则,因为您可能希望同时更改两者。但是,如果它们用于两种不同的事情,而这两种事情恰好都需要大写,那么请使用前者的规则,因为没有理由改变一个就必须改变后者。

对于这个特定的例子和 CSS 更普遍的例子,一切都非常重要。