powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Инициализация статического класса
25 сообщений из 279, страница 5 из 12
Инициализация статического класса
    #39810423
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProИзопропилпропущено...

да+1 кстати

Статические классы только для методов расширения.почему?
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810431
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyShocker.Proпропущено...
+1 кстати

Статические классы только для методов расширения.почему?

"Наша песня хороша, начинай сначала" (с)
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810439
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatAntonariyпропущено...
почему?

"Наша песня хороша, начинай сначала" (с)
Ага, это зачем ввели?
https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-8#static-local-functions
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810454
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВАга, это зачем ввели?
https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-8#static-local-functions
Слышал звон. Static local functions не имеюют никакого отношения к статическим классам или методом. Это просто локальные функции не имеющие доступа к замыканию. Для гарантии отсутствия их побочных эффектов. А статический класс это по сути самая что ни на есть глобальная переменная, которая прямо-таки тянет на то эти самые побочные эффекты наплодить. Но, лично мне, достаточно уже того, что со всем, что использует статические классы, возникает полная жоппа с юнит-тестированием. Тут уже на пяти страницах это обсуждалось, надоело повторяться.

Код: c#
1.
2.
3.
4.
5.
6.
class Person
{
    public DateTime DateOfBirth { get; private set; }

    public DateTimeSpan Age => DateTime.Now - DateOfBirth;
}



А теперь давай, расскажи, как ты будешь писать тесты на свойство "Age"
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810489
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На пяти страницах был срач с Петей, полный уныния и неочевидности. Точно так же не очевидна жопа с юнит-тестированием.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810492
WebPrj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,
Да пусть не используют.
Джунам глобальные переменные использовать нельзя).
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810511
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WebPrjДжунам глобальные переменные использовать нельзя).
Только начиная с синьора. А лиды, так те вообще пишут все только на статических классах. Да.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810647
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще меня объяснения Шокера интересовали, он-то адекватно свои слова обосновывает.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810692
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatА теперь давай, расскажи, как ты будешь писать тесты на свойство "Age"mock сборка. с датами и без статики гемороя много.
и DateTime это не статический класс, даже не класс, по этому к чему он в этой теме? Поля статически у него имеются.
автор А статический класс это по сути самая что ни на есть глобальная переменная, которая прямо-таки тянет на то эти самые побочные эффекты наплодить. абсолютно любой тип, статический или нет, после инициализации является глобальным объектом, в котором хранится его TypeHandler, ссылки на методы и поля, у него есть адрес и т.д. По этому, любой тип по сути является глобальной переменной, не только статический.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810714
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesmock сборка. с датами и без статики гемороя много.
Какая еще мок-сборка? Все давно уже готовыми мок-фреймворками пользуются.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
[Fact]
public void TestAge()
{
    var mockClock = new Mock<ISystemClock>(); 
    mockClock.Setup(m => m.GetCurrentDateTime()).Returns(new DateTime(2019, 1, 1));
    var person = new Person(mockClock.Object);
    person.DateOfBirth = new DateTime(2000, 1, 1);
    person.Age.Should().Be(19);
}


Вот и все, никаких каких-то сборок.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810720
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesабсолютно любой тип, статический или нет, после инициализации является глобальным объектом, в котором хранится его TypeHandler, ссылки на методы и поля, у него есть адрес и т.д. По этому, любой тип по сути является глобальной переменной, не только статический.
Ога. И вообще любой объект (reference type) хранится в куче, котрая является одним огромным глобальным объектом. Этак можно вообще до единой теории всего дофилософствоваться.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810724
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatRoman Mejtesmock сборка. с датами и без статики гемороя много.
Какая еще мок-сборка? Все давно уже готовыми мок-фреймворками пользуются.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
[Fact]
public void TestAge()
{
    var mockClock = new Mock<ISystemClock>(); 
    mockClock.Setup(m => m.GetCurrentDateTime()).Returns(new DateTime(2019, 1, 1));
    var person = new Person(mockClock.Object);
    person.DateOfBirth = new DateTime(2000, 1, 1);
    person.Age.Should().Be(19);
}


Вот и все, никаких каких-то сборок.

Скайна как-то это обозвал, уродством, кажется
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810726
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachfkthatпропущено...

Какая еще мок-сборка? Все давно уже готовыми мок-фреймворками пользуются.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
[Fact]
public void TestAge()
{
    var mockClock = new Mock<ISystemClock>(); 
    mockClock.Setup(m => m.GetCurrentDateTime()).Returns(new DateTime(2019, 1, 1));
    var person = new Person(mockClock.Object);
    person.DateOfBirth = new DateTime(2000, 1, 1);
    person.Age.Should().Be(19);
}



Вот и все, никаких каких-то сборок.

Скайна как-то это обозвал, уродством, кажется
Это вообще-то тупо тест.
А вот зачем понадобился интерфейс ISystemClock в реальном проекте - так и не ответили в тот раз.
Сложилось впечатление, что сначала напроектировали фигни, а потом с ней героически боролись.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810728
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И виновником помнится оказались не static-и, а люди, кто применял их фиг пойми как и зачем.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810765
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухЭто вообще-то тупо тест.
А вот зачем понадобился интерфейс ISystemClock в реальном проекте - так и не ответили в тот раз.
Сложилось впечатление, что сначала напроектировали фигни, а потом с ней героически боролись.
Понадобился в основном как раз для того, чтобы покрыть тестами весьма критическую часть проекта. Код все это совершенно не усложняет, ибо везде DI
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public interface ISystemClock {
    DateTime GetCurrentDateTime();
}

public class SystemClock: ISystemClock {
    public DateTime GetCurrentDateTime() => DateTime.Now;
}

containerBuilder.RegisterType<SystemClock>().As<ISystemClock>().SingleInstance();



Вот и весь код. Полдюжины строчек кода, которые решают кучу проблем с тестами. Под такую же херь, кстати, попадает еще всякая шляпа, типа Guid.New(), Random.Next() и т.п. - в общем вся хрень, результат которой ты никак не можешь в случае надобности контролировать.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810780
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Random имеет Seed, можно получить заданную последовательность псевдослучайных чисел, которая будет всегда постоянной...
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810795
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesRandom имеет Seed, можно получить заданную последовательность псевдослучайных чисел, которая будет всегда постоянной...
Это да. Но все равно через seed не получить какую-то предопределенную последовательность для теста. Впрочем, в крайних версиях фреймворка и коре рандом уже сделали с виртуальными методами. Примерно так же как в свое время сделали с HttpContext для тех же целей.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810799
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потом еще такая шляпа. Вполне может захотется сменить Random на секьюрный RandomNumberGenerator. Или вообще в одних местах использовать обычный, а в других секьюрный. С инжекцией это можно сделать букально за минуты.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39810919
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyShocker.Proпропущено...
+1 кстати

Статические классы только для методов расширения.почему?AntonariyВообще меня объяснения Шокера интересовали, он-то адекватно свои слова обосновывает.Ну, по большей части, уже объяснили конкретно.
Это как взрослый на основе своего опыта говорит ребенку "не носись", но сложно объяснить конкретно... потому что упадет и расквасит нос, потому что может попасть под машину, потому что собака рядом бегает без намордника....

В общем, поначалу вроде кажется, что нормально, а потом, спустя время, при рефакторинге натыкаешься на грабли
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39811083
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
В общем, поначалу вроде кажется, что нормально, а потом, спустя время, при рефакторинге натыкаешься на грабли
Что грабли?
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39811112
WebPrj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ,
"Суслика видишь?")
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39811164
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyпропущено...
почему?AntonariyВообще меня объяснения Шокера интересовали, он-то адекватно свои слова обосновывает.Ну, по большей части, уже объяснили конкретно.
Это как взрослый на основе своего опыта говорит ребенку "не носись", но сложно объяснить конкретно... потому что упадет и расквасит нос, потому что может попасть под машину, потому что собака рядом бегает без намордника....

В общем, поначалу вроде кажется, что нормально, а потом, спустя время, при рефакторинге натыкаешься на граблиВ общем, я понял:
Дмитрий МухИ виновником помнится оказались не static-и, а люди, кто применял их фиг пойми как и зачем.

Ложная тревога, все в порядке со статиками.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39811278
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВ общем, я понял:

А потом, если продукт взлетит, упрешься в перфоманс и вернешься к статикам.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39811297
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВAntonariyВ общем, я понял:

А потом, если продукт взлетит, упрешься в перфоманс и вернешься к статикам.
Повернутые на оптимизации? Я в жизни не видал, чтобы проблемы с перформансом были именно из-за использования нестатиков вместо статиков. Вот из-за чего угодно видал, но только не из-за этого. Ты еще начни сравнивать сколько процессорных тактов на тот или иной вызов уходит.
...
Рейтинг: 0 / 0
Инициализация статического класса
    #39811301
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

Зато много раз видал, как из-за статиков утечки памяти возникают. Утечки памяти на платформе со сборкой мусора, Карл. Собственно, статик это фактически, наверное, единственный способ утечку памяти вызвать. Хотя, если, честно, то с синглетоном тоже такую бяку легко сделать.
...
Рейтинг: 0 / 0
25 сообщений из 279, страница 5 из 12
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Инициализация статического класса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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