Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как создать объект / 15 сообщений из 15, страница 1 из 1
09.07.2016, 19:34
    #39271167
grok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать объект
Вопрос на самом деле не такой банальный.

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

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

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

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

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

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

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

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

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

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

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

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

     IUser CreateSystemUser(/* список параметров для системного пользователя */);
}
...
Рейтинг: 0 / 0
09.07.2016, 21:36
    #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
10.07.2016, 08:05
    #39271260
Диез
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать объект
grok,
Ну, например, конструктор, который принимает абстрактный класс с конфигурацией
public MyObject(MyObjectAbstractConfig config)

Пока все нужные методы конфига не реализуешь - не скомпилируется.
...
Рейтинг: 0 / 0
10.07.2016, 09:21
    #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
11.07.2016, 12:33
    #39271719
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать объект
Я не знаю как там в шарпе, но в джаве можно попробовать обвесить метоты билдера кастомными аннотациями и обработать через плагин компилятора (javac specific). Если интересно, то можно начать изучать тему по ссылкам с этого ответа .
...
Рейтинг: 0 / 0
11.07.2016, 12:37
    #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
11.07.2016, 13:42
    #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
11.07.2016, 13:45
    #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
11.07.2016, 13:51
    #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
11.07.2016, 19:37
    #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
12.07.2016, 06:36
    #39272139
stenford
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать объект
grok
Самое тупое конструктор с параметрами.
Но тут такой минус что сегодня параметров 3, а завтра 20. Если не 50.
Это как-то ужасно.

50 параметров - это уже неправильный обьект, скорее всего собирает в себе функционал нескольких разных классов. Обьект инициализируется конструктором где валидируются параметры и мы всегда имеем гарантию что обьект валидный
...
Рейтинг: 0 / 0
12.07.2016, 10:57
    #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]