我有一个对象,我希望它在创建后只读...也就是说,因为构造函数中的属性必须在GetHashCode中使用,因此一旦创建就不能更改。我这是许多只读类之一:publicclassAccountLabel{privatestringresult;publicAccountLabel(stringresult){//TODO:Completememberinitializationthis.result=result;}publicstringJSONRPCData{get{returnthis.result;}}}我有一个像这样的通用结果类publicclassJsonResultwhere
我有一个对象,我希望它在创建后只读...也就是说,因为构造函数中的属性必须在GetHashCode中使用,因此一旦创建就不能更改。我这是许多只读类之一:publicclassAccountLabel{privatestringresult;publicAccountLabel(stringresult){//TODO:Completememberinitializationthis.result=result;}publicstringJSONRPCData{get{returnthis.result;}}}我有一个像这样的通用结果类publicclassJsonResultwhere
如果标题不是完全不言自明的,下面是令我困惑的代码:publicinterfaceIFoo{}publicclassMyClass:IFoo{privateclassNestedInMyClass{}}我很惊讶这个编译没有错误。感觉我在暴露一个private类型。这不应该是违法的吗?也许您的答案只是“没有反对的规则,那为什么不可以呢?”也许同样令人惊讶的是MyClass.NestedInMyClass甚至在“范围内”。如果我删除MyClass.资格,它不会编译。(如果我将IFoo更改为通用类,它应该成为MyClass的基类,这是非法的,因为基类型必须是至少与类型本身一样易于访问。)我用V
如果标题不是完全不言自明的,下面是令我困惑的代码:publicinterfaceIFoo{}publicclassMyClass:IFoo{privateclassNestedInMyClass{}}我很惊讶这个编译没有错误。感觉我在暴露一个private类型。这不应该是违法的吗?也许您的答案只是“没有反对的规则,那为什么不可以呢?”也许同样令人惊讶的是MyClass.NestedInMyClass甚至在“范围内”。如果我删除MyClass.资格,它不会编译。(如果我将IFoo更改为通用类,它应该成为MyClass的基类,这是非法的,因为基类型必须是至少与类型本身一样易于访问。)我用V
在遵循我工作场所“架构师”传下来的错误做法并认为必须有更好的方法几年之后,我最近一直在阅读有关TDD和DDD的文章,我认为这些原则和实践非常适合我们编写的软件的复杂性。但是,我见过的许多TDD示例都在域对象上调用方法,然后测试该对象的属性以确保行为正确执行。另一方面,业内几位受人尊敬的人(GregYoung最引人注目的是他关于CQRS的演讲)提倡通过移除所有“getter”来完全封装每个领域对象。因此,我的问题是:如果禁止检索域对象的状态,如何测试域对象的功能?我相信我缺少一些基本的东西,所以请随时称我为白痴并启发我-任何指导将不胜感激。 最佳答案
在遵循我工作场所“架构师”传下来的错误做法并认为必须有更好的方法几年之后,我最近一直在阅读有关TDD和DDD的文章,我认为这些原则和实践非常适合我们编写的软件的复杂性。但是,我见过的许多TDD示例都在域对象上调用方法,然后测试该对象的属性以确保行为正确执行。另一方面,业内几位受人尊敬的人(GregYoung最引人注目的是他关于CQRS的演讲)提倡通过移除所有“getter”来完全封装每个领域对象。因此,我的问题是:如果禁止检索域对象的状态,如何测试域对象的功能?我相信我缺少一些基本的东西,所以请随时称我为白痴并启发我-任何指导将不胜感激。 最佳答案
publicclassDemo{privateList_items;privateListItems{get{if(_items==null)_items=ExpensiveOperation();return_items;}}}Demo类中的其他方法将有权访问_items字段。由于我使用属性来延迟加载项目,我不希望其他开发人员错误地尝试使用_items字段。我知道有ObsoleteAttribute我可能会使用,但这个字段在技术上并没有过时。是否有更好的方法将成员标记为“请勿使用”? 最佳答案 虽然这不是您想要做的事情的通用技术(
publicclassDemo{privateList_items;privateListItems{get{if(_items==null)_items=ExpensiveOperation();return_items;}}}Demo类中的其他方法将有权访问_items字段。由于我使用属性来延迟加载项目,我不希望其他开发人员错误地尝试使用_items字段。我知道有ObsoleteAttribute我可能会使用,但这个字段在技术上并没有过时。是否有更好的方法将成员标记为“请勿使用”? 最佳答案 虽然这不是您想要做的事情的通用技术(
classTestClass{privatestring_privateString="hello";voidChangeData(){TestClassotherTestClass=newTestClass();otherTestClass._privateString="world";}}此代码在C#中编译,等效代码在PHP中运行,但有人可以解释为什么可以在此处更改otherTestClass._privateString的原因吗?我原以为类的实例在任何情况下都不能更改私有(private)成员变量,并且尝试访问otherTestClass._privateString会给出“由于
classTestClass{privatestring_privateString="hello";voidChangeData(){TestClassotherTestClass=newTestClass();otherTestClass._privateString="world";}}此代码在C#中编译,等效代码在PHP中运行,但有人可以解释为什么可以在此处更改otherTestClass._privateString的原因吗?我原以为类的实例在任何情况下都不能更改私有(private)成员变量,并且尝试访问otherTestClass._privateString会给出“由于