Questions tagged «decorator»

6
在实现旁边记录是否违反SRP?
在考虑敏捷软件开发和所有原理(SRP,OCP等)时,我问自己如何对待日志记录。 在实现旁边记录是否违反SRP? 我会说,yes因为该实现也应该能够运行而无需登录。那么如何更好地实现日志记录呢?我检查了一些模式,得出的结论是,最好不要以用户定义的方式违反原则,而是使用已知违反原则的任何模式的最佳方式是使用装饰器模式。 假设我们有一堆完全没有违反SRP的组件,然后我们想要添加日志记录。 成分A 组件B使用A 我们想要记录A,因此我们创建了另一个装饰有A的组件D,都实现了接口I。 接口我 组件L(系统的日志记录组件) 组件A实现I 组件D实现I,修饰/使用A,使用L进行日志记录 组件B使用I 优点:-我可以不使用日志就使用A-测试A意味着我不需要任何日志模拟-测试更简单 缺点:-更多组件和更多测试 我知道这似乎是另一个公开讨论的问题,但我实际上想知道是否有人使用的记录策略比装饰器或SRP违规更好。作为默认NullLogger的静态单例记录器又如何呢?如果需要syslog-logging,则在运行时更改实现对象?

3
在类构造函数中注入数据(相对于行为)意味着什么,为什么这被认为是不好的做法?
我正在阅读Remo Jansen的书“ Learning TypeScript”。在一个部分中,作者描述了如何创建一个非常简单的概念验证MVC框架,包括如何创建Model类,并说了以下几点: 需要向模型提供其使用的Web服务的URL。我们将使用一个名为ModelSettings的类装饰器来设置要使用的服务的URL。我们可以通过其构造函数注入服务URL,但通过类构造函数注入数据(与行为相反)被认为是一种不好的做法。 我不明白那句话。特别是,我不明白“注入数据”的含义。在我看来,在几乎所有使用过度简化示例的JavaScript类介绍中,数据都是通过其参数引入(“注入”?)到构造函数中的。例如: class Person { constructor(name) { this.name = name; } } 我当然想到 name是数据,而不是行为,并且在此类示例中普遍将其作为构造函数参数包含在内,并且从未有人提到这是不好的做法。因此,我认为我误解了上面引用中的某些内容,无论是“数据”还是“注入”或其他含义。 您的答案可能包括在JavaScript / TypeScript中何时,何地,如何以及为什么使用装饰器的解释,因为我强烈怀疑该概念与我寻求的理解密切相关。但是,更重要的是,我想更广泛地理解通过类构造函数注入数据的含义以及为什么这样做很糟糕。 为了使上面的引用有更多的上下文,这是这种情况:Model创建了一个类,在本示例中,该类将用于创建股票交易模型,一个用于NASDAQ,一个用于NYSE。每个模型都需要提供原始数据的Web服务或静态数据文件的路径。该书指出,应该使用装饰器(而非构造器参数)获取此信息,从而导致以下结果: @ModelSettings("./data/nasdaq.json") class NasdaqModel extends Model implements IModel { constructor(metiator : IMediator) { super(metiator); } ... } 我只是一直不明白为什么我应该通过装饰器而不是简单地作为构造函数的参数来添加服务网址,例如 constructor(metiator : IMediator, serviceUrl : string) {...

4
Python中的类装饰器:实际用例
我正在寻找Python类装饰器的实用和非综合用例。到目前为止,对我而言唯一有意义的情况是在发布者-订阅者系统中注册一个类,例如插件或事件,例如: @register class MyPlugin(Plugin): pass 要么 @recieves_notifications class Console: def print(self, text): ... 我一直在考虑的任何其他明智的情况都可以建立在继承,元类或修饰方法之上。您能否分享使用类装饰器的任何好(或坏!)示例? 谢谢!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.