Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 3
Регистрация: 02.04.2016
Сообщений: 33

"Совершенный" код

05.03.2017, 18:59. Показов 1970. Ответов 9

Студворк — интернет-сервис помощи студентам
Здравствуйте. Решил создать эту тему для того, чтобы привить культуру написания кода в процессе обучения. Я буду выкладывать сюда код, и, надеюсь, профессионалы поправят его с учетом общепринятых норм программирования.
Первый вопрос заключается в следующем:

Правильно ли создавать свойства прямо в полях класса?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Array
{
    short _width
    {
        get { return _width; }
        set
        {
            if (value > 2) _width = value;
            else _width = 2;
        }
    }
    short _length
    {
        get { return _length ; }
        set
        {
            if (value > 2) _length = value;
            else _length = 2;
        }
    }
    int[,] arr;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.03.2017, 18:59
Ответы с готовыми решениями:

Совершенный код, год издания
Здравствуйте, хочу приобрести "библию программистов" именуемую не иначе как "Совершенный код" под авторством С. Макконнелла :)...

для новичков. Совершенный код: грамотность
http://www.phpinfo.su/articles/theory/sovershennyj_kod_gramotnost.html

Книга Стива Макконнелла "Совершенный код. Мастер-класс"
Совершенный код. Мастер-класс Автор: Стив Макконнелл Есть те читал сию книгу с форума?Стоит ли брать? Читал положительные отзывы но...

9
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.03.2017, 19:03
Цитата Сообщение от JDFox Посмотреть сообщение
Правильно ли создавать свойства прямо в полях класса?
Ваш код совсем не правильный. Обычно делаются или автосвойства, или открытые свойства, основанные на закрытых полях.
Конкретно по вашему коду - запросто словите SatckOverflowException (переполнение стека, из-за рекурсии).
0
0 / 0 / 3
Регистрация: 02.04.2016
Сообщений: 33
05.03.2017, 19:04  [ТС]
Я похоже оочень сглупил. Тут полей то нет, тут только свойство. Заработался, похоже.
insite2012, спасибо, я понял свою ошибку.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.03.2017, 19:05
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Правильно будет так:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication4 {
    class Program {
        static void Main(string[] args) {
            Array a = new Array();
            a.Length = 10;
        }
    }
 
    class Array {
        private short _width;
        private short _length;
 
        public short Width {
            get { return _width; }
            set {
                if (value > 2) _width = value;
                else _width = 2;
            }
        }
        public short Length {
            get { return _length; }
            set {
                if (value > 2) _length = value;
                else _length = 2;
            }
        }
    }
}
1
0 / 0 / 3
Регистрация: 02.04.2016
Сообщений: 33
05.03.2017, 19:08  [ТС]
insite2012, только хотел отправить это, но Вы опередили
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    short _width;
    short _length;
    public short Width
    {
        get { return _width; }
        set
        {
            if (value > 2) _width = value;
            else _width = 2;
        }
    }
    public short Length
    {
        get { return _length; }
        set
        {
            if (value > 2) _length = value;
            else _length = 2;
        }
    }
    int[,] arr;
0
0 / 0 / 3
Регистрация: 02.04.2016
Сообщений: 33
12.03.2017, 16:15  [ТС]
Доброго времени суток! Решил написать простую программку для создания двух двумерных массивов, заполнении их рандомными числами и вывода их в консоль. Код работает, проверки на ввод проходит, но, очевидно, что можно сделать лучше. Особенно интересуют замечания на предмет ООП. Заранее спасибо.
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
using System;
 
static class Proverka
{
    public static int IsDigit(string input, out bool pr)
    {
        input.Trim();
        int num;
        pr = false;
        if (int.TryParse(input, out num))
        {
            pr = true;
            return num;
        }
        else
        {
            pr = false;
            Console.WriteLine("Введено не число!");
            return 0;
        }
    }
    public static Random rnd = new Random();
}
class Matrix
{
    
    private int _row;
    private int _column;
    private int[,] matrix;
    public Matrix(int row, int column)
    {
        Row = row;
        Column = column;
        matrix = new int[Row, Column];
    }
    public int Row
    {
        get { return _row; }
        set
        {
            if (value > 2) _row = value;
            else _row = 2;
        }
    }
    public int Column
    {
        get { return _column; }
        set
        {
            if (value > 2) _column = value;
            else _column = 2;
        }
    }
 
    public void Fill()
    {
        
        for (int i = 0; i < this.Row; i++)
        {
            for (int j = 0; j < this.Column; j++ )
            {
                this.matrix[i, j] = Proverka.rnd.Next(20); 
            }
        }
    }
    public void Show()
    {
        for (int i = 0; i < this.Row; i++)
        {
            for (int j = 0; j < this.Column; j++)
            {
                Console.Write("  {0}\t",this.matrix[i, j]);
            }
            Console.WriteLine();
        }
    }
 
}
 
class Demo
{
    static void Main()
    {
        int row, column;
        bool pr;
        Console.WriteLine("Введите количество столбцов матрицы: ");
        do
        {
            column = Proverka.IsDigit(Console.ReadLine(), out pr);
        } while (!pr);
        
        Console.WriteLine("Введите количество строк матрицы: ");
        do
        {
            row = Proverka.IsDigit(Console.ReadLine(), out pr);
        } while (!pr);
        
        Matrix one = new Matrix(row, column);
        Matrix two = new Matrix(row, column);
        Console.WriteLine();
        one.Fill();
        one.Show();
        Console.WriteLine();
        two.Fill();
        two.Show();
 
        Console.ReadLine();
    }
 
}
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
12.03.2017, 16:20
Цитата Сообщение от JDFox Посмотреть сообщение
C#
1
static class Proverka
English?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
12.03.2017, 17:09
Цитата Сообщение от JDFox Посмотреть сообщение
out bool pr)
Что за пррр? Не понимаю таких людей. Зачем сокращать так, чтобы было либо непонятно, либо приходилось строить предположения. Сэкономил целых 5 букв!

Цитата Сообщение от JDFox Посмотреть сообщение
public static Random rnd = new Random();
Открытое поле с маленькой буквы и совершенно неоправданным сокращением.

Добавлено через 2 минуты
JDFox, кстати, можно метод расширение сделать для строки, является ли строка числом. Мне кажется, что вполне имеет право такой метод на существование в классе string. IsNullOrWhiteSpace есть же, почему же не сделать и для определения число ли в строке.

Добавлено через 1 минуту
Цитата Сообщение от JDFox Посмотреть сообщение
C#
1
2
3
private int _row;
private int _column;
private int[,] matrix;
Не определился со стилем, мешаешь всё в одно. Я думаю, нужно как-то единообразно код оформлять. А то глядишь скоро появится поле вида:
C#
1
private bool fState; // к такому именованию особая нелюбовь :)
Добавлено через 1 минуту
JDFox, между свойствами нет пустой строки. Подозреваю, что студия показывая кол-во ссылок на методы и свойства создаёт иллюзию, что между ними есть пустая строка. Я считаю, что лепить в одно это как в одну строку писать. Грубое сравнение, но всё же.

Добавлено через 8 минут
Цитата Сообщение от JDFox Посмотреть сообщение
Код работает, проверки на ввод проходит, но, очевидно, что можно сделать лучше.
Random в классе Proverka вызывает сомнения именно из-за названия класса.

-----------------------------
C#
1
input.Trim();
Должен вызываться так:
C#
1
input = input.Trim();
-----------------------------
Добавлено через 1 минуту
Внутри метода
C#
1
public static int IsDigit(string input, out bool pr)
Выводить инфу на консоль вообще неправильно совершенно. С тем же успехом можно в нём написать ещё коннект к БД и писать туда тоже лог на всякий напрямую.

Добавлено через 5 минут
Думаю, как-то так должно быть (именование оставил исходное):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    static class Proverka
    {
        public static int IsDigit(string input, out bool pr)
        {
            input = input.Trim();
            int num;
 
            if (int.TryParse(input, out num))
            {
                pr = true;
                return num;
            }
 
            pr = false;
            return 0;
        }
 
        public static Random rnd = new Random();
    }
C#
1
2
3
4
5
6
7
8
9
10
11
            bool pr;
            Console.WriteLine("Введите количество столбцов матрицы: ");
            do
            {
                column = Proverka.IsDigit(Console.ReadLine(), out pr);
                if (!pr)
                {
                    Console.WriteLine("Введено не число!");
                }
 
            } while (!pr);
Добавлено через 2 минуты
Хотя в таком случае вообще метод IsDigit не нужен

Добавлено через 46 секунд
Теперь единственное, что он дополнительно делает, так это удаляет пробелы

Добавлено через 1 минуту
Я воспринял класс Proverka, как класс, который можно использовть, так скажем, в любом типе проекта. Если это строго зашито в консольное конкретное приложение, то можно и там что-то выводить, но всё равно как-то сомнительно на мой взгляд это.
1
0 / 0 / 3
Регистрация: 02.04.2016
Сообщений: 33
12.03.2017, 17:17  [ТС]
Спасибо за критику. Язык изучаю совсем недавно, не спеша штудирую Шилдта (пока на 300стр)
Цитата Сообщение от Casper-SC Посмотреть сообщение
Открытое поле с маленькой буквы и совершенно неоправданным сокращением.
Открытые поля с большой буквы нужно писать?

Цитата Сообщение от Casper-SC Посмотреть сообщение
JDFox, кстати, можно метод расширение сделать для строки, является ли строка числом. Мне кажется, что вполне имеет право такой метод на существование в классе string. IsNullOrWhiteSpace есть же, почему же не сделать и для определения число ли в строке.
Это вообще не понял, пока не дошел до того, как расширить стандартные классы.

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

Цитата Сообщение от Casper-SC Посмотреть сообщение
Random в классе Proverka вызывает сомнения именно из-за названия класса.
Рандом я туда прописал из-за того, что при создании второго объекта класса Matrix и его заполнении массив был абсолютно идентичен первому. Кстати, если пошагово прогонять программу, то заполнялось нормально. Волосатов в видео советовал рандомайзер именно статическим делать. Не представляю, как этот статический класс назвать хоть как-нибудь логично.

За заметку про Trim() еще одно огромное спасибо.

Цитата Сообщение от Casper-SC Посмотреть сообщение
Выводить инфу на консоль вообще неправильно совершенно.
По другому пока не умею, как Вы посоветуете выводить?

Цитата Сообщение от TopLayer Посмотреть сообщение
English?
Да, стыдно

Добавлено через 46 секунд
Цитата Сообщение от Casper-SC Посмотреть сообщение
Пожалуй, не буду раздавать советы (удалил текст)
Почему же? Они мне помогли в какой-то мере.

Добавлено через 5 минут
Цитата Сообщение от Casper-SC Посмотреть сообщение
Хотя в таком случае вообще метод IsDigit не нужен
Где-то читал, что всегда нужно предотвращать дублирование одинакового кода, собственно это и подтолкнуло меня сделать отдельный метод. Понимаю, что такую примитивную программу можно сделать в одном Мэйне, но все же... Хочется сделать правильно. И да, Трим там абсолютно не нужен.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
12.03.2017, 17:44
Цитата Сообщение от JDFox Посмотреть сообщение
По другому пока не умею, как Вы посоветуете выводить?
Ну я привёл код, но я в этом случае думал, что назначение у класса Proverka немного другое. В случае с моим примером дублируется код с выводом сообщения "Введено не число!". Можно сделать событие "Логировать результат проверки". Что-то в этом роде и туда выводить сообщение. По крайней мере в таком случае класс проверка не завязывается на консоли.

Добавлено через 2 минуты
Что-то типа этого. Да, можно использовать Action<string>, но в этом случае при автогенерации обработчика параметр метода обработчика будет называться уж точно не text.
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
    public delegate void CheckResult(string text);
 
    static class Proverka
    {
        public static int IsDigit(string input, out bool pr)
        {
            input = input.Trim();
            int num;
 
            if (int.TryParse(input, out num))
            {
                pr = true;
                return num;
            }
 
            OnCheckResult("Введено не число!");
            pr = false;
            return 0;
        }
 
        public static event CheckResult CheckResult;
        
        private static void OnCheckResult(string text)
        {
            var handler = CheckResult;
            if (handler != null)
            {
                handler(text);
            }
        }
    }
Добавлено через 1 минуту
По идее ещё нужно вытаскивать сообщение "Введено не число!" из другого класса по ключу, который будет уже возвращать текст для определённой локализации. Но это уже дебри , пока и так сойдёт.

Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
8
9
10
11
12
    class Demo
    {
        static void Main()
        {
              Proverka.CheckResult += Proverka_CheckResult;
        }
 
        private static void Proverka_CheckResult(string text)
        {
            Console.WriteLine(text);
        }
    }
Добавлено через 2 минуты
Меня всё равно не покидает чувство, что что-то здесь не так

Добавлено через 24 секунды
В простом проекте это всё излишества.

Добавлено через 2 минуты
Например, я считаю, что класс Matrix тоже не должен ничего на консоль выводить. По хорошему я бы написал интерфейс и реализацию этого интерфейса вывода матрицы. Можно было бы реализовывать интерфейс и выводить матрицу разными способами.

Добавлено через 52 секунды
Тут вообще от контекста зависит. Можно просто в классе Demo написать метод, который на вход получает класс Matrix и выводит как-то на экран эту матрицу. Но матрица, в которой есть вывод на консоль как-то неправильно уж точно. Не её это задача.

Добавлено через 6 минут
Цитата Сообщение от Casper-SC Посмотреть сообщение
Меня всё равно не покидает чувство, что что-то здесь не так
Я понял, что здесь не так.

Код запроса на ввод данных должен быть один, например, в виде метода, который принимает на вход сообщения, которые нужно показать пользователю. И, к примеру, в этом методе так же будет зашитое сообщение "Введено не число!". В таком случае у нас не дублируется код, и не нужно это сомнительное событие в классе Proverka, этот класс вообще не нужен в этом случае.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.03.2017, 17:44
Помогаю со студенческими работами здесь

Макконнелл "Совершенный код"
Доброго времени суток. Не подскажите, где можно скачать книгу С. Макконнелла &quot;Совершенный код&quot;? В интернетах искала, но не...

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

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

Составить программу получения всех совершенный чисел, меньших заданного числа N
Составить программу получения всех совершенный чисел, меньших заданного числа N. Напомним, что число называется совершенным, если оно равно...

Дан код на Яве, нужно: а) придумать куда в этот код втулить JTextField, б) проверить данный код на наличие ошибок
import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.*; import javax.swing.border.EmptyBorder; ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru