Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / null и пустая строка / 25 сообщений из 33, страница 1 из 2
11.06.2013, 16:14:55
    #38294347
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
Задумался об аналогиях. В некоторых DBMS на уровне типов
данных не различается состояние пустой строки и строки равной NULL.
На уровне операций. Т.е. конкатенации и поиски строк и прочие
операции ведут себя идентично. А в Java коде мы ставим много
проверок на аргумент == null. Задумался о враппере для
строк где эта особенность учитывается.
...
Рейтинг: 0 / 0
11.06.2013, 16:42:52
    #38294386
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
можно, конечно, посткомпиляцией обернуть все небезопасные обращения к переменным типа String.
Но NPE на строках, по-моему не такая уже большая проблема.
...
Рейтинг: 0 / 0
11.06.2013, 16:45:32
    #38294392
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
Blazkowiczобернуть все небезопасные обращения к переменным типа String.

Вот это реально проблема. Лопатить весь код. Мне кажется лучше
создать новый тип данных. Что-то вроде SafeString или NullableString.
Не наследник. Не контейнер а просто вообще новый тип. И заимплементить
потихоньку эту Varchar-like логику.
...
Рейтинг: 0 / 0
11.06.2013, 16:48:02
    #38294398
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
Если не секрет, в каких именно dbms?
...
Рейтинг: 0 / 0
11.06.2013, 16:50:21
    #38294402
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
maytonВот это реально проблема. Лопатить весь код.

про "посткомпиляцию" ты зачем-то ловко из моего коментария выкинул. Конечно же не руками делать.
...
Рейтинг: 0 / 0
11.06.2013, 16:55:59
    #38294412
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
ivanraЕсли не секрет, в каких именно dbms?
В Oracle.
...
Рейтинг: 0 / 0
11.06.2013, 17:07:13
    #38294438
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
maytonЗадумался о враппере для строк где эта особенность учитывается. Враппер - избыточно. Здесь достаточно одной функции, например: StringUtils.defaultString .
...
Рейтинг: 0 / 0
11.06.2013, 17:08:36
    #38294443
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
maytonivanraЕсли не секрет, в каких именно dbms?В Oracle.
конкатенация - да, а про поиски строк неверное утверждение, я поэтому и спросил. Ни разу не встречал чтобы выдавался один и тот же результат на условия
Код: sql
1.
2.
where somestring=''
where somestring is null


Насчет явы - а почему бы не использовать StringBuilder? Там конструктор с null и пустой строкой дают одинаковое содержимое
...
Рейтинг: 0 / 0
11.06.2013, 17:15:22
    #38294459
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
maytonне различается состояние пустой строки и строки равной NULL Формально они идентичны. Иногда это используется на практике: Validating Null and Empty Strings
...
Рейтинг: 0 / 0
11.06.2013, 17:17:38
    #38294465
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
BlazkowiczmaytonВот это реально проблема. Лопатить весь код.

про "посткомпиляцию" ты зачем-то ловко из моего коментария выкинул. Конечно же не руками делать.
Извини. Что-то в это время я торможу как слоупок. Да и не спец я в посткомпилляциях.
Может кинешь ссылку на юзкейс?
...
Рейтинг: 0 / 0
11.06.2013, 19:35:02
    #38294594
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
maytonВ некоторых DBMS на уровне типов
данных не различается состояние пустой строки и строки равной NULL.
На уровне операций. Т.е. конкатенации и поиски строк и прочие
операции ведут себя идентичночто гармонично уравновешивается троичной логикой и необходимостью отдельно обрабатывать "null" и "все остальные данные".

P.S. А разве простое someConstant.equals(someVar) не закрывает значимую/существенную часть NPE-причин в случае строк?
...
Рейтинг: 0 / 0
12.06.2013, 10:25:27
    #38294907
J.Serge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
UsmanИногда это используется на практике: Validating Null and Empty Strings

Красивый код из примера по ссылке:
Код: java
1.
2.
3.
4.
5.
if (testString.equals(null)) {
  doSomething();
} else  {
  doAnotherThing();
}
...
Рейтинг: 0 / 0
12.06.2013, 10:37:37
    #38294912
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
J.SergeКрасивый код из примера по ссылке:
Код: java
1.
2.
3.
4.
5.
if (testString.equals(null)) {
  doSomething();
} else  {
  doAnotherThing();
}


Даа... фак мой мозг от JSF.
...
Рейтинг: 0 / 0
12.06.2013, 13:21:34
    #38295034
J.Serge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
не, меня умиляет описание этого кода:
авторBy default, the doAnotherThing method is called even when the user enters no data, because the testString element has been initialized with the value of an empty string.

Можно подумать, если testString проинициализировать null'ом, то вызовется doSomething...
...
Рейтинг: 0 / 0
12.06.2013, 14:02:32
    #38295063
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
Я полез в дебри. В нашем продакшен коде очень много паттернов типа

Код: java
1.
2.
3.
if (someObject!=null) && (someObject.subObject!=null) && (someObject.subObject.Property.equals(someFuckenValue) && .... ){
    .....
}



И строки это просто частный случай. Много операций использующих логику проверок и сравнения с null.

Кружусь в медленном вальсе. Медитирую. Пью кофе и грызу конфетки.
...
Рейтинг: 0 / 0
12.06.2013, 14:31:19
    #38295089
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
StringUtils на все случаи жизни. Либо defaultString для сравнений, либо isBlank/isNotBlank для условий. зачем усложнять?
Готовый код не надо перелопачивать, просто далее используй только новый, и корректируй старый по мере попадания на глаза.
...
Рейтинг: 0 / 0
12.06.2013, 14:38:27
    #38295096
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
mayton
Код: java
1.
2.
3.
if (someObject!=null) && (someObject.subObject!=null) && (someObject.subObject.Property.equals(someFuckenValue) && .... ){
    .....
}



Инкапсуляция ни к черту. Это и есть та самая Anemic Model на которую так плюётся Фаулер. Почему всё это не находится внутри объектов someObject и subObject? Почему текущему классы приходится обращаться к Property ещё через две ссылки?
Некий внешний класс проводит манипуляции\проверки состояния каких-то объектов, вместо того чтобы делигировать им эту логику.
...
Рейтинг: 0 / 0
12.06.2013, 14:48:24
    #38295106
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
Blazkowicz,
так работает мозг, сначала проверка someObject!=null, потом вспоминает что еще можно проверить, и руки сами дописывают остальное
...
Рейтинг: 0 / 0
12.06.2013, 14:51:54
    #38295111
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
javapeckerBlazkowicz,
так работает мозг, сначала проверка someObject!=null, потом вспоминает что еще можно проверить, и руки сами дописывают остальное
Я бы не называл это "работает мозг". Это называется что вижу, то пою. NPE? Та, пофиг. Не будем фиксить первопричину. Просто добавим проверку на null.
...
Рейтинг: 0 / 0
12.06.2013, 14:54:59
    #38295113
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
maytonЯ полез в дебри. В нашем продакшен коде очень много паттернов типа

Код: java
1.
2.
3.
if (someObject!=null) && (someObject.subObject!=null) && (someObject.subObject.Property.equals(someFuckenValue) && .... ){
    .....
}



И строки это просто частный случай. Много операций использующих логику проверок и сравнения с null.

Кружусь в медленном вальсе. Медитирую. Пью кофе и грызу конфетки.
Поэтому я написал выше что строки это очень частный случай. Проблемы null значений он не решит.
Я стараюсь минимизировать проверки на null и, если возникает NPE, фиксить его в одном месте там где появляется null значение. А не во всех местах куда оно распространяется в итоге.
А так, рекомендации стандартные
NullObject pattern
@NotNull (Oval, IntelliJ IDEA и многие другие)
Языки с интегрированым NotNull, например Kotlin.
...
Рейтинг: 0 / 0
12.06.2013, 14:55:02
    #38295114
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
maytonЗадумался об аналогиях. В некоторых DBMS на уровне типов
данных не различается состояние пустой строки и строки равной NULL.
На уровне операций. Т.е. конкатенации и поиски строк и прочие
операции ведут себя идентично. А в Java коде мы ставим много
проверок на аргумент == null. Задумался о враппере для
строк где эта особенность учитывается.

Зачем? В java на клиенте во-первых, совсем другие правила для работы с NULL, чем в базе данных, во-вторых java null - это совсем другой null, нежели NULL в базе данных и SQL. Они никак не связаны друг с другом.
...
Рейтинг: 0 / 0
12.06.2013, 15:08:13
    #38295124
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
BlazkowiczИнкапсуляция ни к черту. Это и есть та самая Anemic Model на которую так плюётся Фаулер. Почему всё это не находится внутри объектов someObject и subObject? Почему текущему классы приходится обращаться к Property ещё через две ссылки?
Некий внешний класс проводит манипуляции\проверки состояния каких-то объектов, вместо того чтобы делигировать им эту логику.
Я унаследовал этот код от предшественников. И задача вобщем-то не стоит как "Почему-бы не".
Просто нет времени и возможности рефакторить фундамент. А начать сначала
с каких-то разумных упрощений по мере возможности - это да.

А появление null-аргументов String растёт корнями из ORM, DAO и прочих слоёв которые
сопрягаются с БД. Что поделаешь. NULL для БД - это нормально.
...
Рейтинг: 0 / 0
12.06.2013, 15:18:36
    #38295137
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
maytonЯ унаследовал этот код от предшественников. И задача вобщем-то не стоит как "Почему-бы не".

А как тогда задача стоит?

maytonПросто нет времени и возможности рефакторить фундамент. А начать сначала
с каких-то разумных упрощений по мере возможности - это да.

Не нужно рефакторить. Выкидываем проверку на null, где она не нужна. Добавляем NotNull для выявления источника null значения.
Исправляем на NullObject либо выкидываем Exception\делаем валидацию на месте появляения null, а не на месте использования.

maytonА появление null-аргументов String растёт корнями из ORM, DAO и прочих слоёв которые
сопрягаются с БД. Что поделаешь. NULL для БД - это нормально.
Нет, это не нормально. Во-первых NULL поля в базе тоже стоит свести к минимуму и оставить только там где они действительно нужны.
Во-вторых проверки на null значения свойств сущностей зачастую легко инкапсулируются в самих сущностях, и тогда весь остальной код можно от них избавить. Без конкретного примера понять не просто. Покажи реальный похожий код из системы и объясни источник null значений. Тогда можно обсудить как выкинуть лишние проверки.
...
Рейтинг: 0 / 0
12.06.2013, 15:50:07
    #38295162
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
BlazkowiczНе нужно рефакторить. Выкидываем проверку на null, где она не нужна. Добавляем NotNull для выявления источника null значения.
Исправляем на NullObject либо выкидываем Exception\делаем валидацию на месте появляения null, а не на месте использования.
Я место появления знаю. 99% это объекты DAO. Переходники MyBatis.
...
Рейтинг: 0 / 0
12.06.2013, 15:59:18
    #38295171
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null и пустая строка
maytonЯ место появления знаю. 99% это объекты DAO. Переходники MyBatis.
Замечательно. Тогда просто нужно отказываться от абсолютно анемичных сущностей и выносить эти провери туда. Код станет намного проще.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / null и пустая строка / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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