作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想在我的“小”项目中使用 OCP 规则。实际上我在实现这个问题时遇到了问题。让我告诉你我写了什么。
abstract class AnimationType {
public abstract createAnimation(timing: number): { in: string, out: string };
}
class FadingAnimation extends AnimationType {
public createAnimation(timing: number): { in: string, out: string } {
return { in: 'opacity: 0', out: 'opacity: 1' }
}
}
class TransformAnimation extends AnimationType {
public createAnimation(timing: number): { in: string, out: string } {
return { in: 'transform: translateX(-100%)', out: 'transform: translateX(100%)' }
}
}
class AnimationCreator {
private timing: number;
constructor(time: number) {
this.timing = time;
}
getAnimation(animation: AnimationType): { in: string, out: string } {
return animation.createAnimation(this.timing);
}
}
我写的好吗?如果我这样做了,那我究竟得到了什么?如果我想添加这个动画,我需要发送 FadingAnimation 类的对象。如果我想要转换动画,我需要发送 TransformAnimation 类的对象 - 所以我必须在某个地方使用 switch(this.animationType)。
最佳答案
原则和模式绝对可以在语言之间转移。当您跨越范式的界限时,它们可能不太适用。 SOLID 原则和 OOP 模式适用于任何面向对象,而不仅仅是 Java。
请记住,TypeScript/JavaScript 不仅仅是面向对象的。
问题不在于您试图借鉴来自其他语言的原则。这里的问题是您试图从原理开始。
良好的代码设计,无论您使用什么范式,都始于您想要解决的问题。在寻找模式或应用原则之前编写更多代码,这样设计就可以从您在应用程序增长时发现的实际问题中浮现出来。
从原则开始,您就过早地决定问题最终可能是什么;并且您的设计可能会使您离整洁代码的目标更远。
模式和原则具有高度可移植性,但请等待出现问题的信号,而不是过早地应用一些解决方案。
在你的情况下,你可以用最简单的方法解决问题。如果您有测试来指导您,您可以稍后轻松更新实现细节。
也许在您的情况下,一个简单的字典/对象就足够了。
const animationType = {
fading: {
in: 'opacity: 0',
out: 'opacity: 1'
},
transforming: {
in: 'transform: translateX(-100%)',
out: 'transform: translateX(100%)'
}
};
如果你不想强制执行 fading
和 transforming
,你可以输入这个来允许任何键 - 但你不需要添加这种灵 active :
interface AnimationTypes {
[key: string]: { in: string, out: string };
}
关于Typescript - 开闭原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49993793/
我是一名优秀的程序员,十分优秀!