powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как создать объект
15 сообщений из 15, страница 1 из 1
Как создать объект
    #39271167
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос на самом деле не такой банальный.

Надо создать объект и инициализировать разные там свойства.

Самое тупое конструктор с параметрами.
Но тут такой минус что сегодня параметров 3, а завтра 20. Если не 50.
Это как-то ужасно.

Есть еще шаблон Builder.
Он клевый.

Но с ним проблема в том, что можно забыть что-то инициализировать.
А куча параметров должны быть обязательные.
Можно конечно кидать эксепшн на рантайме, но как-то это не очень.
Хочется в идеале проверку на этапе компиляции.

Да, конструктор не гарантирует что ему не передадут null.
Но он хотя бы гарантирует, что передадут хоть что-то.

Можно как-то извратиться чтоб всё было как хочется ?

PS. Язык не важен, для примера можно взять Java или С#
...
Рейтинг: 0 / 0
Как создать объект
    #39271184
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grok,

Dependency Injection контейнер спасёт отца русской демократии.
...
Рейтинг: 0 / 0
Как создать объект
    #39271188
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилgrok,

Dependency Injection контейнер спасёт отца русской демократии.

подробнее можно ?
совсем хорошо если с примером
...
Рейтинг: 0 / 0
Как создать объект
    #39271199
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grokМожно как-то извратиться чтоб всё было как хочется?
А как хочется-то? Оставить 3 параметра в конструкторе?

Фабрика не решает Вашей проблемы?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public interface IUserFactory
{
     IUser CreateAdministrator(/* список параметров для админа */);

     IUser CreateAnonymousUser(/* список параметров для анонимуса */);

     IUser CreateSystemUser(/* список параметров для системного пользователя */);
}
...
Рейтинг: 0 / 0
Как создать объект
    #39271211
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAgrokМожно как-то извратиться чтоб всё было как хочется?
А как хочется-то? Оставить 3 параметра в конструкторе?

Фабрика не решает Вашей проблемы?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public interface IUserFactory
{
     IUser CreateAdministrator(/* список параметров для админа */);

     IUser CreateAnonymousUser(/* список параметров для анонимуса */);

     IUser CreateSystemUser(/* список параметров для системного пользователя */);
}



в целом не решает

параметры/свойства часто не делятся на какие-то осмысленные группы, ну или делить неудобно

простой пример
объект имеет штуки 3 разных наименования, штук 5 дат, да и еще десяток флажков (boolean)
и это не считая прочего что может быть
...
Рейтинг: 0 / 0
Как создать объект
    #39271260
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grok,
Ну, например, конструктор, который принимает абстрактный класс с конфигурацией
public MyObject(MyObjectAbstractConfig config)

Пока все нужные методы конфига не реализуешь - не скомпилируется.
...
Рейтинг: 0 / 0
Как создать объект
    #39271272
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grokskyANAпропущено...

А как хочется-то? Оставить 3 параметра в конструкторе?

Фабрика не решает Вашей проблемы?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public interface IUserFactory
{
     IUser CreateAdministrator(/* список параметров для админа */);

     IUser CreateAnonymousUser(/* список параметров для анонимуса */);

     IUser CreateSystemUser(/* список параметров для системного пользователя */);
}



в целом не решает

параметры/свойства часто не делятся на какие-то осмысленные группы, ну или делить неудобно

простой пример
объект имеет штуки 3 разных наименования, штук 5 дат, да и еще десяток флажков (boolean)
и это не считая прочего что может быть
Предположительно, это результат плохого проектирования.
Я бы переделал все
...
Рейтинг: 0 / 0
Как создать объект
    #39271719
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаю как там в шарпе, но в джаве можно попробовать обвесить метоты билдера кастомными аннотациями и обработать через плагин компилятора (javac specific). Если интересно, то можно начать изучать тему по ссылкам с этого ответа .
...
Рейтинг: 0 / 0
Как создать объект
    #39271723
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grokСамое тупое конструктор с параметрами.
Но тут такой минус что сегодня параметров 3, а завтра 20. Если не 50.Перегруженные конструкторы?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class MyClass
{
    public MyClass(int a)
    { }

    public MyClass(int a, int b)
    { }

    public MyClass(int a, int b, int c)
    { }
}
...
Рейтинг: 0 / 0
Как создать объект
    #39271757
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то сумбурно. И много требований.

grokНадо создать объект и инициализировать разные там свойства.

Самое тупое конструктор с параметрами.
Но тут такой минус что сегодня параметров 3, а завтра 20. Если не 50.
Это как-то ужасно.


Конструкторы с жестким списком параметров - это проблемы Java/C#.
Для Кotlin к примеру конструктор как элемент language уже не нужен.

Пример:
Код: java
1.
2.
3.
4.
5.
6.
class Vector(val x:Double,val y:Double,val z:Double) {
   // здесь ништяк.
}

// Хопа. Инициализировали все свойства списком.
val CAMERA_ASPECT_VECTOR = Vector(17.0, 16.0, 8.0);


В Scala кажется тоже самое.

Есть еще шаблон Builder.
Он клевый.

Но с ним проблема в том, что можно забыть что-то инициализировать.
А куча параметров должны быть обязательные.
Можно конечно кидать эксепшн на рантайме, но как-то это не очень.
Хочется в идеале проверку на этапе компиляции.

Где-то я видел такой билдер. Ну там часть параметров - required - а часть - опциональны.
Код: java
1.
2.
3.
4.
GroksFuckenClass groksFuckenClass = new GroksFuckenClass("Grok","+555-55-55","grok@gmail.com")
       .Builder()
       .withFB("http://facebook.com/grok")
       .withVK("https://vk.com/grok");



Да, конструктор не гарантирует что ему не передадут null.
Но он хотя бы гарантирует, что передадут хоть что-то.

Можно как-то извратиться чтоб всё было как хочется ?


Для статической проверки (на дурака) можешь заюзать такие себе симпотичные контракты
Код: java
1.
2.
3.
4.
5.
public class GroksFuckenClass{
      public GroksFuckenClass(@NonNull String username){
               ..........
      }
}


И если на фазе редактирования кода среда увидит что ты сморозил херню - то красным фломастером подсветит исходник.

Откуда импорт - я не помню щас. Но они есть в разных либах и вт.ч. от призводителя Jetbrains.
...
Рейтинг: 0 / 0
Как создать объект
    #39271759
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ну я в билдере немного ошибся. Вот как тут надо

https://ru.wikipedia.org/wiki/Строитель_(шаблон_проектирования)#Java
Код: java
1.
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)).calories(100).sodium(35).carbohydrate(27).build();
...
Рейтинг: 0 / 0
Как создать объект
    #39271762
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще генерализировать конструктор под списки свойств.

Код: java
1.
2.
3.
4.
5.
6.
Properties props = new Properties(){{
   put("email","grok@gmail.com");
   put("phone","555-55-55");
}};

GroksFuckenClass groksFuckenClass = new GroksFuckenClass(props);



Далее в коснтрукторе надо как-то хитро заюзать толи BeanUtils толи еще другую либо чтобы
через рефлексию сеттить все свойства.

Да по поводу эксепшен. Лучше не бросай Runtime. Лучше свой создать. Так будет легче делать разбор полетов. И логи
ошибок более осмысленные будут.
...
Рейтинг: 0 / 0
Как создать объект
    #39272031
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grokskyANAпропущено...

А как хочется-то? Оставить 3 параметра в конструкторе?

Фабрика не решает Вашей проблемы?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public interface IUserFactory
{
     IUser CreateAdministrator(/* список параметров для админа */);

     IUser CreateAnonymousUser(/* список параметров для анонимуса */);

     IUser CreateSystemUser(/* список параметров для системного пользователя */);
}



в целом не решает

параметры/свойства часто не делятся на какие-то осмысленные группы, ну или делить неудобно

простой пример
объект имеет штуки 3 разных наименования, штук 5 дат, да и еще десяток флажков (boolean)
и это не считая прочего что может быть

может имеет смысла рассматирвать
не свойства , а операции со свойствами ?
...
Рейтинг: 0 / 0
Как создать объект
    #39272139
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grok
Самое тупое конструктор с параметрами.
Но тут такой минус что сегодня параметров 3, а завтра 20. Если не 50.
Это как-то ужасно.

50 параметров - это уже неправильный обьект, скорее всего собирает в себе функционал нескольких разных классов. Обьект инициализируется конструктором где валидируются параметры и мы всегда имеем гарантию что обьект валидный
...
Рейтинг: 0 / 0
Как создать объект
    #39272264
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfordgrokСамое тупое конструктор с параметрами.
Но тут такой минус что сегодня параметров 3, а завтра 20. Если не 50.
Это как-то ужасно.

50 параметров - это уже неправильный обьект, скорее всего собирает в себе функционал нескольких разных классов. Обьект инициализируется конструктором где валидируются параметры и мы всегда имеем гарантию что обьект валидный
Полностью согласен что передача более чем 7 аргументов в метод - это некрасиво. Но
если наш объект это entity из БД то там может быть и больше полей. А при инициализации
такого толстого объекта не надо ставить задачу собственно инициализации. Более оптимиально - клонирование
или протопипирование из других объектов которые уже созданы ранее. Или фабрика которая фабрикует
уже объекты где 80% полей инициализрованы. А нам остаётся подправить оставшиеся 20%.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как создать объект
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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