Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
.NET 4.x

Статичный класс заменить на нормальный код (паттерны)

23.11.2015, 19:12. Показов 1128. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется статичный класс с разными координатами точек
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
 static class DrawingPoints
    {
        public static Dictionary<String, List<double[]>> MyPoints { get; set; }
        public static Dictionary<String, List<double[]>> MyArrowPoints { get; set; }
        public static Double[] OriginPoint { get; set; }
        public static double[] CenterBaseMathVectorD { get; set; }
        public static double[] CenterOppositeMathVectorD { get; set; }
        public static List<CoordPoints> TargetPoints { get; set; }
 
        //Точки пересечения
        public static double[] BaseIntersectonPointOne { get; set; }
        public static double[] BaseIntersectonPointTwo { get; set; }
        public static double[] OppositeIntersectonPointOne { get; set; }
        public static double[] OppositeIntersectonPointTwo { get; set; }
 
 
        //Стрелки
        public static double[] MainFirstPointArrow { get; set; }
        public static double[] MainSecondPointArrow { get; set; }
        public static double[] MainMiddlePointArrow { get; set; }
        public static double[] OppositeFirstPointArrow { get; set; }
        public static double[] OppositeSecondPointArrow { get; set; }
        public static double[] OppositeMiddlePointArrow { get; set; }
    }
Имеется программка с кучей всяких классов и форм. В одной из форм точки создаются, в другой могут считываться. В третьей изменяться.

Цель: уйти от статичного класса вообще. Подскажите как? Гуглил listener - вроде похоже.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.11.2015, 19:12
Ответы с готовыми решениями:

static ref class, глобальный статичный класс
Добрый день, столкнулся с проблемой создания глобального гласа, который уже был бы реализован при запуске программы т.е. он уже был...

Паттерны. Генерирующий класс
Только начал изучать паттерны, не очень понимаю пока что к чему. Условие: Фабрика производит мороженное &quot;Чудо-буренка&quot; для...

DirectX 9.0 Ищу нормальный рабочий код для вывода текста. В книгах код не работает!
Подскажите нормальный рабочий код для вывода текста на экран. Сложность в том, что при разных версиях DirectX разные коды. В интернете...

6
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
24.11.2015, 08:18
Цитата Сообщение от skilllab Посмотреть сообщение
Цель: уйти от статичного класса вообще. Подскажите как?
А зачем?

Паттерны решают какую-то проблему проектирования. Какая проблема у вас? Если у вас проблем нет - не усложняйте себе жизнь.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
24.11.2015, 14:06  [ТС]
Проблема в статичном классе, изменения которого доступны вообще отовсюду. И, так как я использую статичный класс для хранения, изменения, чтения данных, а не для каких то вспомогательных методов а-ля Math из фреймворка, то возникло подозрение что этот "глобально доступный" класс не слишком правильная идея.
Кода - море. Если вдруг кто-то там что-то случайно поменяет (имеется в виду работа программы), огребу проблемы. Но и бездумное изменение тоже хочется ограничить. Вроде Singleton может помочь, но у меня есть планы на многопоточность.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
02.12.2015, 06:44
поля внятно описать можешь? может тогда и придумаю что
0
298 / 260 / 108
Регистрация: 26.10.2012
Сообщений: 810
02.12.2015, 08:32
Прежде всего, C# - не очень удобный язык для написания библиотек с четко прописанным уровнем доступа. Для этого лучше приспособлен C++ с его дружественными функциями и классами.

Можно дать классу модификатор internal, чтобы он был доступен только внутри сборки.

Уйти от статики просто: убираем слово static вообще из кода класса и используем ссылку на экземпляр этого класса всюду, где этот класс нужен. Недостатки: большая усложненность кода, необходимость следить за этим классом.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
02.12.2015, 08:44  [ТС]
агерон, я бы с радостью расписал код. Но боюсь это листинг на много страниц. Мог бы даже тестовый проект запилить, но это ещё хуже. Надо полностью вникать в работу аддона да ещё ставить много гигабайтные программы, чтобы этот аддон отдебажить хотя бы. Попробую картинками вечером нарисовать.
------------------
Цитата Сообщение от jetyb Посмотреть сообщение
используем ссылку на экземпляр этого класса всюду
Тоже вариант. Но вот только есть классы, которые и не наследуются от базового (где собственно можно и создать этот уже не статичный класс) и есть которым и ссылку то не передашь на базовый (особенности архитектуры самого аддона, шаблон которого рекомендован производителем ПО). Можно очень усложнить код, всякими интерфейсами и прочим. Но там итак сейчас море всего, работаем вдвоём с коллегой, такой уровень уже сложно будет потянуть, да и лень (это если полностью пересматривать архитектуру). Поэтому ищу как бы решение.

Добавлено через 3 минуты
Цитата Сообщение от jetyb Посмотреть сообщение
модификатор internal
так я не за внешнее воздействие беспокоюсь, а за внутреннее. К примеру, ссылок на этот статичный класс с точками у меня штук 30 - 40 уже есть))) Одно дело отследить эти изменения и вновь запилить где нибудь костыль, а другое всётаки пересмотреть ту часть проекта, где задействован именно этот статичный класс.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
02.12.2015, 13:21
кхм... как вариант заюзай singleton IoC container (к примеру Unity) с регистрацией экземпляра класса реализующий необходимый интерфейс и будет тебе счастье, вот примерно как я это вижу:

DrawingPoints.cs
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace IoC.Console
{
    public class CoordPoints
    {
        public double X { get; set; }
        public double Y { get; set; }
    }
 
    public interface IReadOnlyDrawingPoints
    {
        Dictionary<string, List<double[]>> MyPoints { get; }
        Dictionary<string, List<double[]>> MyArrowPoints { get; }
        double[] OriginPoint { get; }
        double[] CenterBaseMathVectorD { get; }
        double[] CenterOppositeMathVectorD { get; }
        List<CoordPoints> TargetPoints { get; }
 
        //Точки пересечения
        double[] BaseIntersectonPointOne { get; }
        double[] BaseIntersectonPointTwo { get; }
        double[] OppositeIntersectonPointOne { get; }
        double[] OppositeIntersectonPointTwo { get; }
 
 
        //Стрелки
        double[] MainFirstPointArrow { get; }
        double[] MainSecondPointArrow { get; }
        double[] MainMiddlePointArrow { get; }
        double[] OppositeFirstPointArrow { get; }
        double[] OppositeSecondPointArrow { get; }
        double[] OppositeMiddlePointArrow { get; }
    }
 
    public interface IDrawingPoints
    {
        Dictionary<string, List<double[]>> MyPoints { get; set; }
        Dictionary<string, List<double[]>> MyArrowPoints { get; set; }
        double[] OriginPoint { get; set; }
        double[] CenterBaseMathVectorD { get; set; }
        double[] CenterOppositeMathVectorD { get; set; }
        List<CoordPoints> TargetPoints { get; set; }
 
        //Точки пересечения
        double[] BaseIntersectonPointOne { get; set; }
        double[] BaseIntersectonPointTwo { get; set; }
        double[] OppositeIntersectonPointOne { get; set; }
        double[] OppositeIntersectonPointTwo { get; set; }
 
 
        //Стрелки
        double[] MainFirstPointArrow { get; set; }
        double[] MainSecondPointArrow { get; set; }
        double[] MainMiddlePointArrow { get; set; }
        double[] OppositeFirstPointArrow { get; set; }
        double[] OppositeSecondPointArrow { get; set; }
        double[] OppositeMiddlePointArrow { get; set; }
    }
 
    public class DrawingPoints:IDrawingPoints, IReadOnlyDrawingPoints
    {
        public DrawingPoints()
        {
            MyPoints = new Dictionary<string, List<double[]>>();
            MyArrowPoints = new Dictionary<string, List<double[]>>();
            OriginPoint = new double[5];
            CenterBaseMathVectorD = new double[5];
            CenterOppositeMathVectorD = new double[5];
            TargetPoints= new List<CoordPoints>();
            BaseIntersectonPointOne = new double[5];
            BaseIntersectonPointTwo = new double[5];
            OppositeIntersectonPointOne = new double[5];
            OppositeIntersectonPointTwo = new double[5];
            MainFirstPointArrow = new double[5];
            MainSecondPointArrow = new double[5];
            MainMiddlePointArrow = new double[5];
            OppositeFirstPointArrow = new double[5];
            OppositeSecondPointArrow = new double[5];
            OppositeMiddlePointArrow = new double[5];
        }
 
        public Dictionary<string, List<double[]>> MyPoints { get; set; }
        public Dictionary<string, List<double[]>> MyArrowPoints { get; set; }
        public double[] OriginPoint { get; set; }
        public double[] CenterBaseMathVectorD { get; set; }
        public double[] CenterOppositeMathVectorD { get; set; }
        public List<CoordPoints> TargetPoints { get; set; }
        public double[] BaseIntersectonPointOne { get; set; }
        public double[] BaseIntersectonPointTwo { get; set; }
        public double[] OppositeIntersectonPointOne { get; set; }
        public double[] OppositeIntersectonPointTwo { get; set; }
        public double[] MainFirstPointArrow { get; set; }
        public double[] MainSecondPointArrow { get; set; }
        public double[] MainMiddlePointArrow { get; set; }
        public double[] OppositeFirstPointArrow { get; set; }
        public double[] OppositeSecondPointArrow { get; set; }
        public double[] OppositeMiddlePointArrow { get; set; }
    }
}
UnityContainerSingleton.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using Microsoft.Practices.Unity;
 
namespace IoC.Console
{
 
    public class UnityContainerSingleton 
    {
        protected UnityContainerSingleton() { }
 
        private sealed class UnityContainerSingletonCreator
        {
            private static readonly Lazy<IUnityContainer> instance = new Lazy<IUnityContainer>(() => new UnityContainer());
            public static IUnityContainer Instance { get { return instance.Value; } }
        }
 
        public static IUnityContainer Instance
        {
            get { return UnityContainerSingletonCreator.Instance; }
        }
    }
}
Programm.cs
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
using Microsoft.Practices.Unity;
 
namespace IoC.Console
{
    class Program
    {
 
        public static void IocRegisterTypes()
        {
            UnityContainerSingleton.Instance.RegisterInstance<IDrawingPoints>(new DrawingPoints());
            var drawingPoints = UnityContainerSingleton.Instance.Resolve<IDrawingPoints>();
            UnityContainerSingleton.Instance.RegisterInstance((IReadOnlyDrawingPoints)drawingPoints);     
        }
 
        static void Main(string[] args)
        {
            IocRegisterTypes();
            var drawingPoints = UnityContainerSingleton.Instance.Resolve<IDrawingPoints>();
            var readOnlyDrawingPoints = UnityContainerSingleton.Instance.Resolve<IReadOnlyDrawingPoints>();
            drawingPoints.OriginPoint = new [] {1.0};
            System.Console.WriteLine("drawingPoints1.OriginPoint[0]: {0}, drawingPoints2.OriginPoint[0]: {1}", drawingPoints.OriginPoint[0], readOnlyDrawingPoints.OriginPoint[0]);
            System.Console.ReadKey();
        }
    }
}
Вложения
Тип файла: rar IoC.Console.rar (787.1 Кб, 1 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2015, 13:21
Помогаю со студенческими работами здесь

Блок-схема | Псевдокод | Паттерны | Код ?
Здравствуйте коллеги. Вопрос такой, когда нужно разработать приложение/макросы/модули, какие этапы подготовки нужно совершить перед тем,...

Паттерны проектирования, нужен код на С++ и UML диаграмма
Декоратор (Decorator) или Оболочка (Wrapper) - GoF Итератор (Iterator) или Курсор (Cursor) - GoF Одиночка (Singleton) - GoF

Как заменить блеклый шрифт на нормальный
Копирую текст с https://www.lingvolive.com/ru-ru/translate/en-ru/excel (выбрать вверху &quot;С примерами&quot;) в ворд. Текст примеров &quot;to...

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

Нормальный код?
Задание такое: Нужно создать класс, в котором объектом является двумерный массив размером n x m. Массив должен размещаться в динамической...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru