2013-05-29 3 views
2

Предположим, я разрабатываю класс Person.Использование встроенных классов для группировки связанных свойств

Уместно ли использовать встроенный класс для группировки подобных свойств этого человека?

Например, у человека есть вес, высота, цвет волос и цвет глаз.

Вместо того, чтобы висит эти свойства непосредственно у человека, что делать, если я создал класс PersonPhysicalAttibutes, который имел эти свойства.

Так что, когда вам нужно установить высоту человека, вы будете использовать

personA.PhysicalAttributes.Height = 6.1; 

ли вы сказать, что это выполнимый дизайн?

EDIT:

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

Однако я выбрал физические атрибуты в качестве примера по причине. Мой вопрос в том, имеет ли смысл разбить их на другой класс, если вы уверены, что этот класс не будет использоваться ни в каком другом контексте? Строго для простоты intellisense/grouping.

ответ

1

Это зависит от случая к случаю. Если у вас есть группа свойств, так что все они или большинство из них изменяются вместе (короче, свойства имеют сильное связывание сами по себе), тогда целесообразно перемещать их в другой класс. Например, у человека есть адрес, который содержит houseNo, street, city, zipcode. Эти свойства представляют собой группу, которая может быть связана с Личностью, но может существовать вместе как группа. Поэтому включение их в класс Person было бы неуместным. Вместо этого вы должны создать для них другой класс, называемый Адрес и связать адрес с личностью. Но вес, eyeColor, hairColor, высота все они являются независимыми свойствами. Естественно, они не образуют группу вместе. Лучше, чтобы они оставались связанными с классом Person как индивидуальные, независимые свойства. Если вы решительно создадите подгруппу, подобную той, которую вы упомянули PhysicalAttributes, вы часто сталкиваетесь с ситуацией, когда вы будете нарушать закон Деметры.

0

Это было бы нарушением правил Law of Demeter. В частности, проектируя его таким образом, вы фактически связываете код с кодом как с вашим классом Person , так и с классом PersonPhysicalAttributes, тем самым делая более сложным изменение кода.

Я бы не стал делать этот подход лично.

0

Не только это уместно, желательно разбить большой класс на более мелкие классы. Однако рассмотрите свое название. Было бы наиболее целесообразно составлять Лицо таких объектов, как

Physique { Height, Weight, ... } 
Face { EyeColor, HairColor, ... } 
Psyche { Iq, Mood, ... } 
Смежные вопросы