Tag: 封装

C#:封装例如集合

我想知道哪一个被认为是最干净或最好用的,为什么。 其中一个公开了一个乘客列表,让用户添加和删除等。另一个隐藏列表,只让用户枚举它们并使用特殊方法添加。 例1 class Bus { public IEnumerable Passengers { get { return passengers; } } private List passengers; public Bus() { passengers = new List(); } public void AddPassenger(Passenger passenger) { passengers.Add(passenger); } } var bus = new Bus1(); bus.AddPassenger(new Passenger()); foreach(var passenger in bus.Passengers) Console.WriteLine(passenger); 例2 class Bus { public List Passengers { […]

TDD,DDD和封装

经过几年跟随我工作地点的“建筑师”传下来的不良做法并认为必须有更好的方法,我最近一直在阅读TDD和DDD,我认为原则和实践将是一个非常适合我们编写的软件的复杂性。 但是,我见过的许多TDD示例都在域对象上调用一个方法,然后测试对象的属性以确保正确执行行为。 另一方面,业内几位受人尊敬的人(Greg Young最着名的是关于CQRS的讨论)主张通过删除所有“getters”来完全封装每个域对象。 因此,我的问题是:如果禁止检索域状态,如何测试域对象的function? 我相信我错过了一些基本的东西所以请随时称我为白痴并启发我 – 任何指导都将不胜感激。

一个安全地提供公共API(只读)和私有API(读写)的对象

这是一个架构问题。 程序员经常遇到这种封装问题,但我还没有看到一个完整而干净的解决方案。 相关问题: 当一个非只读类已经到位时,只读类设计 控制对字段的读/写访问 通常,在OOP范例中,对象将其数据存储在字段中。 该类自己的方法可以完全访问其字段。 当您需要返回值时,您只需返回数据的副本,以便外部代码不会破坏数据。 现在假设数据块很复杂,因此它们本身就封装在类对象中,并且这些对象不容易被复制。 现在,如果从某个属性返回此类对象,则外部代码对您的内部代码具有相同的访问权限。 例如,如果返回List ,则每个人都可以向其添加值。 这通常是不合需要的。 这个问题通常使用只读包装器 – 在返回之前将完全访问的内部对象包装在只读包装器中。 这种方法的问题是包装器可能是包装值的不良替换 – 包装器是一个不同的类。 (如果从可修改的类派生只读包装器(或反之亦然),那么任何人都可以将“只读”对象向上/向下转换为可修改对象,从而破坏保护。) 我想要一个模式: 数据(例如, int值)具有“public / read-only API”和“private / modifiable API”。 只有对象创建者才能访问“私有/可修改的API”。 私有/公共API可以具有被动部分(例如方法,属性)和活动部分(例如事件)。 除了在对象创建阶段,不应使用代理。 所有电话都应该是直接的。 从“公共/只读API”(以及最好来自“私有/可修改的API”)访问内部数据应该尽可能直接。 在编写这样的对象时,我不希望堆积大量的包装器。 以下是示例界面: interface IPublicApi { int GetValue(); } interface IPrivateApi { void SetValue(int value); } interface IPrivateConsumer { void OnValueChanged(); //Callback […]

访问dll方法

我为我的客户准备了一些C#dll来做一些function。 问题是我也使用相同的DLL。 我怎样才能为他提供一些方法以及我可用的所有方法。 谢谢,

将枚举值与本地化字符串资源相链接

相关: 从枚举属性获取枚举 我希望以最可维护的方式绑定枚举,并将它与关联的本地化字符串值相关联。 如果我把枚举和类放在同一个文件中,我觉得有些安全,但我必须假设有更好的方法。 我也考虑过将enum名称与资源字符串名称相同,但我担心我不能总是在这里强制执行。 using CR = AcmeCorp.Properties.Resources; public enum SourceFilterOption { LastNumberOccurences, LastNumberWeeks, DateRange // if you add to this you must update FilterOptions.GetString } public class FilterOptions { public Dictionary GetEnumWithResourceString() { var dict = new Dictionary(); foreach (SourceFilterOption filter in Enum.GetValues(typeof(SourceFilterOption))) { dict.Add(filter, GetString(filter)); } return dict; } public String GetString(SourceFilterOption […]

如何使引用类型属性“readonly”

我有一个类Bar ,其中包含一个包含引用类型Foo的私有字段。 我想在公共财产中暴露Foo ,但我不希望财产的消费者能够改变Foo ……但是它应该由Bar内部改变,即我不能使该字段readonly 。 所以我想要的是: private _Foo; public Foo { get { return readonly _Foo; } } ……当然无效。 我可以返回一个Foo的克隆(假设它是IClonable ),但这对消费者来说并不明显。 我应该将属性的名称更改为FooCopy吗? 它应该是GetCopyOfFoo方法吗? 你认为最佳做法是什么? 谢谢!

为什么私有成员变量可以被类实例更改?

class TestClass { private string _privateString = “hello”; void ChangeData() { TestClass otherTestClass = new TestClass(); otherTestClass._privateString = “world”; } } 这段代码在C#中编译,并且在PHP中等效,但有人可以解释为什么可以在这里更改otherTestClass._privateString的原因吗? 我原以为一个类的实例在任何情况下都不应该能够更改私有成员变量,并且尝试访问otherTestClass._privateString会导致“由于保护级别而无法访问”错误。 但事实并非如此,那么为什么在自己的类中实例化一个对象可以让你访问私有成员呢? 如果它,这不会破坏封装到一定程度? 还是我错过了一些明显的东西? (我不是在问上面的类设计是不是很好的做法,只是想知道它背后的理论。) 编辑 – 感谢您的回答和评论。 为了澄清,我也有兴趣知道能否做到这一点被认为是一个积极的function,或者它是否是更好的编译时检查/代码清晰度的必要权衡/因为大多数其他语言都是这样做或者其他什么。 在我看来,理想情况下编译器会阻止或警告你这个,但后来我远离语言设计师。 任何有关它如何通过这种方式的例子都可以让你做一些有用的事情(不会违反封装),否则很难或不可能。

内部使用属性有什么好处?

当从类外部访问成员时,封装显然是有用且必不可少的,但是当在内部引用类变量时,调用其私有成员或使用其getter更好吗? 如果你的getter只是返回变量, 那么性能是否存在差异 ?

用于创建简单且高效的值类型的模式

动机: 在阅读Mark Seemann关于Code Smell:Automatic Property的博客时,他说接近结尾: 底线是自动属性很少适用。 实际上,只有当属性的类型是值类型并且允许所有可想到的值时,它们才适用。 他给int Temperature作为一个难闻的气味的例子,并建议最好的修复是单位特定值类型,如摄氏。 所以我决定尝试编写一个自定义的Celsius值类型,它封装了所有边界检查和类型转换逻辑,作为更加SOLID的练习。 基本要求: 不可能有无效的价值 封装转换操作 有效的应对(相当于替换它的int) 尽可能直观地使用(尝试int的语义) 执行: [System.Diagnostics.DebuggerDisplay(“{m_value}”)] public struct Celsius // : IComparable, IFormattable, etc… { private int m_value; public static readonly Celsius MinValue = new Celsius() { m_value = -273 }; // absolute zero public static readonly Celsius MaxValue = new Celsius() { m_value […]