powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Имеет ли право существовать такой подход к сиглетону?
25 сообщений из 306, страница 4 из 13
Имеет ли право существовать такой подход к сиглетону?
    #38199554
Фотография Василий Викторович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch,

уж поверьте мне Рефлексии я не боюсь :), просто это не оправдано глупо ее так использовать, вот кое что из старого моего проекта чтобы кто - не кричал о том что я боюсь рефлексии , надеюсь слышали про формат медицинских документов HL7? :)
Код: 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.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace HL7PatientVisitControl.PatientVisit
{
    public class PropertyListInfoMethod
    {
        public PropertyInfo List { get; set; }
        public FieldInfo Functor { get; set; }
        public MethodInfo Method { get; set; }
    }

    public class Segment<TSegmentValue, TSegment>:Element<TSegmentValue, TSegment>
    {

        private sealed class SingletonCreator
        {
            private static readonly List<PropertyListInfoMethod> propertyListInfoMethods =
            typeof(TSegmentValue)
            .GetProperties()
            .Where(x => x.PropertyType.IsGenericType&&
                   x.GetCustomAttributes(typeof(UsedAttribut), true).Any())
            .Join(typeof(TSegmentValue)
                  .GetFields(BindingFlags.NonPublic | BindingFlags.Static)
                  .Where(x => x.GetCustomAttributes(typeof(FunctorAttribut), false).Any()),
                  list => list.Name.ToLowerInvariant(),
                  functor => ((FunctorAttribut)functor
                                             .GetCustomAttributes(typeof(FunctorAttribut), false)
                                             .First()).CollectionName,
                  (list, functor) => new PropertyListInfoMethod
                  {
                      List = list,
                      Functor = functor,
                      Method = typeof(TSegmentValue)
                             .GetMethod("ForeachCollection")
                             .MakeGenericMethod(new Type[]
                             {
                                 ((FunctorAttribut)functor
                                             .GetCustomAttributes(typeof(FunctorAttribut), false)
                                             .First()).Value,
                                 ((FunctorAttribut)functor
                                             .GetCustomAttributes(typeof(FunctorAttribut), false)
                                             .First()).Element                                
                             })
                  })
             .ToList();

            public static List<PropertyListInfoMethod> PropertyListInfoMethods
            { get { return propertyListInfoMethods; } }
        }

        public void ForeachCollection<TValue, TElement>(IEnumerable<TValue> collection, TSegment segment,
                       Func<TSegment, int, TElement> functor)
        {
            int number = 0;
            collection.All(x =>
            {
                TElement element = functor(segment, number++);
                ((ISetFieldValue<TElement>)x).SetFieldValue(element);
                return true;
            });
        }

        public override void SetFieldValue(TSegment field)
        {
            base.SetFieldValue(field);
            if (!IsEmptyList())
                SingletonCreator.PropertyListInfoMethods.All(x => 
                {
                    object list=x.List.GetValue(this, null);
                    object functor=x.Functor.GetValue(this);
                    x.Method.Invoke(this, new object[] { list, field, functor });
                    return true;
                });
        }

        public new bool IsEmptyList()
        {
            return (SingletonCreator.PropertyListInfoMethods.Count == 0);
        }
    }
}



Просто ещераз в n - раз повторюсь Рефлексия не есть серебряная пуля :)
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199555
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий ВикторовичХочеться узнать мнение сообщества :) имеет ли право существовать такой подход?:)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    public class Singleton<TClass> where TClass:new()
    {
        protected Singleton() { }
        private sealed class SingletonClassCreator
        {
            private static readonly TClass instance = new TClass();
            public static TClass Instance { get { return instance; } }
        }

        public static TClass Instance
        {
            get { return SingletonClassCreator.Instance; }
        }
    }


это не синглтон. С тем же успехом сделайте словарь типа обджект и заусньте туда любой объект и назовите это все синглтонам по типу(например ключь типа Type). Бред же
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199559
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

Ссылка будет одна и таже, синглтоном оно от этого не станет.

skyANALelouch, и где использование-то, Вы видите? Где вызов TestProc()? Чем отличается вызов TestClass.Instance от Singleton<TestClass>.Instance? Зачем наследовать TestClass от Singleton<TestClass>?
В моём примере я использовал код с вики так Singleton<MyClass>.Instance. Это означает, что я использовал не Singleton?

То есть, даже после внимательного прочтения, вы не поняли, что состояние, которое должен содержать синглтон, находится в TestClass? И именно он должен быть синглтоном.
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199562
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий Викторович,

и смысл этого кода?
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199572
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LelouchskyANA,

Ссылка будет одна и таже, синглтоном оно от этого не станет.

skyANALelouch, и где использование-то, Вы видите? Где вызов TestProc()? Чем отличается вызов TestClass.Instance от Singleton<TestClass>.Instance? Зачем наследовать TestClass от Singleton<TestClass>?
В моём примере я использовал код с вики так Singleton<MyClass>.Instance. Это означает, что я использовал не Singleton?

То есть, даже после внимательного прочтения, вы не поняли, что состояние, которое должен содержать синглтон, находится в TestClass? И именно он должен быть синглтоном.Напишите код, получающий это состояние.
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199574
Фотография Василий Викторович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch, мдя...а почему вы считаете что ИМЕННО TClass ну просто ОБЯЗАН реализовывать обвязку сингелтона? почему мой вариант вас смущает? только то что все вокруг с упорством барана твердят о том что у сингелтона ну просто ОБЯЗАН БЫТЬ закрытый конструктор??? мдя...
Знаете перечитайте ка ещераз GoF и Фаулера, может тогда мозги в порядок приведете, в частности в GoF сказано что они предлагают РЕКОМЕНДОВАННЫЙ СПИСОК РЕШЕНИЙ ТИПИЧНЫХ ЗАДАЧ , выделил жирным шрифтом спецально для Вас кстати не забываем и про Утиную Типизацию которая гласит что «Если оно выглядит как утка, плавает как утка и крякает как утка, то это, наверное, и есть утка» , а мой Singelton<TClass>.Instance ну ни каким поведением от синглтона не отличается и КАЖДЫЙ РАЗ когда вы запросите Singelton<TClass>.Instance вы получите ссылку на ОДИН И ТОТ ЖЕ ОБЬ ЕКТ :) спорить будем дальше?
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199577
Фотография Василий Викторович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch,

о смысл этого кода а вы присмотритесь внимательно может и найдете что то удивительное
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199581
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий Викторович, по всей видимости для камрада Lelouch TestClass.Instance и Singleton<TestClass>.Instance - это два разных состояния.
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199588
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkyANA
Нет конечно. А для вас класс с публичным конструктором - Singleton?
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199590
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий Викторович,

Вы получаете список свойств "сегмента", тип которых является Generic`ом и они помечены кастомным атрибутом UsedAttribute. (Судя по дальнейшему использованию, это коллекции?).
После чего берете все статические поля, помеченные атрибутом FunctorAttribute (возможно, это ф-ии, берущие элемент сегмента по номеру?), + "создаете" GenericMethod из ForeachCollection, передавая ему в качестве параметров типа Тип элементов коллекции TValue и выходной тип functor'a.
Что делает SetFieldValue не очень видно, кроме того, что она в свою очередь вызывает ForeachCollection для дочерних коллекций сегмента.

Я думаю что где то я ошибаюсь, но всего кода не видно в любом случае.
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199591
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

Что из этого Singleton?

Код: 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.
public static class Program
	{
		public static void Main()
		{
			Singleton<Test1>.Instance.A = "Tra ta ta, this is Test1";
			Singleton<Test2>.Instance.B = "Bla Bla Bla, this is Test2";
			Console.WriteLine(Singleton<Test1>.Instance.A);
			Console.WriteLine(Singleton<Test2>.Instance.B);

		}
	}

	public class Singleton<T> where T : class
	{		
		protected Singleton() { }

		private sealed class SingletonCreator<S> where S : class
		{			
			private static readonly S instance = Activator.CreateInstance(typeof(S), nonPublic: true) as S;
			public static S CreatorInstance
			{
				get { return instance; }
			}
		}

		public static T Instance
		{
			get { return SingletonCreator<T>.CreatorInstance; }
		}

	}

	class Test1
	{
		public string A { get; set; }
		private Test1() { }
	}

	class Test2
	{
		public string B { get; set; }
	}
}
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199592
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Test1 или Test2?
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199596
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий Викторович,

А вы не умеете читать определение
авторSingleton - Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа. Существенно то, что можно пользоваться именно экземпляром класса, так как при этом во многих случаях становится доступной более широкая функциональность. Например, к описанным компонентам класса можно обращаться через интерфейс, если такая возможность поддерживается языком.

Что, ваш код Гарантирует, что MyClass имеет 1 и только 1 экземпляр:
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199597
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваш код выполняет только 2е - предоставляет глобальную точку доступа, единственность экземпляра MyClass не гарантируется ни разу.
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199598
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch, напишите код, что создаёт два различных экземпляра типа Singleton<MyClass>.
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199601
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

А ответ на вопрос какой? (c)
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199602
Фотография Василий Викторович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch, слона вы таки и не приметили
Код: c#
1.
2.
3.
4.
public new bool IsEmptyList()
{
return (SingletonCreator.PropertyListInfoMethods.Count == 0;
}


указываю для невнимательных :)
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199605
Фотография Василий Викторович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch,

Вот в этом и опасность смешивания шаблонов проектирования с реальными классами, реальная логика шаблона размазываеться по всему классу и так с наскока не скажешь толь фабрика пред тобой то ли сингелтон ...
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199609
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я уже несколько раз пытался донести до вас мысль, что синглтоном в примере на вики является TestClass. В единственности Singleton<TestClass> нет никакого смысла , потому что все, что он предоставляет - доступ к эвземпляру TestClass. Если TestClass управляет каким то состоянием, которое должно быть общим, например, для всех нитей приложения, то монопенисуально, что Singleton<TestClass> - единственный. Каждая нить (при криворуком программисте) может создать себе свой экземпляр TestClass и взять состояние оттуда. То что при этом оно НИКАК не будет относится к общему состоянию нитей - это нормально?
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199611
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий Викторович,

Если таких свойств или методов нет, рекурсия завершается.
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199612
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LelouchskyANA,

А ответ на вопрос какой? (c)
Код: c#
1.
Activator.CreateInstance(typeof(TestClass), true)

И где Ваш пример использования из вики гарантирует единственность экземпляра?
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199615
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouch,

оставьте, вы не достучитесь)
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199616
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LelouchЯ уже несколько раз пытался донести до вас мысль, что синглтоном в примере на вики является TestClass. В единственности Singleton<TestClass> нет никакого смысла , потому что все, что он предоставляет - доступ к эвземпляру TestClass. Если TestClass управляет каким то состоянием, которое должно быть общим, например, для всех нитей приложения, то монопенисуально, что Singleton<TestClass> - единственный. Каждая нить (при криворуком программисте) может создать себе свой экземпляр TestClass и взять состояние оттуда. То что при этом оно НИКАК не будет относится к общему состоянию нитей - это нормально?Бла-бла-бла. Смотрим код выше. Вот я криворукий программист не нашёл у класса TestClass публичного конструктора и заюзал Activator. Где Вы что гарантировали?
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199618
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAБла-бла-бла. Смотрим код выше. Вот я криворукий программист не нашёл у класса TestClass публичного конструктора и заюзал Activator. Где Вы что гарантировали?
демогогия
...
Рейтинг: 0 / 0
Имеет ли право существовать такой подход к сиглетону?
    #38199622
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий Викторович,

От этого шаблон не меняется. И все эти GoF и Фаулеры говорят не то что "называйте синглтоном, даже если оно ведет себя как фабрика", а то что вы должны применять шаблон как вам удобно. Просто не надо называть это реализацией шаблона.
Это что то типа "реализация шаблона, обеспечивающего использование единственного объекта, а так же возможность их создания при необходимости применительно к моей задаче".
Похожее поведение есть и у МС, например HttpContext имеет свойство Current, но так же позволяет создавать новые экземпляры. Кстати он не является Singleton`ом в любом случае, потому что у каждого запроса он свой.
Конкретно ваш пример плох только тем, что если мне действительно потребуется Singleton, у которого нет возможности создать еще 1 экземпляр, то сделать это я не смогу.
...
Рейтинг: 0 / 0
25 сообщений из 306, страница 4 из 13
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Имеет ли право существовать такой подход к сиглетону?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]