ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   WriteString (https://forum.antichat.xyz/showthread.php?t=766976)

ZubasticZubastic верифицированный пользователь. 11.09.2016 21:43

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

Итак, я попросил 3х людей в скайпе реализацию WriteString. Точнее хотел я получить ее быстро, но отвечали все достаточно медленно и я просто уснул, а когда проснулся получил 3 реализации данного метода. В чем его суть: первые 2 байта это short - размер строки, затем идет по 2 байта на символ. Все достаточно просто. Ники авторов я специально указывать не буду.

1)

PHP:


Код:

protected
void
writeString
(
CharSequence charSequence
)
{
writeH
(
charSequence
.
length
(
)
)
;
writeS
(
charSequence
)
;
getByteBuffer
(
)
.
position
(
getByteBuffer
(
)
.
position
(
)
-
2
)
;
}

Тут все достаточно просто: пишем H, пишем S и затем убираем из буфера хвостик в 2 байта. Не самое оптимальное решение, по моему мнению, с точки зрения: добавим 2 байта и потом их еще отрежем.

2)

PHP:


[CODE]
public
void
writeString
(
String value
)
{
if
(
value
!=
null
)
{
_buf
.
writeShortLE
(
value
.
length
(
)
)
;
for
(
int i
=
0
;
i

Тут если честно я не совсем понимаю зачем проверять на null, если можно просто сделать длину строки равной 0, например вот так (яву знаю на уровне hello world, мб если null то вернется 0, пускай будет так):

PHP:


[CODE]
public
void
writeString
(
String value
)
{
int len
=
value
==
nul
?
0
:
value
.
length
(
)
;
_buf
.
writeShortLE
(
len
)
;
for
(
int i
=
0
;
i

Читаемость кода улучшится на порядок, да и простынки не будет.

3)

PHP:


[CODE]
final
int len
=
text
.
length
(
)
;
writeH
(
len
)
;
for
(
int i
=
0
;
i

Вот собственно то, о чем я говорил. Быстро и удобно.

А вы что думаете об этом?

Mizuwokiru 11.09.2016 22:17

Только вот если у тебя text == null, получишь NullPointerException при обращении к length().

Еще есть вариант с str.toCharArray() и последующей записи каждого char`а в буфер. И еще Сишный вариант - запись массива байтов напрямую str.getBytes("UTF-16LE").

ZubasticZubastic верифицированный пользователь. 11.09.2016 23:02

Цитата:

Сообщение от Mizuwokiru

Только вот если у тебя text == null, получишь NullPointerException при обращении к length().

Там еще выше условие было, все окей там.


Время: 23:07