2016-06-03 2 views
-1

Я столкнулся с article о правильном способе инкапсуляции. Это действительно привлекло мое внимание и решило часть моей прежней путаницы. Тогда я подумал об этом. Не должно быть никакого свойства или (метода геттера), которые раскрывают какую-либо общую ссылку. Чтобы достичь этого, каждое внутреннее поле должно быть построено свеже. Но не всегда возможно знать конструктивную логику или даже найти подходящий конструктор. Поэтому я подумал, что для этой цели можно использовать глубокое клонирование.Глубокое клонирование для достижения правильной инкапсуляции

Есть несколько способов добиться глубокого клонирования (one way, some other ways).

Мои вопросы:

1- ли мой подход имеет смысл, или это полностью нонсенс?

2- Являются ли операции глубокого клонирования опасными или неопределенными? Если да, правильно ли было бы использовать такое динамическое (или неопределенное) поведение для такого основного модуля (на основе бизнес-моделей getters)?

PS: Даже если Java используется в статье, я задаю вопросы для .NET или C#. Я не уверен, но у Java могут быть разные возможности глубокого клонирования. Я не чувствую себя комфортно с Java.

ответ

3

Java и C# достаточно близки, где последствия одинаковы.

Для меня эта статья будет лучше опечалена без публикации, поскольку единственное, что она служит, это запутать людей и отправить их по путям типа «Мне нужно глубоко клонировать все мои выставленные объекты в интерфейсе, чтобы они не могли быть изменен."

Это не суть инкапсуляции. Суть капсулирования такова, что - например - расчет для век, учитывая общественную дату рождения, не подвергается:

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

Таким образом, «внутренняя работа» о том, как возраст исчисляется не подвергается. Вернее, эта логика инкапсулирована

Теперь могут быть моменты, когда вы действительно хотите убедиться, что выставленный объект абсолютно непреложный, но на общем, это мусор. (глубокое клонирование - это не простой подвиг, вообще, и эта статья не дает достаточной информации для более широкой сферы проблемы, чтобы сделать кого угодно).

Оставьте идею глубокого клонирования всего, что открывается, и просто напишите свои классы с логикой, содержащейся внутри, и у вас будет инкапсуляция достаточно хорошо для подавляющего большинства целей.

Концепции ООП всегда должны приниматься с очень здоровой дозой прагматизма.

+0

спасибо. Вы правы, что эту концепцию нельзя использовать, как серебряную пулю. Но я понял, что это имеет значение. Из-за этой проблемы я несколько раз застрял. Я описал его как «ссылочное отравление», но я не смог его правильно решить. –

Смежные вопросы