#.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
также есть другие свойства.