Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
6 / 6 / 3
Регистрация: 31.08.2015
Сообщений: 56
1

Советы от опытных новичку

11.11.2016, 17:15. Показов 722. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Понимаю, что программировать можно по-разному, вариантов реализаций может быть много, но все же есть какое-то представление о правильном коде. Так вот, реализуя более менее сложный собственный проект (roguelike игру) я натыкаюсь на некоторые сложности в организации структуры приложения и взаимодействии классов. Вот вопросы, которые у меня возникли:

1) Имеется, например, класс ActiveElement с полем Activated. Суть его в том, что активен (Active=true) может быть лишь один ActiveElement в какой либо коллекции. Имеется также класс, который агрегирует коллекцию этих ActiveElement's (назовем класс хозяина Page). Так вот, как по вашему, контроль за тем, чтобы оставался один активный элемент нужно переложить на Page, или сделать экземпляры ActiveElement более автономными, передавая им в конструктор List<ActiveElement> Elements? Пытаюсь каждый раз проводить аналогию, что класс-хозяин это пилот самолета, а агрегируемый класс - это сам самолет. Так вот пилот управляет самолетом, а не наоборот. Но чем плох автопилот?

2) Со временем мои классы разрослись так, что передаваемые фактические параметры не умещаются в 1 строчку.Например, так:
Кликните здесь для просмотра всего текста
C#
1
2
3
Tabs.Add (new PageTab (menu, CalcNewTabPosition (Tabs), backLayer + 1,
                    pages.Find (x => x.ID == (int) MainMenuPageID.HelpPage),
                    Tabs.Count, FileManager.GetText ("HelpPage", FileManager.Interface)));

Сильно это не мешает, но несколько усложняет читабельность. Как вы справляетесь с данной проблемой? Будет ли хорошей практикой сделать какой нибудь класс, к примеру, TabInitInfo? содержащий информацию для создания экземпляра? или перед созданием объекта лучше создать переменные с более понятными названиями, например:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
Point relPos = CalcNewTabPosition (Tabs);
int freeLayer = backLayer + 1;
Page relatedPage = pages.Find (x => x.ID == (int) MainMenuPageID.HelpPage;
string tabText = FileManager.GetText ("HelpPage", FileManager.Interface)
int tabNumber = Tabs.Count;
Tabs.Add (new PageTab (menu, relPos, freeLayer, relatedPage, tabNumber, tabText));

3) Имеет ли смысл все события задавать делегатом EventHandler? В чем его преимущество в отличие от Action'a?
4) Описываю ситуацию. Имеется два класса: родительский (Machine) и дочерний(Car). Допустим, у родительского есть виртуальное свойство Enabled, которое включает и отключает компоненты класса (например, двигатель машины). Переопределяю его в Car (у авто помимо двигла можно выключить еще и радио, например, или фары). В конструкторе есть булево значение, задающее начальное состояние: выключена машины или нет. В коде это выглядит примерно так:
Кликните здесь для просмотра всего текста
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
    interface IEnablingObj
    {
        bool Enabled { get; set; }
    }
 
    class Engine: IEnablingObj
    {
        private int power;
 
        public bool Enabled
        {
            get
            {
                return power != 0;
            }
            set
            {
                if (value)
                    power = 0;
                else
                    power = 100;
            }
        }
    }
    class Radio: IEnablingObj
    {
        private int volume;
 
        public bool Enabled
        {
            get
            {
                return volume != 0;
            }
            set
            {
                if (value)
                    volume = 0;
                else
                    volume = 100;
            }
        }
    }
 
    class Machine: IEnablingObj
    {
        Engine engine;
        public virtual bool Enabled
        {
            get
            {
                return engine.Enabled;
            }
            set
            {
                engine.Enabled = value;
            }
        }
        public Machine (bool enabled)
        {
            Enabled = enabled;
        }
    }
    class Car: Machine
    {
        Engine engine;
        Radio radio;
        public override bool Enabled
        {
            get
            {
                return (base.Enabled && radio.Enabled);
            }
            set
            {
                base.Enabled = value;
                if (radio != null)
                    radio.Enabled = value;
            }
        }
        public Car (bool enabled) : base (enabled)
        {
        }
    }

Или же лучше в конструкторе Machine вместо Enabled = enabled писать engine.Enabled = enabled (тут пример не шибко сложный, но вдруг у machine таких IEnablinObj'эктов много?), а потом в конструкторе Car дописывать radio.Enabled = enabled. В этом случае, конечно, проверку на null у radio можно в свойстве у car убрать.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2016, 17:15
Ответы с готовыми решениями:

Новичку нужен совет опытных в yii
Привет всем только что закончит уроки по yii...

Собираю советы ОПЫТНЫХ back-end PHP-программистов
Добрый день коллеги! Я начинающий back-end PHP-программист. Интересуют ВАЖНЫЕ для меня 5...

Требуются советы опытных по поводу выбора CMS или Framework
Друзья! Захотелось душе сделать свой маленький и уютненький интернет магазинчик (по мелочи, ничего...

Нужны советы опытных верстальщиков! Зацените и скажите в чем разница
Всем привет! Делаю сайт для заказчика http://bishkek.su.kg/6/ У меня он выглядит отлично. 1...

1
11 / 11 / 4
Регистрация: 03.07.2014
Сообщений: 28
11.11.2016, 17:26 2
Могу посоветовать книгу:
Тепляков С.
Паттерны проектирования на платформе .NET. — СПб.: Питер, 2015. — 320 с.: ил.
ISBN 978-5-496-01649-0
0
11.11.2016, 17:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2016, 17:26
Помогаю со студенческими работами здесь

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

Советы новичку
Ребята, добрый день! Помогите в написании кода, не могу все собрать вместе. Нужно чтобы...

Дайте советы новичку
Здравствуйте, только начал свой путь в программировании микроконтроллеров. Прошу советов в целом и...

Дайте советы новичку,,пожалуйста
Всем привет. Я только начал изучать пхп, и встал перед такой проблемой, что я не знаю как закрепить...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru