Java helper or util

Java helper or util

Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Hard_Club, Вы писали:

H_C>>Чем обычно занимается Provider?
B>Поставляет данные. Например, в тест.

И чем он тогда отличается от DataSource?

Ну, это какой-то странный сценарий, когда нужен только одно случайное значение. Зачем?? Снова тестирование? Единичного случайного значения?
Обычно случайных величин нужно много. Поэтому берем Stream и натягиваем на него лямбду

Здравствуйте, Hard_Club, Вы писали:

B>>Но, просто это же тривиальный метод. Зачем его выделять в сущность?
H_C>У меня уже таких штук 5 тестах. И куда его выносить?

Ты, как обычно, требуешь конкретных ответов, объясняя проблему на пальцах. Показывай конкретные методы. Объясни что они делают. И давай вместе решим, есть ли смысл заводить Helper или есть альтернативный способ и название.

Здравствуйте, Hard_Club, Вы писали:

H_C>И чем он тогда отличается от DataSource?
DataSource в Java зарезервирован под JDBC Connection Pool. Называть разные сущности одним именем ошибочно.

B>Ты, как обычно, требуешь конкретных ответов, объясняя проблему на пальцах. Показывай конкретные методы. Объясни что они делают. И давай вместе решим, есть ли смысл заводить Helper или есть альтернативный способ и название.

 public MyClass addOneRabbitsSequence() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException < final int MIN_SRABBIT_SQC_LENGTH = 2; final int MAX_sRABBIT_SQC_LENGTH = 10; final int sequenceLength = rand.nextInt(MAX_SRABBIT_SQC_LENGTH - MIN_SRABBIT_SQC_LENGTH + 1) + MIN_SRABBIT_SQC_LENGTH; return addOneRabbits(sequenceLength); >public MyClass addMultiplyRabbits() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException < final int MIN_MRABIT_SQC_LENGTH = 1; final int MAX_MRABIT_SQC_LENGTH = 10; final int sequenceLength = rand.nextInt(MAX_MRABIT_SQC_LENGTH - MIN_MRABIT_SQC_LENGTH + 1) + MIN_MRABIT_SQC_TAIL_LENGTH; for (int Idex = 0; Idex < sequenceLength; Idex++) < Object Rabbit = createRabbit(RabbitIds.nextId(), getRandomName(), getRandomTime()); Rabbits.add(Rabbit); >return this; >

И так короче везде где нужно эмулировать несколько чего-то

B>Ну, это какой-то странный сценарий, когда нужен только одно случайное значение. Зачем?? Снова тестирование? Единичного случайного значения?
B>Обычно случайных величин нужно много. Поэтому берем Stream и натягиваем на него лямбду 🙂

Мне нужно просто 1 значение на вызов

B>DataSource в Java зарезервирован под JDBC Connection Pool. Называть разные сущности одним именем ошибочно.
Єто вроде наоброт правильно. Ты же не придумываешь имена паттернов каждый раз новые

Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Hard_Club, Вы писали:

H_C>>И чем он тогда отличается от DataSource?
B>DataSource в Java зарезервирован под JDBC Connection Pool. Называть разные сущности одним именем ошибочно.

Гыгы. А Provider это вообще из JSR-330

Здравствуйте, Hard_Club, Вы писали:

H_C>Это я и без тебя знаю. Чего этого нет в стандартных библиотеках-то

Здравствуйте, Hard_Club, Вы писали:

B>>Ты, как обычно, требуешь конкретных ответов, объясняя проблему на пальцах. Показывай конкретные методы. Объясни что они делают. И давай вместе решим, есть ли смысл заводить Helper или есть альтернативный способ и название.

H_C>

H_C> public MyClass addOneRabbitsSequence() H_C> throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException < H_C>final int MIN_SRABBIT_SQC_LENGTH = 2; H_C> final int MAX_sRABBIT_SQC_LENGTH = 10; H_C> final int sequenceLength = rand.nextInt(MAX_SRABBIT_SQC_LENGTH - MIN_SRABBIT_SQC_LENGTH + 1) + MIN_SRABBIT_SQC_LENGTH; H_C> return addOneRabbits(sequenceLength); H_C> > H_C> public MyClass addMultiplyRabbits() H_C> throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException < H_C>final int MIN_MRABIT_SQC_LENGTH = 1; H_C> final int MAX_MRABIT_SQC_LENGTH = 10; H_C> final int sequenceLength = rand.nextInt(MAX_MRABIT_SQC_LENGTH - MIN_MRABIT_SQC_LENGTH + 1) + MIN_MRABIT_SQC_TAIL_LENGTH; H_C> for (int Idex = 0; Idex < sequenceLength; Idex++) < H_C>Object Rabbit = createRabbit(RabbitIds.nextId(), getRandomName(), getRandomTime()); H_C> Rabbits.add(Rabbit); H_C> > H_C> return this; H_C> > H_C>

H_C>И так короче везде где нужно эмулировать несколько чего-то

Я нифига не понял что делает этот код, но давайте предположу что:
1. Есть коллекция кроликов
2. По запросу требуется добавить в коллекцию случайное количество кроликов (от M до N)
3. У кроликов есть вес
4. Когда добавляем кроликов, вес у них должен быть случайным (от M2 до N2)

На ООП головного мозга это пишется вот так:

public interface RabbitFactory < Rabbit makeRabbit(); >public class RandomWeightRabbitFactory implements RabbitFactory < RandomSizeRabbitFactory(RandomNumberFactory rabbitWeightFactory) > public interface RabbitCollectionFactory < CollectionmakeRabbits(); > public class RandomSizeRabbitCollectionFactory implements RabbitCollectionFactory < RandomSizeRabbitCollectionFactory( RandomNumberFactory collectionSizeFactory, RabbitFactory rabbitFactory) > public interface RandomNumberFactory < int makeRandomNumber(); > // сюда кладёте волшебную формулу min + random() * (max - min) public class FixedRangeRandomNumberFactory implements RandomNumberFactory < FixedRangeRandomNumberFactory(int min, int max) > // и теперь погнали DI RandomNumberFactory rabbitWeightFactory = new FixedRangeRandomNumberFactory(3, 10); // от 3 до 10 кг RandomNumberFactory rabbitCollectionSizeFactory = new FixedRangeRandomNumberFactory(20, 100); // от 20 до 100 кроликов за 1 раз RabbitFactory rabbitFactory = new RandomWeigthRabbitFactory(rabbitWeightFactory); // делает одного случайного кролика RabbitCollectionFactory rabbitCollectionFactory = RandomSizeRabbitCollectionFactory(rabbitCollectionSizeFactory, rabbitFactory); // делает много случайных кроликов // и теперь List rabbits = new ArrayList(); rabbits.addAll(rabbitCollectionFactory.makeRabbits()); rabbits.addAll(rabbitCollectionFactory.makeRabbits()); rabbits.addAll(rabbitCollectionFactory.makeRabbits()); // хз сколько там теперь кроликов, но как минимум 60 и в сумме весят не менее 180 кг

Т.е. мне просто нужна вот такая фабрика:

Насчет кроликов верно. А так нужно всегда плодить фабрики и их интефейсы в таком случае? — Просто одного метода как я сделал — не достаточно? Или это что-то нарушает?

Здравствуйте, Hard_Club, Вы писали:

H_C>Т.е. мне просто нужна вот такая фабрика:

H_C>FixedRangeRandomNumberProvider

H_C>Насчет кроликов верно. А так нужно всегда плодить фабрики и их интефейсы в таком случае? — Просто одного метода как я сделал — не достаточно? Или это что-то нарушает?

Я ж написал жирным по белому — «ООП головного мозга» Интерфейсы безусловно нафиг там не нужны — намеренно утрирую, чтобы показать, что любой самый маленький и никчёмный вызов println() достоин того, чтобы дать ему более громкое имя и пафосно оформить отдельным объектом, даже если в отрыве от контекста это выглядит нелепо. Речь в иллюстрации не о решении вашей конкретной проблемы с реюзом random, а о том, что есть как минимум один чисто механический способ писать код, в котором ваши вопросы про helpers/utils не могут возникнуть — достаточно перестать думать «куда засунуть код?» и начать думать «как я могу назвать участника, который делает вот эту часть операции?».

Здравствуйте, andyag, Вы писали:

A>Я ж написал жирным по белому — «ООП головного мозга».
Зато показательно видно, что твой код самодокументирован. В то время как в исходный нужно тупить достаточно одолго, чтобы понять зачем он вообще.

Здравствуйте, andyag, Вы писали:

A>Гыгы. А Provider это вообще из JSR-330
И ещё 100500 других Provider-ов в разных API. Включая DataSourceProvider

Здравствуйте, Hard_Club, Вы писали:

B>>DataSource в Java зарезервирован под JDBC Connection Pool. Называть разные сущности одним именем ошибочно.
H_C>Єто вроде наоброт правильно. Ты же не придумываешь имена паттернов каждый раз новые
Даже одинаковые паттерны зачастую имеют разные названия. В целом, конечно, не важно как именно ты назовешь. Важно чтобы другим было понятно исходя из общепринятых названий.
Вообще, я смотрю, мы тут в половине твоих тем перетираем Clean Code by Robin C. Martin
Лично тебе очень рекомендую (особенно глядя на это

Здравствуйте, Hard_Club, Вы писали:

H_C>Т.е. мне просто нужна вот такая фабрика:
H_C>FixedRangeRandomNumberProvider
H_C>Насчет кроликов верно. А так нужно всегда плодить фабрики и их интефейсы в таком случае? — Просто одного метода как я сделал — не достаточно? Или это что-то нарушает?
Фабрика создаёт объекты. Обычно, потому что у них не тривиальная инициализация, параметризация или жизненый цикл.
Тебе же нужен генератор случайных чисел.
Я бы назвал BoundedRandomGenerator

Здравствуйте, Hard_Club, Вы писали:

 public MyClass addOneRabbitsSequence() //Учи английский - One Rabbit throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException < //Сворачивай исключения. А в тестах можно вообще всё в Unchecked завернуть final int MIN_SRABBIT_SQC_LENGTH = 2; //Не используй final в методах вообще. Это тупо зашумляет код final int MAX_sRABBIT_SQC_LENGTH = 10; //Не используй Capital Case в локальных переменных // Не логичная запись. Нижнюю границу логичнее было бы написать слева, а дополнение в виде случайного числа - справа. final int sequenceLength = rand.nextInt(MAX_SRABBIT_SQC_LENGTH - MIN_SRABBIT_SQC_LENGTH + 1) + MIN_SRABBIT_SQC_LENGTH; return addOneRabbits(sequenceLength); > public MyClass addMultiplyRabbits() //Снова английский Multiply это не Multiple throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException < final int MIN_MRABIT_SQC_LENGTH = 1; final int MAX_MRABIT_SQC_LENGTH = 10; final int sequenceLength = rand.nextInt(MAX_MRABIT_SQC_LENGTH - MIN_MRABIT_SQC_LENGTH + 1) + MIN_MRABIT_SQC_TAIL_LENGTH; for (int Idex = 0; Idex < sequenceLength; Idex++) < // Используй общепринятные Java Coding Convention. Переменные не именуются с большой буквы. Object Rabbit = createRabbit(RabbitIds.nextId(), getRandomName(), getRandomTime()); Rabbits.add(Rabbit); > return this; >
import static com.rabbits.BoundedRandomGenerator.*; public Rabbit addOneRabbitSequence() < int sequenceLength = nextInt(2, 10); return addOneRabbits(sequenceLength); //Тут спорный вопрос, нужно ли инлайнить переменную. ИМХО, такую запись удобнее дебажить. И она лучше читается, так как имя переменной несет в себе информацию. > public Rabbit addMultipleRabbits() < int sequenceLength = nextInt(1, 10); for (int i = 0; i < sequenceLength; i++) < Rabbit rabbit = createRabbit(RabbitIdGenerator.nextId(), getRandomName(), getRandomTime()); rabbits.add(rabbit); >return this; >

Последнее время я, правда, склоняюсь к мысли, что инлайнить констранты и м вызовы методов не стоит совсем. Возможно, я бы написал и так

public Rabbit addMultipleRabbits() < int lower = 1; int upper = 10; int sequenceLength = nextInt(lower, upper); for (int i = 0; i < sequenceLength; i++) < int String name = getRandomName(); Time createTime = getRandomTime(); Rabbit rabbit = createRabbit(id, name, createTime); rabbits.add(rabbit); > return this; >

Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Hard_Club, Вы писали:

H_C>>Т.е. мне просто нужна вот такая фабрика:
H_C>>FixedRangeRandomNumberProvider
H_C>>Насчет кроликов верно. А так нужно всегда плодить фабрики и их интефейсы в таком случае? — Просто одного метода как я сделал — не достаточно? Или это что-то нарушает?
B>Фабрика создаёт объекты. Обычно, потому что у них не тривиальная инициализация, параметризация или жизненый цикл.

Тут надо отметить, что все эти слова типа «нетривиальная инициализация» — это не в смысле «пц как всё сложно», а в смысле «вызывающий код не обладает достаточными знаниями для того, чтобы сконструировать нужный объект самостоятельно» (даже скорее «не хочет обладать» или «хочет, чтобы на него не вешали всю эту муть»).

B>Тебе же нужен генератор случайных чисел.
B>Я бы назвал BoundedRandomGenerator

Поддерживаю. Вот тут можно глянуть как такое оформляют в Apache Commons Math: http://commons.apache.org/proper/commons-math/javadocs/api-3.3/index.html

Вообще очень хорошая идея. Плюс создать в тестах под пакет internals и туда засунуть все єти фабрики, чтобы не мешали основным тестам — будет вообще красиво.

Один доп вопрос — если генерируется набор возростающих чисел (случайных) — то это тоже фабрика или уже лучше назвать генератор?

Здравствуйте, Hard_Club, Вы писали:

H_C>Вообще очень хорошая идея. Плюс создать в тестах под пакет internals и туда засунуть все єти фабрики, чтобы не мешали основным тестам — будет вообще красиво.
H_C>Один доп вопрос — если генерируется набор возростающих чисел (случайных) — то это тоже фабрика или уже лучше назвать генератор?
Фабрика это паттерн описаный в GoF. Открой книгу. Почитай его назначение и использование. И прими решение является твой класс им или нет.

Здравствуйте, Hard_Club, Вы писали:

H_C>Вообще очень хорошая идея. Плюс создать в тестах под пакет internals и туда засунуть все єти фабрики, чтобы не мешали основным тестам — будет вообще красиво.

H_C>Один доп вопрос — если генерируется набор возростающих чисел (случайных) — то это тоже фабрика или уже лучше назвать генератор?

А вы напишите что оно должно делать и как вы хотите это использовать, тогда можно будет что-то сказать. Рекомендация по умолчанию — имена у сущностей должны быть настолько одинаковыми, насколько сущности одинаковы, и настолько разными, насколько сущности разные.

Источник

Читайте также:  Java android drawable to bitmap
Оцените статью