Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7 8 9 10 .. 12   вперед  Ctrl      все
 Re: Инициализация статического класса  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72749
Shocker.Pro
Изопропил
пропущено...

да
+1 кстати

Статические классы только для методов расширения.
почему?
6 май 19, 21:33    [21879400]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Antonariy
Shocker.Pro
пропущено...
+1 кстати

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


"Наша песня хороша, начинай сначала" (с)
6 май 19, 22:05    [21879417]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4695
fkthat
Antonariy
пропущено...
почему?


"Наша песня хороша, начинай сначала" (с)

Ага, это зачем ввели?
https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-8#static-local-functions
6 май 19, 22:36    [21879434]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
ЕвгенийВ
Ага, это зачем ввели?
https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-8#static-local-functions

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

class Person
{
    public DateTime DateOfBirth { get; private set; }

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


А теперь давай, расскажи, как ты будешь писать тесты на свойство "Age"
6 май 19, 23:47    [21879466]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72749
На пяти страницах был срач с Петей, полный уныния и неочевидности. Точно так же не очевидна жопа с юнит-тестированием.
7 май 19, 06:44    [21879531]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
Antonariy,
Да пусть не используют.
Джунам глобальные переменные использовать нельзя).
7 май 19, 07:04    [21879538]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
WebPrj
Джунам глобальные переменные использовать нельзя).

Только начиная с синьора. А лиды, так те вообще пишут все только на статических классах. Да.
7 май 19, 08:22    [21879563]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72749
Вообще меня объяснения Шокера интересовали, он-то адекватно свои слова обосновывает.
7 май 19, 13:20    [21879839]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3377
fkthat
А теперь давай, расскажи, как ты будешь писать тесты на свойство "Age"
mock сборка. с датами и без статики гемороя много.
и DateTime это не статический класс, даже не класс, по этому к чему он в этой теме? Поля статически у него имеются.
автор
А статический класс это по сути самая что ни на есть глобальная переменная, которая прямо-таки тянет на то эти самые побочные эффекты наплодить.
абсолютно любой тип, статический или нет, после инициализации является глобальным объектом, в котором хранится его TypeHandler, ссылки на методы и поля, у него есть адрес и т.д. По этому, любой тип по сути является глобальной переменной, не только статический.
7 май 19, 14:40    [21879982]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Roman Mejtes
mock сборка. с датами и без статики гемороя много.

Какая еще мок-сборка? Все давно уже готовыми мок-фреймворками пользуются.
[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);
}

Вот и все, никаких каких-то сборок.
7 май 19, 15:14    [21880048]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Roman Mejtes
абсолютно любой тип, статический или нет, после инициализации является глобальным объектом, в котором хранится его TypeHandler, ссылки на методы и поля, у него есть адрес и т.д. По этому, любой тип по сути является глобальной переменной, не только статический.

Ога. И вообще любой объект (reference type) хранится в куче, котрая является одним огромным глобальным объектом. Этак можно вообще до единой теории всего дофилософствоваться.
7 май 19, 15:17    [21880056]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 496
fkthat
Roman Mejtes
mock сборка. с датами и без статики гемороя много.

Какая еще мок-сборка? Все давно уже готовыми мок-фреймворками пользуются.
[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);
}

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


Скайна как-то это обозвал, уродством, кажется
7 май 19, 15:20    [21880060]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1797
love_bach
fkthat
пропущено...

Какая еще мок-сборка? Все давно уже готовыми мок-фреймворками пользуются.
[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 в реальном проекте - так и не ответили в тот раз.
Сложилось впечатление, что сначала напроектировали фигни, а потом с ней героически боролись.
7 май 19, 15:24    [21880063]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1797
И виновником помнится оказались не static-и, а люди, кто применял их фиг пойми как и зачем.
7 май 19, 15:25    [21880065]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Дмитрий Мух
Это вообще-то тупо тест.
А вот зачем понадобился интерфейс ISystemClock в реальном проекте - так и не ответили в тот раз.
Сложилось впечатление, что сначала напроектировали фигни, а потом с ней героически боролись.

Понадобился в основном как раз для того, чтобы покрыть тестами весьма критическую часть проекта. Код все это совершенно не усложняет, ибо везде DI
public interface ISystemClock {
    DateTime GetCurrentDateTime();
}

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

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


Вот и весь код. Полдюжины строчек кода, которые решают кучу проблем с тестами. Под такую же херь, кстати, попадает еще всякая шляпа, типа Guid.New(), Random.Next() и т.п. - в общем вся хрень, результат которой ты никак не можешь в случае надобности контролировать.
7 май 19, 16:06    [21880118]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3377
Random имеет Seed, можно получить заданную последовательность псевдослучайных чисел, которая будет всегда постоянной...
7 май 19, 16:22    [21880134]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Roman Mejtes
Random имеет Seed, можно получить заданную последовательность псевдослучайных чисел, которая будет всегда постоянной...

Это да. Но все равно через seed не получить какую-то предопределенную последовательность для теста. Впрочем, в крайних версиях фреймворка и коре рандом уже сделали с виртуальными методами. Примерно так же как в свое время сделали с HttpContext для тех же целей.
7 май 19, 16:51    [21880167]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Потом еще такая шляпа. Вполне может захотется сменить Random на секьюрный RandomNumberGenerator. Или вообще в одних местах использовать обычный, а в других секьюрный. С инжекцией это можно сделать букально за минуты.
7 май 19, 17:00    [21880173]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20366
Antonariy
Shocker.Pro
пропущено...
+1 кстати

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

В общем, поначалу вроде кажется, что нормально, а потом, спустя время, при рефакторинге натыкаешься на грабли
7 май 19, 19:55    [21880359]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4695
Shocker.Pro

В общем, поначалу вроде кажется, что нормально, а потом, спустя время, при рефакторинге натыкаешься на грабли

Что грабли?
8 май 19, 09:15    [21880633]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member [заблокирован]

Откуда:
Сообщений: 376
ЕвгенийВ,
"Суслика видишь?")
8 май 19, 09:54    [21880678]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

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

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


Ложная тревога, все в порядке со статиками.
8 май 19, 11:06    [21880761]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4695
Antonariy
В общем, я понял:

А потом, если продукт взлетит, упрешься в перфоманс и вернешься к статикам.
8 май 19, 13:47    [21880994]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
ЕвгенийВ
Antonariy
В общем, я понял:

А потом, если продукт взлетит, упрешься в перфоманс и вернешься к статикам.

Повернутые на оптимизации? Я в жизни не видал, чтобы проблемы с перформансом были именно из-за использования нестатиков вместо статиков. Вот из-за чего угодно видал, но только не из-за этого. Ты еще начни сравнивать сколько процессорных тактов на тот или иной вызов уходит.
8 май 19, 14:01    [21881028]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
ЕвгенийВ,

Зато много раз видал, как из-за статиков утечки памяти возникают. Утечки памяти на платформе со сборкой мусора, Карл. Собственно, статик это фактически, наверное, единственный способ утечку памяти вызвать. Хотя, если, честно, то с синглетоном тоже такую бяку легко сделать.
8 май 19, 14:03    [21881034]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7 8 9 10 .. 12   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить