Лучшие практики Object — Property

#.net #oop #properties

#.net #ооп #свойства

Вопрос:

Мне действительно нравится иметь возможность организовывать мои объекты подобным образом, где Source это собственный объект внутри Document объекта.

СПОСОБ # 1

 Dim doc As New Process.Document()
doc.Source.Type = "URL"
doc.Source.Data = "http://myOtherDomain/MyOtherPage.htm"
  

<Просмотреть # 1 вставленный полный код>

Однако, лучше ли делать что-то подобное?

СПОСОБ № 2

 Dim doc As New Process.Document()
doc.SourceType = "URL"
doc.SourceData = "http://myOtherDomain/MyOtherPage.htm"
  

<Просмотреть #2 вставленный полный код>

Причина, по которой я спрашиваю, заключается в том, что это немного сбивает с толку первый метод, потому что вы получаете это:

Process.Document.DocumentSource и doc.Source

Я думаю, что в методе # 1, Process.Документ.DocumentSource является избыточным, имея документ дважды, и хотелось бы, чтобы был способ скрыть этот объект от выбора в выпадающем списке intellisense пользователем сборки.

Но, с другой стороны, если у вас МНОГО свойств, кажется, лучше иметь возможность группировать их в подобъекты, как это делает метод # 1, чтобы у вас не было сотни свойств, перечисленных в выпадающем списке Intellisense.

Ответ №1:

Закон Деметры гласит, что метод № 2 — это правильный путь, учитывая только эти два варианта.

Третьим методом могло бы быть предоставление Source объекта вместо настройки doc.Source.XYZ .

 // C# -- don't know VB.Net
var source = new DocumentSource();
...

doc.Source = source;
  

Четвертым методом было бы эффективное внедрение конструктора, если Source требуется.

 var source = new DocumentSource();
...
var doc = new Process.Document(source);
  

Комментарии:

1. Ссылка на «Закон Деметры» — это именно то, что я искал. Я не думаю, что мне угрожает что-либо, от чего он на самом деле пытается защититься в моей ситуации, но я хотел бы рискнуть использовать лучшие практики, когда это возможно, и это, кажется, дает веские основания не использовать метод # 1. Я так понимаю, мне следует применить то же правило и к Process.Documents.add(doc) строке, правильно? Что подводит меня к другому вопросу. Должен ли я поместить все объекты, подобные DocumentSource и DocumentCollection , на верхний уровень пространства имен? И вызывать их ProcessDocumentSource и т.д. Вместо этого?

2. Повторите другие классы: вы, вероятно, хотите, чтобы они были на более высоком уровне.

Ответ №2:

Первый метод хорош и вообще не должен портить Intellisense. Process.Document.DocumentSource — это тип (поскольку вы используете вложенные классы), а doc.Source — это свойство.

Тем не менее, обычно рекомендуется не использовать вложенные классы, особенно если они общедоступны. Я думаю, что на этот счет также есть правило FxCop. Перемещение Document класса из Process и DocumentSource удаление класса из Document приведет к приятной очистке.

Ответ №3:

Я бы попытался организовать их в логические объекты. Если Type и Data являются свойствами, которые принадлежат логической сущности Source , я бы, вероятно, использовал ваш метод # 1. Если бы Type и Data были больше связаны с документом, я бы сохранил его там.

То, что вам кажется наиболее правильным, вероятно, должно быть вашим окончательным выбором. В этом случае. Метод # 1 кажется мне подходящим. Особенно, если у Source также есть другие свойства.