Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
 Аватар для beats
101 / 42 / 9
Регистрация: 09.12.2012
Сообщений: 597
.NET 4.x

гигиеничность кода c# - научиться разделять код на файлы

06.02.2013, 15:46. Показов 4119. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста! Тут я не имею ввиду качественную: комментируемость\именование переменных\объектов\классов.
Мне нужно как то научиться разделять код на файлы. Например довольно некрасиво когда вся большая программа находиться в том же коде формы Form1.cs Хотелось бы сделать например как функции в c++ чтоли?
Вот типа кнопка
C#
1
2
3
4
 private void button1_Click(object sender, EventArgs e)
        {
//Код с большими выражениями
        }
на типа так
C#
1
2
3
4
 private void button1_Click(object sender, EventArgs e)
        {
 button1code();
        }
ну чтобы не засирать файл с кодом формы. я вот не знаю как такие ссылки делать? Нужны классы, методы или функции? Чтобы определенный блок кода как ссылкой вставлять в нужные элементы! А сам блок еще вопрос где хранить? Для этого используется библиотека классов? или другие .cs файлы создавать?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.02.2013, 15:46
Ответы с готовыми решениями:

Как разделять код на отдельные файлы
в С++ все понятно - заголовочные(.h), реализация(.cpp). А как поступить в C# ? на данном этапе есть окно MainForm (соответственно файлы...

Научиться искусству оптимизации кода
Доброго вечера. Такой вопрос, может есть у кого свободная минутка и может научить правилу формирования кода, делать код более компактным и...

Где научиться оптимизировать код?
Подскажите хорошие уроки, желательно на русском, по отладке ошибок ПХП, нахождение, исправление ошибок, ускорение работы сервера,...

25
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
06.02.2013, 17:03
1й вариант лучше. Второй вариант - те же яйца только в профиль.
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
06.02.2013, 17:58
Лучший ответ Сообщение было отмечено как решение

Решение

beats, негласные правила хорошего тона:
-размер метода 20+-5 строк
-каждый класс в отдельном файле
-в одном файле не боле 500 строк (дальше разбивка на части c помощью partial)
-объединение(группировка) членов класса по назначению (с помощью region)
4
 Аватар для beats
101 / 42 / 9
Регистрация: 09.12.2012
Сообщений: 597
06.02.2013, 18:28  [ТС]
Примерно понял но хочется посмотреть на рабочих проектах такую организацию. Можите дать пример проекта или книги\статьи с примерами?
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
06.02.2013, 21:09
beats, ищите open-source проекты и понемногу разбирайте их. Например тут ищите или тут
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.02.2013, 23:57
beats, не самый хороший пример, но примерно так выглядит например код одной из моих форм (особенно двойная инициализация радует. Но что делать: когда писал, был молод и глуп ) :
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
using System;
using System.Windows.Forms;
using Snake.GameSource;
 
// ReSharper disable InconsistentNaming
 
namespace Snake.Forms
{
    public partial class MainForm : Form
    {
        private int level = 1;
        private bool isGameOver;
        private string playername = "Unknown";
 
        public MainForm()
        {
            InitializeComponent();
        }
 
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (ExitCode(e.KeyCode))
                exit.PerformClick();
            else if (PauseCode(e.KeyCode))
                PauseItem.PerformClick();
            else
                Game.SetDirection(e.KeyCode);
        }
 
        private static bool ExitCode(Keys keycode)
        {
            return keycode == Keys.Escape;
        }
 
        private static bool PauseCode(Keys keycode)
        {
            return keycode == Keys.P;
        }
        
        private void Form1_Load(object sender, EventArgs e)
        {
            NewGame();
            Height = picturebox.Bottom + 56;
            if (MessageBox.Show("Для выбора нового имени нажмите Ок. Для игры под стандартным именем нажмите отмена", "", MessageBoxButtons.OKCancel) == DialogResult.OK)
                setPlayerNameToolStripMenuItem.PerformClick();
            Game.GameOverEventHandler += OnGameOverEventHandler;
            Game.GameStepEventHandler += RefreshForm;
            NewGame();  //Двойная инициализация неспроста (иначе крашится на попытке открыть AskForm)
            MaximumSize = MinimumSize = Size;
        }
 
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Game.SaveRecords();
        }
 
        private void OnGameOverEventHandler(object sender, EventArgs e)
        {
            isGameOver = true;
            if (MessageBox.Show("Game Over.", "Again?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                NewGame();
        }
 
        public delegate void InvokeDelegate(GameEventArgs e);
 
 
        private void RefreshForm(object sender, GameEventArgs e)
        {
            BeginInvoke(new InvokeDelegate(RefreshFormAsync), e);
        }
 
 
        private void RefreshFormAsync(GameEventArgs e)
        {
            label1.Text = GetScore(e.Score);
            picturebox.Image = e.Map;
        }
 
 
        private void NewGame()
        {
            isGameOver = false;
            pauseLabel.Visible = false;
            Game.Create(picturebox.Size, level, zoomToolStripMenuItem.Checked, playername);
        }
 
        private static string GetScore(int i)
        {
            return "Score: " + i;
        }
 
        #region menu
 
        private void PauseItem_Click_1(object sender, EventArgs e)
        {
            if (isGameOver) return;
            pauseLabel.Visible = !pauseLabel.Visible;
            Game.PauseUnapuse();
        }
 
        private void New_Click(object sender, EventArgs e)
        {
            NewGame();
        }
 
        private void exit_Click(object sender, EventArgs e)
        {
            if (!pauseLabel.Visible)
                PauseItem.PerformClick();
            if (MessageBox.Show("Вы уверены, что хотите выйти", "", MessageBoxButtons.YesNo) == DialogResult.Yes)
                Application.Exit();
        }
 
        private void zoomToolStripMenuItem_Click(object sender, EventArgs e)
        {
            zoomToolStripMenuItem.Checked = !zoomToolStripMenuItem.Checked;
            NewGame();
        }
        
        #region levels
 
        private void UncheckLevels()
        {
            level1SubItem.Checked = level2SubItem.Checked = level3SubItem.Checked = false;
        }
 
        private void ChangeLevel(ToolStripMenuItem checkBox)
        {
            UncheckLevels();
            checkBox.Checked = true;
            level = Convert.ToInt32(checkBox.Tag);
            NewGame();
        }
 
        private void level1SubItem_Click(object sender, EventArgs e)
        {
            ChangeLevel(level1SubItem);
        }
 
        private void level2SubItem_Click(object sender, EventArgs e)
        {
            ChangeLevel(level2SubItem);
        }
 
        private void level3SubItem_Click(object sender, EventArgs e)
        {
            ChangeLevel(level3SubItem);
        }
 
        private void level4SubItem_Click(object sender, EventArgs e)
        {
            ChangeLevel(level4SubItem);
        }
 
        #endregion
 
        private void recordsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!isGameOver) PauseItem.PerformClick();
            new RecordsForm(Game.GetRecords(), Game.ColNames).ShowDialog();
        }
 
 
 
        #endregion
 
        private void setPlayerNameToolStripMenuItem_Click(object sender, EventArgs e)
        {
            PauseItem.PerformClick();
            new AskForm(playername, SetPlayerName).ShowDialog();
        }
 
        private void SetPlayerName(string playername)
        {
            this.playername = playername;
        }
    }
}
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
06.02.2013, 23:58
Psilon, еще бы xml-комментарии и было бы хорошо.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.02.2013, 00:05
Noob.net, xml комментарии - это не то что не панацея, а возможно даже вредная современная тенденция (все тот же Роберт Мартин на эту тему говорил). Программист тратит свое время и захламляет пространство тем, что возможно и не понадобится никогда. Самодокументирующийся код - намного лучше. То есть вместо
C#
1
2
3
4
        /// <summary>
        /// Метод начала новой игры
        /// </summary>
             public void Foo();
намного лучше написать одну строчку
C#
1
public void StartNewGame();
и никаких комментариев не надо.
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
07.02.2013, 00:15
Psilon, Мне легче читать с ними. Конечно хорошо когда и обычные комментарии есть типа //,но
пока,везде где спрашивал насчет работы - требуют документирование или отмечают это как "+"
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.02.2013, 00:23
Noob.net, Очень советую, почитай "чистый код". После прочтения у тебя хоть будет свое мнение об этом. По крайней мере разумные доводы мне больше нравятся, чем плюсы неизвестных людей, которые это даже не аргументируют
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
07.02.2013, 07:29
Изучи вначале конценпцию MVC.
Она делит код на три куска, но ты освой хотя бы два - отделить логику от представления.
Потом - данные от действий.

Потом - паттерны проектирования. Но это уж потом.
2
28 / 28 / 6
Регистрация: 25.12.2008
Сообщений: 186
11.02.2013, 02:07
Цитата Сообщение от dondublon Посмотреть сообщение
Изучи вначале конценпцию MVC.
Она делит код на три куска, но ты освой хотя бы два - отделить логику от представления.
Потом - данные от действий.
Потом - паттерны проектирования. Но это уж потом.
MVC -тоже паттерн проектирования.
Паттерны в общем и MVC в частности вещи которые надо применять очень избирательно. Это хорошо когда они есть только там где они необходимы, их избыток превращает их в антипаттерны и головную боль того кто будет в этом коде разбираться.
Статья пример избыточных паттернов:
http://habrahabr.ru/post/153225/
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
11.02.2013, 06:40
А мне нравится xml-документировамие только тем, что если потом эту библиотеку подключить, то видно что метод ест и что возвращает. Но ужасно усложняется чтение кода с этими комментариями.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
11.02.2013, 07:21
Цитата Сообщение от Sinys Посмотреть сообщение
MVC -тоже паттерн проектирования.
Ну оно конечно так, просто MVC более общая штука, а говоря по паттерны, я имел в виду более конкретные вещи (то, что описано в книге Банды четырех).
Цитата Сообщение от Sinys Посмотреть сообщение
Паттерны в общем и MVC в частности вещи которые надо применять очень избирательно.
Позвольте не согласиться. Для того их и придумывали, чтобы код потом было легче читать и переносить.
Паттерны - это, если хотите, результат эволюции стиля программирования Выживают самые правильные программисты, и передают свои гены паттерны потомкам.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
11.02.2013, 11:57
Цитата Сообщение от body90 Посмотреть сообщение
А мне нравится xml-документировамие только тем, что если потом эту библиотеку подключить, то видно что метод ест и что возвращает. Но ужасно усложняется чтение кода с этими комментариями.
Даже в студии легко увидеть, что метод кушает и что возвращает. А уж с такими инструментами, как R# все это документирование вообще становится излишним (Офк при соблюдении элементарных правил, по крайней мере, именования). А вот второй пункт решает.
0
28 / 28 / 6
Регистрация: 25.12.2008
Сообщений: 186
11.02.2013, 12:09
Цитата Сообщение от dondublon Посмотреть сообщение
Позвольте не согласиться. Для того их и придумывали, чтобы код потом было легче читать и переносить.
Паттерны - это, если хотите, результат эволюции стиля программирования Выживают самые правильные программисты, и передают свои гены паттерны потомкам.
Угу вот только потомки пихают их куда ни попадя и в итоге часто раздувают 10 строчек в 2 класса и стремную взаимосвязь между ними.
Если кнопка реализует пару простых действий над формой то не надо это выносить в отдельный класс, достаточно все записать в обработчике на форме, но если на эти действия надо 50+ строк то надо подумать о рефакторинге и совсем не факт что надо будет отдельный класс...
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
11.02.2013, 12:56
Цитата Сообщение от Sinys Посмотреть сообщение
Угу вот только потомки пихают их куда ни попадя и в итоге часто раздувают 10 строчек в 2 класса и стремную взаимосвязь между ними.
"Стремную" - слишком субъективно.
Иногда именно так и надо делать, да - разбивать небольшое количество кода на классы. Обычная работа хорошего программиста. Чтобы потом некий функционал из этого клубка из 10 строчек не надо было вручную пинцетом выковыривать для повторного использования - должно быть все разбито на куски сразу.

Цитата Сообщение от Sinys Посмотреть сообщение
Если кнопка реализует пару простых действий над формой то не надо это выносить в отдельный класс, достаточно все записать в обработчике на форме
Святая простота.
Ну откуда вы знаете, что не надо? Зависит от ситуации. Очень часто надо.

Этот разговор - разбивать или нет - не имеет смысла, поскольку зависит от конкретной ситуации чуть более, чем полностью.
Но вот что бесспорно - так это то, что программист должен УМЕТЬ разбивать.
Об этом и был исходный вопрос, и на него я ответил (куда копать, чтобы научиться писать красивый код).
0
9 / 9 / 5
Регистрация: 08.10.2012
Сообщений: 48
13.02.2013, 04:46
Да здравствует холивар
1
40 / 40 / 15
Регистрация: 28.05.2011
Сообщений: 257
Записей в блоге: 1
14.02.2013, 00:16
beats, используй разделяемые классы и разделяемые методы ( partial )
0
28 / 28 / 6
Регистрация: 25.12.2008
Сообщений: 186
14.02.2013, 03:57
Цитата Сообщение от klsaymon Посмотреть сообщение
beats, используй разделяемые классы и разделяемые методы ( partial )
Что приведет к большей путанице... Как по мне их добавили исключительно для любителей структурного/функционального подхода(а ну и для случая если 1 и тот же класс будут писать несколько людей одновременно)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.02.2013, 03:57
Помогаю со студенческими работами здесь

Как научиться эффективно читать чужой код С++
Поделитесь пожалуйста опытом или просто мыслями о том, как всё таки начать разбираться в не своём коде? Может у кого-то есть какие-то...

Как научиться писать красивый, масштабируемый, понятный код на php?
Как научиться писать красивый, масштабируемый, понятный код на php? Сразу сниму ответы типа &quot;чтобы научиться программировать,...

Может кто-то подскажет, где можно научиться писать красивый, качественный код
Здравствуйте! У меня возникла проблема.. Она уже как лет 6:) Пишу на php уже 6-й год, но толком ни наследование, ни абстракцию, ни...

Работа в Visual Studio 2015 - как добавить файлы исходного кода и заголовочные файлы?
Приветствую всех! Столкнулся с тем, что решая задачи по книге Лафоре про графику, не смог добавить файлы .h и .cpp, скачав их с одной из...

Зачем нужно добавлять файлы в файлы исходного кода
Зачем нужно добавлять файлы в файлы исходного кода (кроме main.cpp)? И как вызвать из main.cpp другой файл?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru