Size: a a a

Java/Kotlin Web and more

2020 October 19

ЯС

Ярослав Суханек... in Java/Kotlin Web and more
Илья Игушев
Ярослав идите в баню, вы такой ранимый, до невозможности, вам сказали "бред" вместо "вы не правы", скажите спасибо что вам указали на вашу ошибку, тут не общение тут джаву изучают, тон, вежливость -вторично, занния -первичны, так что если вам не по душе Емельянов - гуляйте
А спасибо за указание на ошибку я сказал
источник

ЯС

Ярослав Суханек... in Java/Kotlin Web and more
И не раз
источник

ИИ

Илья Игушев... in Java/Kotlin Web and more
ну так и все, заколебал, обидели его
источник

NM

Nick Marchuk in Java/Kotlin Web and more
Ярослав Суханек
Илья, а я не ранимый я просто вертел дохера умных раз не хочет нормально общаться с чего я должен?
Ты нытик, а не ранимый, твои слова назвали бредом, а тебя это настолько задело что ты продолжаешь об этом писать, надеясь что тебя пожалеют
источник

Д

Дима in Java/Kotlin Web and more
Какой адекватный срачь
источник

B

Bromles in Java/Kotlin Web and more
Дошли до того, что требующих вежливости приравнивают к нытикам. Скоро в айти чатах будут жить уже "по понятиям" и просить пояснить за аватарки. Ну а что, не чат хороших манер же, суровое русское айти
источник

ЯС

Ярослав Суханек... in Java/Kotlin Web and more
Nick Marchuk
Ты нытик, а не ранимый, твои слова назвали бредом, а тебя это настолько задело что ты продолжаешь об этом писать, надеясь что тебя пожалеют
Не на столько, я ничего не говорю сверх необходимого, вот вы говорите как то не очень содержательно, может вы тоже гуру?
источник

ЯС

Ярослав Суханек... in Java/Kotlin Web and more
Я не прошу что бы меня жалели, я просто не признаю что такое поведение норма и не хочу подобного в свой адрес, вот и всё
источник

RS

Ruslan Stelmachenko in Java/Kotlin Web and more
Cyclone
Есть некоторая единица данных - пусть это будет String - который мы получаем из источника и применяем к ней некоторые обёртки с обработкой. Что можно сделать со строкой? Ну, пускай её кодинг в base64 и цифровая подпись.

(весь код на пасте: https://pastebin.com/xwrprjY5 )

interface StringService { String getString() }
class StringServiceImpl implements StringService { String getString() { return "hi"; }

class EncodingStringServiceWrapper implements StringService {
private StringService stringService;
 public EncodingStringServiceWrapper(StringService stringService) { this.stringService = stringService; }
public String getString() {
 return base64encode(stringService.getString());
}
private String base64encode(String s) { return "encodedhi" }
}

class SigningStringServiceWrapper implements StringService {
private StringService stringService;
 public SigningStringServiceWrapper(StringService stringService) { this.stringService = stringService; }
public String getString() {
 return sign(stringService.getString());
}
private String sign(String s) { return "signedencodedhi" }
}

Всё обернули, как будто получилось красиво.
String result = new SigningStringServiceWrapper(
 new EncodingStringServiceWrapper(
   new StringServiceImpl() // привет, Егор
 )
).getString();

Тут, вроде, всё понятно. Теперь скажем, что наша единица данных - это не String, а большая бинарная штука, получаемая как InputStream.  Как будто всё должно быть также, но нифига, потому что результат обработки Стринга - это Стринг, а результат обработки  InputStream сторонней библиотекой - это OutputStream.

interface BinaryService { BinaryDto getBinaryDto() }
class BinaryServiceImpl implements BinaryService { BinaryDto getBinaryDto() { return new BinaryDto(read inputSteam from source); }

ThirdPartyBinaryServiceWrapper implements BinaryService {
private BinaryService binaryService;
BinaryDto getBinaryDto() {
 BinaryDto binaryDto = binaryService.getBinaryDto();
 thirdParty.process(binaryService.getBinaryDto().getInputStream(), ??resultOutputStream??);
 binaryDto.setInputStream(?? convert resultOutputStream to inputStream ??);
 return binaryDto;
}
}


Чувак до меня не парился и просто пробросил HttpServletResponse через все слои логики. Что я считаю некошерно.

Интернеты повествуют о PipedInput/OutputStream для конвертации OutputStream в InputStream, но я их, видимо, не понял. Какой подать outputStream в
thirdParty.process
? Вариант с временным new ByteArrayOutputStream приводит к зависанию программы - видимо, созданный поток не читается.

Конкретный пример: получаем оригинал картинки с метаданными из источника и применяем к ней обёртку с обработкой изображения. Файлы могут быть большими, и большая конкурентность, загрузить всё в память в byte[] нельзя.
Ну по сути чувак, который "не парился" все правильно сделал. Если нужна потоковая обработка, т.е. читать и писать частями, и эти части тут же забывать, то выходной поток должен быть именно тем самым конечным потоком, куда вы и хотите отдать данные, а не чем-то еще.
источник

RS

Ruslan Stelmachenko in Java/Kotlin Web and more
Cyclone
Есть некоторая единица данных - пусть это будет String - который мы получаем из источника и применяем к ней некоторые обёртки с обработкой. Что можно сделать со строкой? Ну, пускай её кодинг в base64 и цифровая подпись.

(весь код на пасте: https://pastebin.com/xwrprjY5 )

interface StringService { String getString() }
class StringServiceImpl implements StringService { String getString() { return "hi"; }

class EncodingStringServiceWrapper implements StringService {
private StringService stringService;
 public EncodingStringServiceWrapper(StringService stringService) { this.stringService = stringService; }
public String getString() {
 return base64encode(stringService.getString());
}
private String base64encode(String s) { return "encodedhi" }
}

class SigningStringServiceWrapper implements StringService {
private StringService stringService;
 public SigningStringServiceWrapper(StringService stringService) { this.stringService = stringService; }
public String getString() {
 return sign(stringService.getString());
}
private String sign(String s) { return "signedencodedhi" }
}

Всё обернули, как будто получилось красиво.
String result = new SigningStringServiceWrapper(
 new EncodingStringServiceWrapper(
   new StringServiceImpl() // привет, Егор
 )
).getString();

Тут, вроде, всё понятно. Теперь скажем, что наша единица данных - это не String, а большая бинарная штука, получаемая как InputStream.  Как будто всё должно быть также, но нифига, потому что результат обработки Стринга - это Стринг, а результат обработки  InputStream сторонней библиотекой - это OutputStream.

interface BinaryService { BinaryDto getBinaryDto() }
class BinaryServiceImpl implements BinaryService { BinaryDto getBinaryDto() { return new BinaryDto(read inputSteam from source); }

ThirdPartyBinaryServiceWrapper implements BinaryService {
private BinaryService binaryService;
BinaryDto getBinaryDto() {
 BinaryDto binaryDto = binaryService.getBinaryDto();
 thirdParty.process(binaryService.getBinaryDto().getInputStream(), ??resultOutputStream??);
 binaryDto.setInputStream(?? convert resultOutputStream to inputStream ??);
 return binaryDto;
}
}


Чувак до меня не парился и просто пробросил HttpServletResponse через все слои логики. Что я считаю некошерно.

Интернеты повествуют о PipedInput/OutputStream для конвертации OutputStream в InputStream, но я их, видимо, не понял. Какой подать outputStream в
thirdParty.process
? Вариант с временным new ByteArrayOutputStream приводит к зависанию программы - видимо, созданный поток не читается.

Конкретный пример: получаем оригинал картинки с метаданными из источника и применяем к ней обёртку с обработкой изображения. Файлы могут быть большими, и большая конкурентность, загрузить всё в память в byte[] нельзя.
> Интернеты повествуют о PipedInput/OutputStream для конвертации OutputStream в InputStream, но я их, видимо, не понял.

Так это же для преобразования OutputStream в InputStream. А вам это здесь не нужно. У вас уже есть OutputStream и метод тоже ожидает OutputStream.
источник

AE

Alexandr Emelyanov in Java/Kotlin Web and more
Ruslan
А токсичность в ряде случаев - вполне рабочий механизм защиты от идиотов.
В точку
источник

C

Cyclone in Java/Kotlin Web and more
Ruslan Stelmachenko
> Интернеты повествуют о PipedInput/OutputStream для конвертации OutputStream в InputStream, но я их, видимо, не понял.

Так это же для преобразования OutputStream в InputStream. А вам это здесь не нужно. У вас уже есть OutputStream и метод тоже ожидает OutputStream.
Спасибо, что прочёл)) Мне кажется в некоторой степени чужеродным, что для получения, скажем, Пёрсона с именем, датой рождения и полом мне нужен метод с сигнатурой Person getPerson(id);
А вот если у пёрсона есть ещё и фотка, то сигнатура меняется на Person getPerson(id, outputStream);
источник

C

Cyclone in Java/Kotlin Web and more
Alexandr Emelyanov
В точку
Чувак, если прочтёшь и выскажешь мнение, буду благодарен.
источник

RS

Ruslan Stelmachenko in Java/Kotlin Web and more
Ну это действительно странно. Не представляю зачем нужен такой метод.
Вот если бы это был writePersonPhoto(Person person, OutputStream out) тогда да
источник

RS

Ruslan Stelmachenko in Java/Kotlin Web and more
Person getPerson(id, outputStream);

что должен делать такой метод? вытянуть данные о Person или все таки записать его фотку в выходной поток (например, http response)? он не может делать и то, и другое
источник

C

Cyclone in Java/Kotlin Web and more
Могут быть метаданные, влияющие на response header.
источник

RS

Ruslan Stelmachenko in Java/Kotlin Web and more
Ну вы их все равно не выставите, если байты уже пошли писаться в response.
их нужно выставлять ДО
источник

C

Cyclone in Java/Kotlin Web and more
Ruslan Stelmachenko
Ну вы их все равно не выставите, если байты уже пошли писаться в response.
их нужно выставлять ДО
Почему бы не?

Person person = service.getPerson(id);
httpServletResponse.setHeader("Last-Modified", person.getPhotoModifiedDate());
IOUtils.copy(person.getPhoto().getInputStream(), httpServletResponse.getOutputStream());
источник

AE

Alexandr Emelyanov in Java/Kotlin Web and more
Я честно читал и особо вникнуть не смог с телефона, чуть позже или завтра, но с тем, что говорит Руслан я согласен
источник

C

Cyclone in Java/Kotlin Web and more
Alexandr Emelyanov
Я честно читал и особо вникнуть не смог с телефона, чуть позже или завтра, но с тем, что говорит Руслан я согласен
yep
источник