В поиске
102 / 50 / 16
Регистрация: 20.04.2014
Сообщений: 785
1
.NET 4.x

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

30.06.2015, 18:05. Показов 1052. Ответов 24
Метки нет (Все метки)

Возможно ли както компакнее написать код и ускорить его. Просто уверен что написано коряво хотел со switch написать но ему нужны конкретные значения а не переменные а я увы обойтись без переменных не могу


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
        public double НормаРасхода
        {
            get
            {
                if (_ВыбранныйВид == Интерфейс.B6 || (_ВыбранныйВид == "Пруток" && (ВидемостьФормыСечения== "Visible" && ФормаСечения=="КР") || ВидемостьФормыСечения == "Collapsed"))
                {
                    return Круг();
                }
                else if (_ВыбранныйВид == Интерфейс.B7)
                {
                    return Лист();
                }
                else if (_ВыбранныйВид == Интерфейс.B8)
                {
                    return ТрубаКруглая();
                }
                else if (_ВыбранныйВид == Интерфейс.B9)
                {
                    return ТрубаПрямоугольнаяКвадратная();
                }
                else if (_ВыбранныйВид == Интерфейс.B11 && Толщина != 0 && Длинна != 0 && Ширина != 0 && КоэфОтходов != 0)
                {
                    return ЛентаСинтетическая();
                }
                else { return 0; }
            }
        }
 
        double Круг()
        {
            if (ВыбраннаяПлотность != 0 && Диаметр != 0 && Длинна != 0 && КоэфОтходов != 0)
            {
                return Math.Round(((Math.PI * ((Диаметр / 2) / 100) * ((Диаметр / 2) / 100) * (Длинна / 100)) * ВыбраннаяПлотность * КоэфОтходов), 3); //Круг
            }
            else return 0;
        }
        double Лист()
        {
            if (ВыбраннаяПлотность != 0 && Толщина != 0 && Длинна != 0 && Ширина != 0 && КоэфОтходов != 0)
            {
                return Math.Round(((Толщина / 100) * (Длинна / 100) * (Ширина / 100) * ВыбраннаяПлотность * КоэфОтходов), 3);//Лист
            }
            else return 0;
        }
 
        double ТрубаКруглая()
        {
            if (ВыбраннаяПлотность != 0 && Толщина != 0 && Длинна != 0 && Ширина != 0 && Высота != 0 && КоэфОтходов != 0)
            {
                return Math.Round(((((Толщина / 100) * ((Высота * 2 + Ширина * 2) / 100) * (Длинна / 100)) * ВыбраннаяПлотность) * КоэфОтходов), 3);
            }
            else return 0;
        }
 
        double ТрубаПрямоугольнаяКвадратная()
        {
            if (ВыбраннаяПлотность != 0 && Диаметр != 0 && Длинна != 0 && Толщина != 0 && КоэфОтходов != 0)
            {
                var refdi = ((Math.PI * ((Диаметр / 2) / 100) * ((Диаметр / 2) / 100) * (Длинна / 100)) * ВыбраннаяПлотность * КоэфОтходов);
                var refdi1 = ((Math.PI * (((Диаметр - (Толщина * 2)) / 2) / 100) * (((Диаметр - (Толщина * 2)) / 2) / 100) * (Длинна / 100)) * ВыбраннаяПлотность * КоэфОтходов);
                return Math.Round((refdi - refdi1), 3);
            }
            else return 0;
        }
 
        double ЛентаСинтетическая()
        {
            if (ВыбраннаяПлотность != 0 && Диаметр != 0 && Длинна != 0 && Толщина != 0 && КоэфОтходов != 0)
            {
                return КоэфОтходов * (Длинна / 1000);
            }
            else return 0;
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2015, 18:05
Ответы с готовыми решениями:

Как компактнее сохранять результат теста ?
У меня на странице есть тест, мне надо каким-либо образом сохранить то, что отметил клиент, в...

Сделать код компактнее и при этом понятно
public static void symbols(string text,string text2,string special) { int a...

Как компактнее записать код
Как можно записать этот код с наименьшим количеством строк ? Sub Итог_1_0_1() = = ...

Задача про кирпич - как можно написать компактнее программу, чтобы она работала?
Sub Кирпич() a = InputBox("Ширина кирпича a") b = InputBox(" Высота кирпича b") c =...

24
kesean
30.06.2015, 20:21
  #2

Не по теме:

И не лень постоянно переключать раскладку клавиатуры? Имена переменных на кириллице - моветон. К тому же, с ошибками...

0
В поиске
102 / 50 / 16
Регистрация: 20.04.2014
Сообщений: 785
30.06.2015, 22:28  [ТС] 3
kesean, Увы из за незнания английского это наилучший вариант а переменные типо erbbrsdrb потом через 10 строк начинаю думать что же эта за переменная))) даже транслит глаза мне режет ну как вам эти русские слова, а по поводу ошибок ну увы и с русским беда большая))
0
skilllab
30.06.2015, 22:56
  #4

Не по теме:

Цитата Сообщение от kesean Посмотреть сообщение
Имена переменных на кириллице - моветон
это обфускация :)

0
483 / 396 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
01.07.2015, 09:10 5

Не по теме:

Цитата Сообщение от kesean Посмотреть сообщение
Имена переменных на кириллице - моветон.
Это вы ещё 1с не видели



Цитата Сообщение от КВА696 Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (_ВыбранныйВид == Интерфейс.B6 || (_ВыбранныйВид == "Пруток" && (ВидемостьФормыСечения== "Visible" && ФормаСечения=="КР") || ВидемостьФормыСечения == "Collapsed"))
* * * * * * * * {
* * * * * * * * * * return Круг();
* * * * * * * * }
* * * * * * * * else if (_ВыбранныйВид == Интерфейс.B7)
* * * * * * * * {
* * * * * * * * * * return Лист();
* * * * * * * * }
* * * * * * * * else if (_ВыбранныйВид == Интерфейс.B8)
* * * * * * * * {
* * * * * * * * * * return ТрубаКруглая();
* * * * * * * * }
* * * * * * * * else if (_ВыбранныйВид == Интерфейс.B9)
* * * * * * * * {
* * * * * * * * * * return ТрубаПрямоугольнаяКвадратная();
* * * * * * * * }
* * * * * * * * else if (_ВыбранныйВид == Интерфейс.B11 && Толщина != 0 && Длинна != 0 && Ширина != 0 && КоэфОтходов != 0)
* * * * * * * * {
* * * * * * * * * * return ЛентаСинтетическая();
* * * * * * * * }
* * * * * * * * else { return 0; }
Может таки switch...case применить?
0
Эксперт .NETАвтор FAQ
10370 / 5101 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.07.2015, 09:25 6
КВА696, А зачем вам куча этих условий типа
C#
1
Толщина != 0 && Длинна != 0 && Ширина != 0
?

Формулы расчета объема все равно дадут ноль, если к примеру длина равна нулю.
По факту вам нужен простой свитч по _ВыбранныйВид, который переключает формулы расчета, остальные проверки вообще не нужны.
0
Эксперт .NET
5474 / 4244 / 1211
Регистрация: 12.10.2013
Сообщений: 12,248
Записей в блоге: 2
01.07.2015, 09:36 7
Цитата Сообщение от aquaMakc Посмотреть сообщение
Может таки switch...case применить?
Ятд, и switch(...) case(...) тут совершенно ни к чему.
Многовато условий. Лучший вариант, по моему мнению - словарь.
0
В поиске
102 / 50 / 16
Регистрация: 20.04.2014
Сообщений: 785
01.07.2015, 09:38  [ТС] 8
Цитата Сообщение от aquaMakc Посмотреть сообщение
Может таки switch...case применить?
Так проблема в том что _ВыбранныйВид равен не конкретному значению а переменной а на сколько я думал у switch в case пишется конкретное значение будь то 1 или "абв" но не переменная.(Если ошибаюсь поправьте так как помоему switch был бы лучше если его можно было применить)

Цитата Сообщение от Storm23 Посмотреть сообщение
остальные проверки вообще не нужны.
Что то даже не подумал как то, спс. Но все равно придется сделать проверку чтобы они небыли равны null. А про свичь можно по подробнее как сделать его опираясь на переменные

Добавлено через 1 минуту
Цитата Сообщение от insite2012 Посмотреть сообщение
Лучший вариант, по моему мнению - словарь.
А не подскажите о каком именно словаре идет речь?
0
483 / 396 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
01.07.2015, 09:42 9
Цитата Сообщение от insite2012 Посмотреть сообщение
Ятд, и switch(...) case(...) тут совершенно ни к чему.
почему это?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch (_ВыбранныйВид)
{
   case Интерфейс.B7:
      return Лист();
   case Интерфейс.B8:
      return ТрубаКруглая();
   ...
   case Интерфейс.B11:
      if (Толщина == 0 || Длинна == 0 || Ширина == 0 || КоэфОтходов == 0)
         return 0;
      return ЛентаСинтетическая();
   default:
      return 0;
}
0
В поиске
102 / 50 / 16
Регистрация: 20.04.2014
Сообщений: 785
01.07.2015, 09:46  [ТС] 10
Может я чтото делаю не так

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


а Интерфейс.B7

C#
1
2
3
4
5
6
7
8
    public class Interfeis
    {
        public string B3 { get { return "Материал"; } }
        public string B4 { get { return "Стандартное изделие"; } }
        public string B5 { get { return "Деталь"; } }
        public string B6 { get { return "Круг"; } }
        public string B7 { get { return "Лист"; } }
}
C#
1
Interfeis Интерфейс = new Interfeis();
0
Эксперт .NET
5474 / 4244 / 1211
Регистрация: 12.10.2013
Сообщений: 12,248
Записей в блоге: 2
01.07.2015, 09:55 11
Цитата Сообщение от aquaMakc Посмотреть сообщение
почему это?
Цитата Сообщение от КВА696 Посмотреть сообщение
компакнее
Ну хотя бы вот поэтому.
Добавим сюда более простое добавление значений в будущем (а если еще эти проверки раскиданы по всему коду, то еще проще, достаточно сделать один статик словарь и в одном месте добавлять значения).
0
В поиске
102 / 50 / 16
Регистрация: 20.04.2014
Сообщений: 785
01.07.2015, 09:58  [ТС] 12
Цитата Сообщение от insite2012 Посмотреть сообщение
один статик словарь и в одном месте добавлять значения
А не затруднит вас хоть какой нить пример или ссылочку а то я просто пока что не пойму о чем идет речь
0
483 / 396 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
01.07.2015, 10:04 13
Цитата Сообщение от КВА696 Посмотреть сообщение
Может я чтото делаю не так
Не так.

Стринг вообще не рекомендуется использовать для внутрипрограммного обмена. Только для вывода на экран пользователю.

я бы порекомендовал создать перечисление Enum Вид {B3, B4, B5 ... }; и работать с ним. Если же надо вывести инфу пользователю делать это через примерно такую конструкцию:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public String СтроковыйВид
{
   get
   {
      switch (_ВыбранныйВид)
      {
         case Вид.B3:
            return "Материал";
         
       и т.д. 
 
      }
   }
}
Добавлено через 4 минуты
insite2012, Так у автора классическая стейт-машина...определение состояния и выполнение соответствующего действия. Я не могу сходу придумать, как из словаря по ключу вызывать метод. Да ещё и с дополнительными проверками (у него ведь могут быть не только проверки на 0).
0
Эксперт .NETАвтор FAQ
10370 / 5101 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.07.2015, 10:04 14
Цитата Сообщение от aquaMakc Посмотреть сообщение
надо вывести инфу пользователю делать это через примерно такую конструкцию
А еще лучше - через атрибуты.
0
В поиске
102 / 50 / 16
Регистрация: 20.04.2014
Сообщений: 785
01.07.2015, 10:05  [ТС] 15
aquaMakc,
А я к Enum Вид {B3, B4, B5 ... }; потом прибиндиться могу? а то сделано так

C#
1
2
3
4
5
6
7
8
public class Interfeis
    {
        public string B3 { get { return "Материал"; } }
        public string B4 { get { return "Стандартное изделие"; } }
        public string B5 { get { return "Деталь"; } }
        public string B6 { get { return "Круг"; } }
        public string B7 { get { return "Лист"; } }
}
Из того понимания что на всех окошках где встречается эти слова я просто биндингом ссылаюсь на них
0
Эксперт .NETАвтор FAQ
10370 / 5101 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.07.2015, 10:06 16
Цитата Сообщение от КВА696 Посмотреть сообщение
Но все равно придется сделать проверку чтобы они небыли равны null.
Ширина не может быть равна null, это промахи вашей типизации. Сделайте их нессылочного типа (double или float) и тогда они в принципе не могут быть равны null.
0
В поиске
102 / 50 / 16
Регистрация: 20.04.2014
Сообщений: 785
01.07.2015, 10:16  [ТС] 17
Цитата Сообщение от Storm23 Посмотреть сообщение
Ширина не может быть равна null
У меня плотность выберается из комбокса и там либо выбрать либо написать а для этого в строчку

XML
1
<ComboBox IsTextSearchEnabled="False" Text="{Binding  Path=ВыбраннаяПлотность, Source={StaticResource Material}}"
ВыбраннаяПлотность должна быть string иначе запятая или точка просто исчезает почему то если делать доубле
0
Эксперт .NET
5474 / 4244 / 1211
Регистрация: 12.10.2013
Сообщений: 12,248
Записей в блоге: 2
01.07.2015, 10:26 18
Цитата Сообщение от aquaMakc Посмотреть сообщение
Я не могу сходу придумать, как из словаря по ключу вызывать метод.
А в чем проблема? Ключом в словаре ставим что надо, а значением - делегат (типа Action<T> или Func<T>) и вызываем его когда надо.
0
Эксперт .NETАвтор FAQ
10370 / 5101 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.07.2015, 10:33 19
Цитата Сообщение от КВА696 Посмотреть сообщение
У меня плотность выберается из комбокса и там либо выбрать либо написать а для этого в строчку
Это все проблемы интерфейса, в расчетную часть должны поступать корректные данные. Точка.
0
108 / 7 / 3
Регистрация: 29.06.2012
Сообщений: 28
02.07.2015, 11:20 20
Я предлагаю воспользоваться преимуществами ООП.
Писанины меньше не станет, наверное, зато всё будет выглядеть слаженно, компактно и по существу.
У меня получилось так, что основное свойство ваше выглядит так:
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2015, 11:20
Помогаю со студенческими работами здесь

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

StrToInt - можно ли быстрее и компактнее
StrToInt: push ebp xor ebx,ebx xor edi,edi mov...

Есть ли способ писать компактнее?
t='Graph' if t == 'DiGraph': G = nx.DiGraph() elif t == 'Graph': t = nx.Graph() ...

Какие еще варианты есть компактнее
Правильно ли я сделал? Есть ли еще варианты, поскидывайте пожалуйста я поразбираюсь Программа...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru