Эксперт .NET
4431 / 2091 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
1

Класс Person для контактов. Какие свойства добавить в него можно (к существующим)?

10.10.2011, 22:27. Показов 1930. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил одну свою прогу полностью переписать по новой (опыта больше, старый код с косяками, решил по новой нормально сделать с большим функционалом).

Вот решил добавить контакты и думаю, какие данные вообще добавить помимо тех, что уже есть в классе? И стоит ли в класс пихать огромное кол-во свойств с данными о контакте, может есть другие подходы?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    public class Person
    {
        public Person(DateTime birthDay, string firstName, string secondName, string patronymic)
        {
            FirstName = firstName;
            Surname = secondName;
            Patronymic = patronymic;
            BirthDay = birthDay;
        }
 
        /// <summary>Имя</summary>
        public string FirstName { get; set; }
        /// <summary>Фамилия</summary>
        public string Surname { get; set; }
        /// <summary>Отчество</summary>
        public string Patronymic { get; set; }
        /// <summary>Дата рождения</summary>
        public DateTime BirthDay { get; private set; }
        /// <summary>Домашний адрес</summary>
        public string Address { get; set; }
        /// <summary>Страна</summary>
        public string Country { get; set; }
        /// <summary>Мобильный телефон</summary>
        public string MobilePhone { get; set; }
        /// <summary>Домашний телефон</summary>
        public string HomePhone { get; set; }
 
        public uint Age //Потом буду высчитывать возраст из даты рождения
        {
            get ; 
        }
    }
Добавлено через 1 час 11 минут
Я вот всё не могу решить, как сделать. Сделать свойства:
C#
1
2
3
4
5
6
7
8
9
10
        /// <summary>Город</summary>
        public string City { get; set; }
        /// <summary>Домашний адрес (улица, дом, корпус, квартира)</summary>
        public string Address { get; set; }
        /// <summary>Область</summary>
        public string Region { get; set; }
        /// <summary>Индекс или ZipCode</summary>
        public string ZipCode { get; set; }
        /// <summary>Страна</summary>
        public string Country { get; set; }
Или полный адресс сразу в одном
поле
(по сути данные в поле храняться, свойство это обёртка)
содержать?
C#
1
2
3
4
5
6
        /// <summary>Полный домашний адрес (Город, регион, улица, дом, корпус, квартира)</summary>
        public string Address { get; set; }
        /// <summary>Индекс или ZipCode</summary>
        public string ZipCode { get; set; }
        /// <summary>Страна</summary>
        public string Country { get; set; }
Программа ориентирована не на организацию, а на обычных людей, пользователей интернета, то есть добавил контакт (своего знакомого) и теперь можешь использовать другие функции завязанные на контакте. Сам вот думаю, в принципе не вижу, когда мне может понадобится сортировка например по городам или регионам, врятли у юзера столько знакомых, что аж сортировать придётся.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2011, 22:27
Ответы с готовыми решениями:

Как можно в форму VBA вставить MSFlexGrid? какие у него есть свойства и методы?
Можно ли в форму VBA в Excel вставить MSFlexGrid? Какие свойства и методы можно применять к нему?

Создайте класс person. Создайте тип people, описывающий массив элементов типа person.
Создайте класс person. У него должны быть поля: name: string; sex: (&quot;муж&quot;, &quot;жен&quot;); height:...

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

Создать класс Person для ввода фамилии и имя человека
Здравствуйте. Что-то не получается, ошибки выскакивают, именно в заголовочном файле при...

13
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
10.10.2011, 23:02 2

Не по теме:

В Windows есть стандартная адресная книга.


Не по теме:

Имхо, лучше класс заменить на структуру.


Я бы еще добавил факс, электронную почту, аську, скайп, etc. Стоит так же заметить, что у некоторых их бывает несколько штук как и номеров мобильного телефона.
Цитата Сообщение от Casper-SC Посмотреть сообщение
Или полный адресс сразу в одном поле содержать?
А что мешает адрес сделать структурой, в которой хранить улицу, дом, etc.

Как по мне, еще не хватает группы. Чтобы различать там "друзья", "родственники", "коллеги по работе", etc и предоставлять список в соответствии с этими группами.
0
Эксперт .NET
4431 / 2091 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.10.2011, 23:42  [ТС] 3
Цитата Сообщение от Blood-Angel Посмотреть сообщение
Имхо, лучше класс заменить на структуру.
Почему лучше?

Добавлено через 50 секунд
Цитата Сообщение от Blood-Angel Посмотреть сообщение
Как по мне, еще не хватает группы. Чтобы различать там "друзья", "родственники", "коллеги по работе", etc и предоставлять список в соответствии с этими группами.
Наверное лучше сделать в виде перечисления?

Добавлено через 3 минуты
Цитата Сообщение от Blood-Angel Посмотреть сообщение
факс, электронную почту, аську, скайп, etc
Ок, это я добавлю. А вот насчёт
etc
(и так далее)
вот именно я и не знаю, что же там можно добавить. Ну можно имя в AIM, имя в MSN.

Кстати эти все дополнительные данные может тоже организовать в виде структуры?

Добавлено через 27 минут
Цитата Сообщение от Blood-Angel Посмотреть сообщение
Стоит так же заметить, что у некоторых их бывает несколько штук как и номеров мобильного телефона.
То есть лучше вообще массивы хранить чтоли?
Вместо:
C#
1
string icq;
Лучше:
C#
1
string[] icqCollection;
0
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
10.10.2011, 23:47 4
Цитата Сообщение от Casper-SC Посмотреть сообщение
Почему лучше?
Различий очень много. Самые значимые то, что структура работает быстрее и съедает меньше ресурсов. (Не буду вникать в дерби о хранении в памяти и другой ереси)

Цитата Сообщение от Casper-SC Посмотреть сообщение
Наверное лучше сделать в виде перечисления?
Да, если не предусмотрено добавление новых групп.

Цитата Сообщение от Casper-SC Посмотреть сообщение
Кстати эти все дополнительные данные может тоже организовать в виде структуры?
Выигрыша никакого не будет, но с точки зрения архитектуры приложения, можно всю информацию разбить на логические части под какой-нибудь паттерн. Такой код далее будет просто масштабировать и отлаживать.

Цитата Сообщение от Casper-SC Посмотреть сообщение
что же там можно добавить
Перечислил все, что пришло в голову.

Цитата Сообщение от Casper-SC Посмотреть сообщение
То есть лучше вообще массивы хранить чтоли?
Та хранить можно и в одном string при желании, разделяя номера к примеру символом ";". Как считаете нужным, так и делайте - это же ваш проект.
0
Эксперт .NET
4431 / 2091 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
11.10.2011, 00:19  [ТС] 5
Цитата Сообщение от Blood-Angel Посмотреть сообщение
Та хранить можно и в одном string при желании, разделяя номера к примеру символом ";". Как считаете нужным, так и делайте - это же ваш проект.
Вот именно, хочу спроектировать изначально нормально.

Вот пока пришёл к этому (у меня по мере написания постоянно что-то меняется, пока не приду к нужному результату):
Person.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
    public class Person
    {
        short _age;
        DateTime _birthDay;
 
        public Person(DateTime birthDay, string firstName, string secondName, string patronymic)
        {
            Name = new FullName(firstName, secondName, patronymic);
            //FirstName = firstName;
            //Surname = secondName;
            //Patronymic = patronymic;
            _birthDay = birthDay;
            _age = short.MinValue;
        }
 
        public Person(DateTime birthDay, string firstName, string secondName)
            : this(birthDay, firstName, secondName, string.Empty)
        {
        }
 
        /// <summary>Полное имя</summary>
        public FullName Name { get; set; }
 
        /// <summary>Дата рождения</summary>
        public DateTime BirthDay 
        {
            get { return _birthDay; }
            set { _birthDay = value; _age = short.MinValue; /*Чтобы возраст пересчитался (не уверен будет ли как надо работать, надо тестировать)*/ }
        }
 
        /// <summary>Электронная почта</summary>
        public string Email { get; set; }
 
        /// <summary>Город</summary>
        public string City { get; set; }
 
        /// <summary>Домашний адрес (улица, дом, корпус, квартира)</summary>
        public string Address { get; set; }
 
        /// <summary>Область</summary>
        public string Region { get; set; }
 
        /// <summary>Индекс или ZipCode</summary>
        public string ZipCode { get; set; }
 
        /// <summary>Страна</summary>
        public string Country { get; set; }
 
        /// <summary>Мобильный телефон</summary>
        public string MobilePhone { get; set; }
 
        /// <summary>Домашний телефон</summary>
        public string HomePhone { get; set; }
 
        /// <summary>Факс</summary>
        public string Fax { get; set; }
 
        /// <summary>Возраст</summary>
        public short Age 
        {
            get
            {
                if (_age == short.MinValue)
                {
                    DateTime dateNow = DateTime.Now;
                    int age = dateNow.Year - BirthDay.Year;
                    if (dateNow.Month < BirthDay.Month || (dateNow.Month == BirthDay.Month && dateNow.Day < BirthDay.Day))
                        --age;
                    _age = (short)age;
                }
                return _age;
            }
        }
    }
}


FullName.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    public struct FullName
    {
        string _firstName;
        string _surname;
        string _patronymic;
 
        /// <summary>Имя</summary>
        public string FirstName 
        {
            get { return _firstName; }
            set { _firstName = value; } //Я понимаю почему это тут не нужно, пока оставил
        }
 
        /// <summary>Фамилия</summary>
        public string Surname
        {
            get { return _surname; }
            set { _surname = value; } //Я понимаю почему это тут не нужно, пока оставил
        }
 
        /// <summary>Отчество</summary>
        public string Patronymic
        {
            get { return _patronymic; }
            set { _patronymic = value; } //Я понимаю почему это тут не нужно, пока оставил
        }
 
        public FullName(string firstName, string surname, string patronymic)
        {
            _firstName = firstName;
            _surname = surname;
            _patronymic = patronymic;
        }
 
        public FullName(string firstName, string surname)
            : this(firstName, surname, string.Empty)
        {
        }
    }


И вот например благодаря использованию структуры не получается присвоить отдельно имя или фамилию таким образом:
C#
1
2
3
4
5
6
7
        public MainWindow()
        {
            InitializeComponent();
 
            Person p =  new Person(new DateTime(1980, 5, 18), "Сергей", "Тарасов", "Петрович");
            p.Name.FirstName = "Чудик"; //Это не пашет
        }
Ну как видно в коде не пашет потому-что структура значимый тип, и FirstName передаётся (читается в другую переменную) по значению. А присвоить новое значение через свойство нельзя так как FullName не ссылочный тип, так? Вот смотрю на всё это, вроде и понимаю, а вроде и нет. Что-то я запутался.

Добавлено через 17 минут
Да ну эти структуры, такой гемор только начинается, вот погляди хотя бы на это:
C#
1
2
3
4
5
6
7
8
        public MainWindow()
        {
            InitializeComponent();
 
            Person p =  new Person(new DateTime(1980, 5, 18), "Сергей", "Тарасов", "Петрович");
            FullName fName = new FullName("Чудик", p.Name.Surname, p.Name.Patronymic);
            p.Name = fName;
        }
Это как с DateTime, одни неудобства. Может оно и быстрей конкретно в DateTime, но тем не менее...
И что такой вариант реально чем-то ускоряет работу? Ведь по тысяче раз придётся создавать структуру, чтобы поменять имя или фамилию только. Вообще плюсов не вижу.
0
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
11.10.2011, 00:24 6
Цитата Сообщение от Casper-SC Посмотреть сообщение
И вот например благодаря использованию структуры не получается присвоить отдельно имя или фамилию таким образом
Присвоить полностью всю структуру
Вот такой код нормально работает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
 
class Program
{
    static void Main()
    {
        SomeStruct s = new SomeStruct();
        s.Sub = new SubStruct(2, 3);
        Console.WriteLine(s.Sub.A);
    }
}
 
public struct SomeStruct
{
    public SubStruct Sub { get; set; }
}
 
public struct SubStruct
{
    private int a, b;
 
    public SubStruct(int a, int b)
    {
        this.a = a;
        this.b = b;
    }
 
    public int A
    {
        get { return a; }
        set { a = value; }
    }
    public int B
    {
        get { return b; }
        set { b = value; }
    }
}
, а не отдельное поле, можно.
Стоит подумать о "а оно надо так делать?". Так как меняется же все в одной мастер-форме (в моем понимании после нажатия на кнопку "редактировать" или "добавить"). То есть достаточно добавить один метод, который принимал бы все нужные структуры. И оставить только нужные свойства, которые бы возвращали не структуры, а родные типы как string, int и тому подобное, через структуры.

Цитата Сообщение от Casper-SC Посмотреть сообщение
Вообще плюсов не вижу.
Инкапсуляция же не зря придумана: написать методы, которые бы представляли данные в нужной форме.

P.S. Это все полет мысли, а на этом не настаиваю. Да и база контактов у вас маленькая - преимущества слишком крошечные.

Цитата Сообщение от Casper-SC Посмотреть сообщение
И что такой вариант реально чем-то ускоряет работу?
Да, недавно тестировал классы в C# для замера времени на примере умножения двух очень больших матриц. Реализовал два разных типа для хранения значений в матрице: через структуру и через класс, сокрыт в обоих случаях внутри был обычный int. У меня выигрыш был в 7 раз - это не сильно заморачиваясь.
0
Эксперт .NET
4431 / 2091 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
11.10.2011, 00:28  [ТС] 7
Цитата Сообщение от Blood-Angel Посмотреть сообщение
Присвоить полностью всю структуру , а не отдельное поле, можно.
Да не, это не проблема. Это я всё умею и сам могу разобраться, вот конкретно по проектированию всегда была беда .
0
19 / 19 / 1
Регистрация: 28.02.2011
Сообщений: 72
11.10.2011, 03:14 8
Раз уж Вы определили свойства в структуре, зачем саму структуру запихивать в свойство? Определите Name как public (internal) поле.
А строка p.Name.FirstName = "Чудик"; не имеет смысла, ведь Name это свойство ,а свойства раскрываются в методы. Рихтер по этому поводу правильно пишет:
Лично мне свойства не нравятся, и я был бы рад, если бы их поддержку убрали из
Microsoft .NET Framework и сопутствующих языков программирования. Причина
в том, что свойства выглядят как поля, на самом деле являясь методами. Это по
рождает массу заблуждений и непонимания. Столкнувшись с кодом, обращающимся
к полю, разработчик привычно предполагает наличие массы условий, которые
просто не всегда верны, если речь идет о свойстве.
ПС: если структура является полем класса, она всё равно размещается в куче, и никакого выигрыша в производительности ожидать не стоит...
0
Эксперт .NET
4431 / 2091 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
11.10.2011, 06:59  [ТС] 9
Цитата Сообщение от Grun**** Посмотреть сообщение
ПС: если структура является полем класса, она всё равно размещается в куче, и никакого выигрыша в производительности ожидать не стоит...
Ну тогда тем более, удобств никаких, только гемор появляется. Ну в общем я уже сделал классами.

Цитата Сообщение от Grun**** Посмотреть сообщение
Раз уж Вы определили свойства в структуре, зачем саму структуру запихивать в свойство? Определите Name как public (internal) поле.
А то есть сделать открытое поле, это же типа нарушение инкапсуляции? Я вообще нагуглил, что структуру следует использовать для небольших типов данных.

Цитата Сообщение от Grun**** Посмотреть сообщение
Это по
рождает массу заблуждений и непонимания.
Ну незнаю, я вообще привык к этим свойствам, что их отсутствие в С++ у меня сначала вызвало непонимание и показалось жутко не удобным.

Цитата Сообщение от Grun**** Посмотреть сообщение
Лично мне свойства не нравятся, и я был бы рад, если бы их поддержку убрали из
Microsoft .NET Framework и сопутствующих языков программирования.
Это не реально, они нужны для XAML как мимнимум и используются в привязке данных. То есть именно из-за XAML все объекты имеют огромное кол-во свойств. По крайней мере так пишут в книге по WPF.

Цитата Сообщение от Grun**** Посмотреть сообщение
Это порождает массу заблуждений и непонимания.
А что сложного и не понятного то, свойство возвращает ссылку на ссылочный тип (class) и возвращает новый экземпляр структуры, именно поэтому p.Name.FirstName = "Чудик"; не работает, так как мы присваиваем не конкретно свойству этой структуре, к которой якобы обращаемся на первый взгляд, а новому экземпляру возвращаемому свойством (ну я так понимаю).
0
Эксперт .NET
4431 / 2091 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
12.10.2011, 23:28  [ТС] 10
Вот что ещё можно добавить?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    /// <summary>Представляет контактную информацию о ком-либо</summary>
    public class ContactInformation
    {
        public ContactInformation()
        {
        }
 
        /// <summary>Электронная почта</summary>
        public string Email { get; set; }
 
        /// <summary>Мобильный телефон</summary>
        public string MobilePhone { get; set; }
 
        /// <summary>Домашний телефон</summary>
        public string HomePhone { get; set; }
 
        /// <summary>Факс</summary>
        public string Fax { get; set; }
 
        /// <summary>Вебсайт</summary>
        public string WebSite { get; set; }
 
        /// <summary>Номер ICQ</summary>
        public string ICQNumber { get; set; }
 
        /// <summary>Имя в Skype</summary>
        public string Skype { get; set; }
 
        /// <summary>Имя в MSN</summary>
        public string MSN { get; set; }
 
        /// <summary>Имя в AIM</summary>
        public string AIM { get; set; }
 
        /// <summary>Имя в Yahoo</summary>
        public string Yahoo { get; set; }
    }
0
Эксперт .NET
17216 / 12670 / 3321
Регистрация: 17.09.2011
Сообщений: 20,945
12.10.2011, 23:39 11
У меня, например, два мобильника с разными номерами.
Как информация обо мне отображалась бы в вашей программе?
0
Эксперт .NET
4431 / 2091 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
12.10.2011, 23:45  [ТС] 12
Цитата Сообщение от kolorotur Посмотреть сообщение
У меня, например, два мобильника с разными номерами.
Как информация обо мне отображалась бы в вашей программе?
Я вот и хочу придумать, как всё это замутить бы получше. Хочу сразу по уму сделать. Ладно ещё можно скажем в массиве хранить номера мобил, в интерфейсе проги думаю сложнее будет придумывать, но прога на WPF будет, там возможно всё, главное разобраться.

Добавлено через 1 минуту
Посоветуете может чего нибудь? Если хотите глянуть как инфа сейчас отображается в прошлой версии программы, то могу дать ссылку на неё, прога на этом форуме есть в теме бета теста. Но я буду делать не тупо дни рождения, как в первой версии, а контакты, короче попробую намутить что-нибудь покруче.

Добавлено через 2 минуты
Может каждое свойство сделать массивом или List<string>? второй вариант удобен, но походу затратен да?

Добавлено через 1 минуту
Это ещё пол беды, потом надо как-то в базу данных сохранять всё (Sql Server Compact Edition 3.5). Я о сохранении каждого контакта в таблицу, с кучей свойств массивов.
0
Каратель
Эксперт С++
6608 / 4027 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.10.2011, 02:44 13
Цитата Сообщение от Casper-SC Посмотреть сообщение
Sql Server Compact Edition 3.5
мб лучше SQLite ?
0
Эксперт .NET
4431 / 2091 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
13.10.2011, 03:03  [ТС] 14
А чем лучше? Так то SQLite у меня есть библиотеки. В Sql Server Compact Edition 3.5 есть встроенная поддержка шифрования, в SQLite насколько помню с этим проблемы, что-то там самому компилировать надо и т.д. Не охота лезть в эту муть.

Добавлено через 1 минуту
Народ, если шарите, подскажите по вопросам выше.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2011, 03:03
Помогаю со студенческими работами здесь

В класс десятичный счетчик добавить Свойства и индексаторы
Прошу прощения, если вдруг такая тема была (я искала, и не нашла). Ниже написан мой горе-код :) ...

Добавить свойства EOF и BOF в класс рекордсет
Умыкнул из &quot;Борей&quot; класс Recordsets. Но не соображу как в него добавить нужные свойства. Конкретно...

Разработать класс Person, который содержит соответствующие члены для хранения.
Разработать класс Person, который содержит соответствующие члены для хранения: -имени, ...

Создать класс EMPLOYEE, производный от класса PERSON и использовать их для вычисления зарплаты сотрудника
Базовый класс: ЧЕЛОВЕК (PERSON) Имя (name) – string Возраст (age) – int Создать производный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru