Войти
ПрограммированиеФорумИгровая логика и ИИ

В какой момент класс должен быть статическим ? (2 стр)

Страницы: 1 2 3 4 5 Следующая »
#15
(Правка: 13:06) 13:05, 7 мая 2020

Jeners
> т.е.
>
> x = new Some().Some(a,b);
> хуже чем
> x = Some.Some(a,b);

Во-первых, непонятно из вашего примера, этот Some является ли он общей утилитой или нет. Во-вторых смысл в том, что статики являются аналогом не такого кода который вы написали. Вот пример замены статика на инстанс метод:

x = this.someManager.CalculateSomething(a, b);
вместо
x = SomeManager.CalculateSomething(a, b);

Jeners
> Что может помешать создать новый экземпляр класса с последующем дерганьем его
> методов?
так то мы можем из любой точки кода хоть новый инстанс всей игры запустить - это не запретишь. Поможет только благоразумие, культура и нейминг.

Если имя класса заканчивается на Manager или Service, то создавать его инстанс ручками в бизнес-коде - оч плохая идея, т.к. эти классы задуманы как синглтонами (хотя и без статического доступа). Даже если они прям сейчас стейтлесс, то в будущем в них легко могут добавить. Например AssetManager в будущем может обрастать всякими лоадерами и локаторами и если кто-то использует AssetManager создав себе личных инстанс, то у него набор лоадеров и локаторов останется пустым.

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


#16
13:07, 7 мая 2020

По-моему в теме слегка смешались вместе static class (что примерно но не совсем соответствует С++ неймспейсам), это там где ОП говорит про Math; и просто какой-то глобальный инстанс который обычно нужен в одном экземпляре (AudioManager), который ну в принципе можно реализовать как static class, но есть мнение, что не нужно (как и синглтоном). :)

#17
(Правка: 13:10) 13:10, 7 мая 2020

krian
> По-моему в теме слегка смешались вместе static class (что примерно но не совсем
> соответствует С++ неймспейсам), это там где ОП говорит про Math; и просто
> какой-то глобальный инстанс который обычно нужен в одном экземпляре
> (AudioManager), который ну в принципе можно реализовать как static class, но
> есть мнение, что не нужно (как и синглтоном). :)
дак да, в том-то и вопрос у TC: "почему бы AudioManager не оформлять статиком как Math?".

#18
13:12, 7 мая 2020

kkolyan
> x = this.someManager.CalculateSomething(a, b);
> вместо
> x = SomeManager.CalculateSomething(a, b);
Ваш случай лишь говорит о том что someManager инкапсулирован в другой класс. И как ни странно он блин статиком быть и не может физически

#19
(Правка: 13:19) 13:16, 7 мая 2020

Jeners
> Ваш случай лишь говорит о том что someManager инкапсулирован в другой класс.
Ну во первых, someManager никуда не инкапсулирован. Эта ссылка передается через конструктор или через модный DI во все места, где нужна.

> И как ни странно он блин статиком быть и не может физически
Разве?

public static class SomeManager {
  public static float CalculateSomething(float x, float y) {
    //
  }
}

#20
(Правка: 13:22) 13:20, 7 мая 2020

kkolyan
> Ну во первых, someManager никуда не инкапсулирован.
Откуда тогда он взялся в "this"? 

kkolyan
> Разве?
>
> public static class SomeManager {
> public static float CalculateSomething(float x, float y) {
> //
> }
> }
Статический класс не может быть зафиксирован в качестве поля у другого класса

Т.е.
Вот так вы не сделаете

static class a
{

}

class b
{
a A = a;
}

#21
13:22, 7 мая 2020

Jeners
> Откуда тогда он взялся в "this"? 
по вашему, инкапсуляция - это любой случай использования приватных полей?

#22
(Правка: 13:32) 13:24, 7 мая 2020

kkolyan
Инкапсуляция по моему это буквально "Внедрение"

Хотя ладно тут я скорее неправильно употребил терминологию.

#23
13:29, 7 мая 2020

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

был код:

public static class SomeManager {
  public static float CalculateSomething(float x, float y) {
    //
  }
}
public class MyMagicController {
  public void update() {
    ...
    var3 = SomeManager.CalculateSomething(var1, var2);
    ...
  }
}

Стал:

public class SomeManager {
  public float CalculateSomething(float x, float y) {
    //
  }
}
public class MyMagicController {
  public MyMagicController(SomeManager  someManager) {
    this.someManager = someManager
  }

  public void update() {
    ...
    // this лишь для показательности примера, писать его здесь не обязательно
    var3 = this.someManager.CalculateSomething(var1, var2);
    ...
  }
}

#24
(Правка: 13:36) 13:35, 7 мая 2020

kkolyan
Ух я про то что так вы не напишете

public static class SomeManager {
  public static  float CalculateSomething(float x, float y) {
    //
  }
}
public class MyMagicController {
  public MyMagicController(SomeManager  someManager) {
    this.someManager = someManager
  }

  public void update() {
    ...
    // this лишь для показательности примера, писать его здесь не обязательно
    var3 = this.someManager.CalculateSomething(var1, var2);
    ...
  }
}
Потому что статический класс нельзя передать по ссылке. Именно по этому в ваше примере класс SomeManager не мог быть статическим, т.к. статик сюда не сунешь.

Но вопрос в другом, а нужно ли его сувать в качестве поля?
Если например метод CalculateSomething зависит только от переменных var1 и var2?

#25
(Правка: 13:42) 13:37, 7 мая 2020

Jeners
> Инкапсуляция по моему это буквально "Внедрение"
буквальный перевод и значения технических терминов часто не совпадают.

Инкапсуляция - это когда мы не даем доступа извне к каким-то полям и методам чтобы другие не совали свой нос во внутренние дела класса.

Внедрение зависимостей - это когда классу извне предоставляется ссылка на службу, которая ему нужна в работе.

Да, в обоих случаях используются приватные поля и формально инкапсуляцией можно назвать оба случая, но смысл все же не совсем в этом.

#26
13:38, 7 мая 2020

Jeners
> Потому что статический класс нельзя передать по ссылке. Именно по этому в ваше
> примере класс SomeManager не мог быть статическим, т.к. статик сюда не сунешь.
конечно, статический передать нельзя по ссылке. но я ведь этого и не делаю, не так ли? В случае, где он передается по ссылке, он уже не статический, разумеется.

#27
13:42, 7 мая 2020

Jeners
> Но вопрос в другом, а нужно ли его сувать в качестве поля?
> Если например метод CalculateSomething зависит только от переменных var1 и
> var2?
это зависит от смысла того, что делается в CalculateSomething. Если это какая-то мега-общая логика, которой нормально все обмазывать (типа Convert, Math), то не надо его делать инстансом - статик норм.

Но, если это это какая-то бизнес(игровая) логика, то да, нужно совать везде где надо в качестве поля). это окупается в будущем.

#28
(Правка: 13:44) 13:44, 7 мая 2020

kkolyan
> конечно, статический передать нельзя по ссылке. но я ведь этого и не делаю, не
> так ли? В случае, где он передается по ссылке, он уже не статический,
> разумеется.
Это к тому что пример
new Some().Some(a,b);
и
this.some.Some(a,b);
не тождественны по смыслу.

#29
13:46, 7 мая 2020

kkolyan
> это зависит от смысла того, что делается в CalculateSomething. Если это
> какая-то мега-общая логика, которой нормально все обмазывать (типа Convert,
> Math), то не надо его делать инстансом - статик норм.
>
> Но, если это это какая-то бизнес(игровая) логика, то да, нужно совать везде где
> надо в качестве поля). это окупается в будущем.
Так о том и речь.
ТС например и спрашивает допустимо ли делать класс который отвечает только за проигрыш звуков статическим? Если в самом классе нет ни каких мутабельных полей то почему нет?

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумИгровая логика и ИИ