0 / 0 / 3
Регистрация: 02.04.2016
Сообщений: 33

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

05.03.2017, 18:59. Показов 2034. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru