Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 24.11.2015
Сообщений: 18

Трудности с архитектурой взаимодействия классов

04.04.2016, 18:11. Показов 1478. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! На днях стал делать лабораторную работу по Си шарп, и столкнулся со значительной проблемой в разработке архитектуры. У меня есть три класса: 1)один из классов содержит точку входа + организует работу пользователя с консолькой.
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
using System;
namespace Sharp
{
 
 
    class MainClass
    {
        private void ShowMenu()
        {
            Console.WriteLine("1. Добавить данные нового сотрудника");
            Console.WriteLine("2. Удалить данные сотрудника");
            Console.WriteLine("3. Показать всех сотрудников");
            Console.WriteLine("4. Выйти из программы");
        }
 
    
 
 
        private void AddMenu(SetOfEmployees emp)
        {
            PostTypes post;
        
 
            emp.CheckCapacity();
 
            Console.WriteLine("Введите имя нового сотрудника");
            string Name = Console.ReadLine();
            emp.AddName(Name);
 
            Console.WriteLine("Введите фамилию нового сотрудника");
            string Surname = Console.ReadLine();
            emp.AddSurname(Surname);
 
            Console.WriteLine("Введите отчество нового сотрудника");
            string Patronymic = Console.ReadLine();
            emp.AddPatronymic(Patronymic);
            
 
            Console.WriteLine("Введите должность нового сотрудника");
            #region
            for (post = PostTypes.Developer; post <= PostTypes.Administrator; post++)
            {
                Console.WriteLine((int)(post) + ")" + post);
            }
 
            
            int num_post = Convert.ToInt32(Console.ReadLine());
 
            while (!emp.AddPost(num_post))
            {
                Console.WriteLine("Пожалуйста, введите должность правильно");
                num_post = Convert.ToInt32(Console.ReadLine());
 
            }
            #endregion
 
            Console.WriteLine("Введите дату рождения нового сотрудника");
 
            string DateBirth = Console.ReadLine();
            #region
            while (!emp.CheckDateBirth(DateBirth))
            {
                Console.WriteLine("Введите дату рождения в соответствии с форматом дд.мм.год");
                DateBirth = Console.ReadLine();
 
            }
            #endregion
            emp.Add();
 
        }
 
        private void ShowMenu(SetOfEmployees emp)
        {
            Employee[] temp; 
            temp = emp.GetEmployees;
            int i = 0;
            if (emp.getSize() != 0)
            {
                while (i < emp.getSize())
                {
                    Console.WriteLine(temp[i].surname + " " + temp[i].dateBirth);
                    i++;
                    
                }
 
            }
            else
                Console.WriteLine("Элементов нет");
        }
        
 
        private void DeleteMenu(SetOfEmployees emp)
        {
            Console.WriteLine("Введите фамилию увольняемого сотрудника");
            string Surname = Console.ReadLine();
            int temp = emp.Delete(Surname);
            if (temp == -1 || temp == 0)
                Console.WriteLine("Элемент не найден / или список пуст");
            else
                Console.WriteLine("Удаление прошло успешно");
           
        }
 
   
 
 
 
        
        static void Main()
        {
 
            SetOfEmployees ProgramObject = new SetOfEmployees();
            MainClass meth = new MainClass();
            while (true)
            {
                meth.ShowMenu();
 
                int IntKey = Convert.ToInt32(Console.ReadLine());
 
                switch (IntKey)
                        {
                            case 1:
                                meth.AddMenu(ProgramObject);
                                break;
                            case 2:
                                meth.DeleteMenu(ProgramObject);
                                break;
                            case 3:
                                meth.ShowMenu(ProgramObject);
                                break;
                            case 4:
                                break;
                        }
                        if (IntKey == 4)
                        {        //5 - ключ выхода
                            break;
                        }
                        Console.ReadKey();
                        Console.Clear();
 
                    }
                }
 
    }
 
 
}


2) Второй класс описывает предметную область - в моем случае это "Сотрудник" с такими полями данных как имя, фамилия, отчество и т.д. Этот класс по условию должен содержать параметризированный конструктор, инициализирующий поля данных этого класса
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
using System;
 
 
namespace Sharp
{
    public class Employee
    {
        public string name;
        public string surname;
        public string patronymic;
        public string dateBirth;
        public int post;
 
        public Employee(String Name, String Surname, String Patronymic, string DateBitrh, int Post)
        {
            name = Name;
            surname = Surname;
            patronymic = Patronymic;
            post = Post;
            dateBirth = DateBitrh;
        }
 
        
    }
}
3)Третий класс - класс, собственно, инкапсулирующий данные из второго класса и осуществляющий такие действия, как удаление, поиск, добавление новых элементов.

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
 
 
namespace Sharp
{
    public class SetOfEmployees
    {
 
        private Employee[] emp = new Employee[10];
        private int _lastIndex = 0;
        string tempName, tempSurname, tempPatr, tempDateBirth;
        int tempPost;
 
 
 
        //Метод, проверяющий размер массива, и увеличивающий его в случае недостаточного размера
        public void CheckCapacity() 
        {
 
            if (_lastIndex == emp.Length - 1)
            {
                Array.Resize(ref emp, emp.Length * 2);
            }        
 
           
        }
 
 
        //добавляет имя
        public void AddName(string name)
        {
            tempName = name;           
        }
 
        public void AddSurname(string surname)
        {
            tempSurname = surname;
        }
 
        public void AddPatronymic(string patronymic)
        {
            tempPatr = patronymic;
        }
        //проверяет, если ли соответствие введенному пользователем номеру в перечислении
        public bool AddPost(int post)
        {
            if (post >= 4)
                return false;
            else
            {
                tempPost = post;
                return true;
            }
 
        }
        //проверяется, правильно ли пользователь ввел дату
        public bool CheckDateBirth(string DateBirth)
        {
            DateTime DateValid;
 
            if (!DateTime.TryParse(DateBirth, out DateValid))
                return false;
            else
                tempDateBirth = DateBirth;
                return true;
 
        }
        //метод, выывающий параметризированный конструктор
        public void Add()
        {
                emp[_lastIndex] = new Employee(tempName, tempSurname, tempPatr, tempDateBirth, tempPost);
                 _lastIndex++;
        }
 
 
        //Метод,удаляющий элемент по ключу "Surname"
        public int Delete(string surname)
        {
            int flag = 0;
            if (_lastIndex == 0)
                return -1;
            else
            {
                for (int i = 0; i < _lastIndex; i++)
                {
                    if (emp[i].surname == surname)
                    {
                        flag = 1;
                        Array.Resize(ref emp, _lastIndex-1);
                        _lastIndex--;
                        
                    }
                        
                }
            }
            if (flag == 0)
                return 0;
            else
                return 1;
 
        }
        //доступ к полям данных(только чтение)
        public Employee[] GetEmployees
        {
            get
            {
                return emp;
            }
        }
        //возвращает текущий размер массива данных
        public int getSize()
        {
            return _lastIndex;
        } 
 
       
    }
}

Ну, собственно, вы видите, какие костыли у меня в третьем классе. Мне приходится содержать переменные, которые принимают данные, введенные пользователем, и все только потому, что мне нужно передать конструктору аргументы одновременно. А препод сказал, что сделать это нужно напрямую, без промежуточных переменных.
Был бы очень рад, если бы вы дали мне советы по тому, как можно ее модернизировать так сказать по правилам хорошего кода. Заранее огромной спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.04.2016, 18:11
Ответы с готовыми решениями:

Создать иерархию классов для моделирования взаимодействия “Магазин-склад- Заказчик”
Для проверки функционирования созданных классов написать программу, использующую эти классы. В программе должны быть продемонстрированы все...

Разобраться с Архитектурой
Добрый день Всем, кто не спит! Я пока что только осваиваю JS, поэтому прошу помощи у профессионалов. Помогите мне разобраться в...

Архитектурой инженерной программы
Здравствуйте, уважаемые коллеги! Помогите, пожалуйста, советом, как решить проблему с архитектурой приложения. Краткая предыстория...

21
 Аватар для zewer
2357 / 1775 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
05.04.2016, 13:51
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Evgeniy_ITMO Посмотреть сообщение
Необходимо реализовать операции добавления, удаления,
поиска, получения всех элементов массива.
поиск забыл реализовать. Завтра допишу, а можете и самому сделать. Можно сделать через номер сотрудника, по аналогии к тому, как я сделал удаление. Только хз прокатит ли преподу

Добавлено через 9 часов 47 минут
Я так подумал. В общем ситуация с заданием такая, что вы должны абстрагироваться от класа сотрудник и провести якобы моделяцию управления над сотрудниками. По этому логичней всего, при поиске сотрудника, вывести полную информацию о нем, а не сокращено, как это делаеться в пункте с выводом всех сотрудников.
Тут два варианта, делать через номер, и сам поиск пункта так и обьявлять, как найти всю информацию о сотруднике. Либо делать поиск по прозвищу, а прозвище читать через свойство экзепляра сотрудник в массиве со сотрудниками, при этом делать возможность, что сотрудника с указанным прозвищем может и не существовать. Не знаю как преподу будет удобней.
1
 Аватар для zewer
2357 / 1775 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
05.04.2016, 14:26
Лучший ответ Сообщение было отмечено Evgeniy_ITMO как решение

Решение

Дописал поиск. Реализовал через ID, в контексте программы выглядит все логично и правильно. Скажете еще преподу, что программа должна иметь удобный интерфейс, и зачем пользователя для поиска заставлять вводить целое прозвище, если можно просто ввести циферку с ID
В целом протестуйте, работает ли все, или есть баги, я так на быструю руку подебагал, более менее баги исправил, но может что то еще осталось.
Вложения
Тип файла: rar Sharp1.rar (38.1 Кб, 3 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2016, 14:26

Головоломка с архитектурой приложения
Доброго времени суток. Для начала опишу вкратце ситуацию. Допустим есть следующий интерфейс interface IMyInterface { void A(); void...

Разработать приложение с 3-звенной архитектурой
Разработать приложение с 3-звенной архитектурой (БД Oracle/MSSQL/MySQL, App, UI). Должно быть: 1) Покрывать сценарии работы простого...

Silverlight приложение с многоуровневой архитектурой
Надо создать приложение (обычное, НЕ бизнесс) на Silverlight для работы с БД с использованием многоуровневой архитектуры. Обычное...

Контроллеры с фон неймановской архитектурой
Всем доброе время суток, встречайте нового члена. Теперь собственно к делу. Кто знает современные (выпускаемые и доступные) встраиваемые...

Приложение с 4-х звенной архитектурой и Борландовские компоненты.
Доброго времени суток! Реализовано приложение 2-х звенной архитектуры полностью на борландовских компонентах dbSwing и DataExpress, то...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru