Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
Показать сообщение отдельно
JohnJ
108 / 7 / 3
Регистрация: 29.06.2012
Сообщений: 28
02.07.2015, 11:20

По компактнее написать код

02.07.2015, 11:20. Просмотров 642. Ответов 24
Метки (Все метки)

Ответ

Я предлагаю воспользоваться преимуществами ООП.
Писанины меньше не станет, наверное, зато всё будет выглядеть слаженно, компактно и по существу.
У меня получилось так, что основное свойство ваше выглядит так:
C#
1
2
3
4
5
6
7
   public double НормаРасхода {
            get {
                if (ТекущийВидИнтерфейса == null) return 0;
                var результат = ТекущийВидИнтерфейса.Рассчёт();
                return Math.Round(результат, 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
    public enum НаборФормСечения {
        Круг, Квадрат, Прямоугольник
    }
 
    public class Круг : ВидИнтерфейса {
        public override double Рассчёт() {
            var д = СДиаметр / 2;
            return Math.PI * д * д * СДлина * Отходы;
        }
    }
 
    public class Пруток : ВидИнтерфейса {
        public НаборФормСечения ФормаСечения = НаборФормСечения.Круг;
 
        public override double Рассчёт() {
            switch (ФормаСечения) {
                case НаборФормСечения.Круг:
                    return (new Круг()).Рассчёт();
                 //....
            }
            return base.Рассчёт();
        }
    }
 
    public class Лист : ВидИнтерфейса {
        public override double Рассчёт() {
            return СТолщина * СДлина * СШирина * Отходы;
        }
    }
 
    public class ТрубаКруглая: ВидИнтерфейса {
        public override double Рассчёт() {
            return СТолщина * 2 * (СВысота + СШирина) * СДлина * Отходы;
        }
 
        public override string ToString() {
            return "Труба круглая";
        }
    }
 
    public class ТрубаПрямоугольнаяКвадратная: ВидИнтерфейса {
        public override double Рассчёт() {
            var д = СДиаметр / 2;
            var дт = д - СТолщина;
            return Math.PI * (д * д - дт * дт) * СДлина * Отходы;
        }
 
        public override string ToString() {
            return "Труба прямоуг./квадр.";
        }
    }
 
    public class ЛентаСинтетическая: ВидИнтерфейса {
        public override double Рассчёт() {
            return Длина / 1000 * КоэфОтходов;
        }
 
        public override string ToString() {
            return "Лента синтетика";
        }
    }
 
   public abstract class ВидИнтерфейса {
        public static double Толщина;
        public static double Диаметр;
        public static double Длина;
        public static double Высота;
        public static double Ширина;
        public static double Плотность;
        public static double КоэфОтходов;
 
        protected double СТолщина {
            get { return Толщина / 100; }
        }
        protected double СДиаметр {
            get { return Диаметр / 100; }
        }
        protected double СДлина {
            get { return Длина / 100; }
        }
        protected double СШирина {
            get { return Ширина / 100; }
        }
        protected double СВысота {
            get { return Высота / 100; }
        }
        protected double Отходы {
            get { return Плотность * КоэфОтходов; }
        }
 
        public abstract double Рассчёт();
 
        public override string ToString() {
            return GetType().Name;
        }
    }
Конечно, лучше каждый класс оформить в виде отдельного файла. А на форме можно будет так использовать:
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
public partial class Form1 : Form {
        public ВидИнтерфейса ТекущийВидИнтерфейса {
            get { return cbВидИнтерфейса.SelectedItem as ВидИнтерфейса; }
        }
 
        public ВидИнтерфейса[] ВидыИнтерфейса;
 
        public double Толщина {
            get { return ВидИнтерфейса.Толщина; }
            set { ВидИнтерфейса.Толщина = value; }
        }
 
        public double Диаметр {
            get { return ВидИнтерфейса.Диаметр; }
            set { ВидИнтерфейса.Диаметр = value; }
        }
 
        public double Длина {
            get { return ВидИнтерфейса.Длина; }
            set { ВидИнтерфейса.Длина = value; }
        }
 
        public double Ширина {
            get { return ВидИнтерфейса.Ширина; }
            set { ВидИнтерфейса.Ширина = value; }
        }
 
        public double Высота {
            get { return ВидИнтерфейса.Высота; }
            set { ВидИнтерфейса.Высота = value; }
        }
        
        public double ВыбраннаяПлотность {
            get { return ВидИнтерфейса.Плотность; }
            set { ВидИнтерфейса.Плотность = value; }
        }
 
        public double КоэфОтходов {
            get { return ВидИнтерфейса.КоэфОтходов; }
            set { ВидИнтерфейса.КоэфОтходов = value; }
        }
        
        public Form1() {
            InitializeComponent();
 
            ВидыИнтерфейса = new ВидИнтерфейса[] {
                new Круг(),
                new Пруток(),
                new Лист(),
                new ТрубаКруглая(),
                new ТрубаПрямоугольнаяКвадратная(),
                new ЛентаСинтетическая(),
            };
        }
 
        public double НормаРасхода {
            get {
                if (ТекущийВидИнтерфейса == null) return 0;
                var результат = ТекущийВидИнтерфейса.Рассчёт();
                return Math.Round(результат, 3);
            }
        }
 
        private void Form1_Load(object sender, EventArgs e) {
            cbВидИнтерфейса.Items.AddRange(ВидыИнтерфейса);
            cbФормаСечения.Items.AddRange(new object[] {НаборФормСечения.Круг, НаборФормСечения.Квадрат, НаборФормСечения.Прямоугольник});
            cbВидИнтерфейса.SelectedIndex = 0;
            ПривязатьПоля();
        }
 
        private void ПривязатьПоля() {
            var привязки = new[] {"Высота", "Ширина", "Длина", "Толщина", "Диаметр", "КоэфОтходов", "ВыбраннаяПлотность"};
 
            foreach (var привязка in привязки) {
                var nud = (Controls.Find("nud" + привязка, true)[0] as NumericUpDown);
                nud.DataBindings.Add("Value", this, привязка, false, DataSourceUpdateMode.OnPropertyChanged);
                nud.Value = Convert.ToDecimal(GetType().GetProperty(привязка).GetValue(this));
            }
 
        }
 
        private void bОбновить_Click(object sender, EventArgs e) {
            tbРезультат.Text = НормаРасхода.ToString("0.000");
        }
 
        private void cbФормаСечения_SelectedIndexChanged(object sender, EventArgs e) {
            var пруток = ТекущийВидИнтерфейса as Пруток;
            if (пруток == null || cbФормаСечения.SelectedItem == null) return;
            пруток.ФормаСечения = (НаборФормСечения) cbФормаСечения.SelectedItem;
        }
 
        private void cbВидИнтерфейса_SelectedIndexChanged(object sender, EventArgs e) {
            labelФормаСечения.Visible = cbФормаСечения.Visible = ТекущийВидИнтерфейса is Пруток;
        }
    }
Добавлено через 28 минут
Но ещё есть куда улучшать. Например, размерные свойства, отражающие статические данные, из формы можно перевести в абстрактный класс "ВидИнтерфейса" и к ним же делать привязку элементов формы. Тогда форма очистится от ненужного дублирования расчётных свойств объектов.

Вернуться к обсуждению:
По компактнее написать код
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2015, 11:20
Готовые ответы и решения:

помогите написать код PHP на C#
есть код php по загрузке файлов с ************ $data = array( 'login'...

Как написать оптимизированный код
Интересует вопрос, можно ли реализовать модификацию кода после его отработки,...

Как написать код для рисования снеговика?
Здравствуйте друзья! Как написать код для рисования снеговика. Реализрвать как...

Крестики-нолики. Не могу написать код проверки выигрыша
Задача состояла в том, чтобы написать игру крестики-нолики с использованием...

Написать код для снятия веса с весов Mettler Toledo или Tenso-M
Есть такой код: using System; using System.Collections.Generic; using...

24
Другие темы раздела
C# Передача строк между классами http://www.cyberforum.ru/csharp-net/thread1490480.html
Здравствуйте. Возникла проблема в формировании логов. Имеется приложение, с кучей форм, классов. Необходимо при возникновении в каждом классе исключения, выводить ошибку на главную форму в виде...
C# Обобщённые интерфейсы. Привидение к единому типу Доброго времени суток форумчанам. Я пока не силён в наследовании и обобщениях, посему прошу помощи. Для начала, попробую на словах предать суть проблемы... У меня есть некоторые классы среди... http://www.cyberforum.ru/csharp-net/thread1490460.html
Сохранение настроек службой C#
Всем привет. Сделал службу, она должна сохранять некоторые параметры : номер файла и тд. Для этого добавил Properties.Settings. Все работает , но не могу собственно этот файл. Где он хранится ? В...
C# Отправить сообщение postmessage (sendmessage) с указанным сканкодом
Как отправить сообщение postmessage(sendmessage) с указанным сканкодом? Добавлено через 1 час 19 минут как я понял вся соль в комбинировании флагов, может кто нибудь подсказать Добавлено через...
C# Как регулярными выражениями получить определённый набор символов? http://www.cyberforum.ru/csharp-net/thread1490156.html
есть метод string Captha_KEY() { string data=""http://captcha.site.com/captchakey=5d11165823bed8a529794a6253f7ec6fab099f8f748424efddb2506f4dfe""; var...
C# Отправить нажатие клавиши в свёрнутый блокнот Как отправить нажатие клавиши в свёрнутый блокнот? Помогите пожалуйста. Устал искать. подробнее
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru