深度克隆以实现适当的封装

时间:2016-06-03 16:59:27

标签: c# clone immutability encapsulation deep-copy

我遇到了关于正确封装方式的article。它确实引起了我的注意并解决了我以前的一些困惑。然后我想到了它的实现。不得有任何属性或(getter方法)暴露任何公共引用。为了实现这一点,每个内场必须新建。但是,并不总是可以知道构造逻辑,甚至找不到合适的构造函数。所以我认为深度克隆可能会用于此目的。

有一些方法可以实现深度克隆(one waysome other ways)。

我的问题是:

1-我的方法是否有意义还是完全无稽之谈?

2-深度克隆操作是危险还是不确定?如果是,那么对于这样的核心模块(商业模式获取者)使用这种动态(或不确定)行为是否合适?

PS:即使文章中使用了Java,我也会问.NET或C#的问题。我不太确定,但Java可能具有不同的深度克隆能力。我对Java感到不舒服。

1 个答案:

答案 0 :(得分:3)

Java和C#足够接近,其含义相同。

对我来说,这篇文章最好不要发表,因为它唯一能让人迷惑并将它们发送到像#34;我需要深入克隆界面中所有暴露的对象,这样他们才能& #39; t被改变。"

这不是封装的本质。封装的本质是这样的 - 例如 - 给定公共生日的年龄计算不会暴露:

class foo {
    public DateTime Birthdate { get;set;}
    public int Age { get { return (DateTime.Now - Birthdate).ToYears(); } }
}

因此,"内部运作"如何计算年龄不会暴露。或者更确切地说,该逻辑是封装的

现在,有时您可能确实希望确保暴露的对象完全不可变,但总的来说,那就是垃圾。 (深度克隆不是简单的壮举,在所有,并且本文没有足够的洞察力来解决问题的更广泛的范围,以便做任何好事。)

放弃深入克隆暴露的所有内容的想法,并且只使用其中包含的逻辑编写类,并且您将具有足够的封装以用于绝大多数目的。

OOP概念应始终采用非常健康的实用主义。