我们使用ASP.NET和C#,基于我通过的开源项目/文章,我发现许多属性中包含逻辑。但是当我这样做时,团队领导告诉我,在属性中放置逻辑并不好,而是要通过方法调用逻辑...
那真的很糟糕吗?为什么不在属性中使用逻辑?
谢谢。
属性访问应该是即时的(没有长时间等待),一致的(没有改变的值)和安全的(没有异常)。如果您能保证这些条件,我认为在属性中放置逻辑是可以的。
在属性中加入一些逻辑通常是可以的。例如,在setter中进行参数验证和在getter中进行惰性计算都是相当常见的。
然而,像数据库调用这样的昂贵操作在属性访问中通常不是一个好主意。开发人员倾向于假设属性的评估成本是相当低廉的。
最终需要做出判断 - 但我肯定拒绝了建议,即属性只应该是微不足道的,以至于它们可以使用自动属性来实现。
Product
有一个 Supplier
,而一个 Supplier
又有一系列的 Products
。在对象构建期间应该加载这些关联实体吗?还是在首次访问属性时?又或者由于这两种选择都存在问题,它们不应该通过属性进行访问? - Anthony Pegram这里有一个常见的答案:要看情况。
通常,在getter和setter方法中实现业务逻辑并不是一个好主意。如果你的对象只是一个简单的数据传输对象(DTO),那么这将违反单一职责原则。
然而,状态跟踪逻辑和其他维护工作通常会在属性中找到。例如,Entity Framework 4自跟踪实体在每个基本属性的setter中都有状态管理逻辑,以便进行跟踪。
属性中逻辑的替代方案是面向切面编程(AOP)。使用AOP,您可以在对象和托管进程之间“注入”逻辑。可以“拦截”对对象的访问并有条件地处理。
value
值是否相同,然后发送一个控制台命令来改变玩家的队伍为value
值。 - ZackSqlServerPerson
,那么当您更改ORM/DB访问时,将其替换为例如NHibernatePerson
可能会很困难。