Deutsch

Можно ли возвращать null из функции?

4145  1 2 3 4 5 6 7 8 все
AlexNek патриот11.04.24 22:01
AlexNek
NEW 11.04.24 22:01 
в ответ Murr 11.04.24 21:47
То, что предписано для не назначенного значения.

Скользкий котяра, скользкий спок

Есть конкретный пример, ожидается конкретный ответ.

Можно даже сказать - предписано выдать сообщение о конкретной ошибке и выйти из программы. (Пысы: в проге несколько соединений к базам данных)

#41 
Срыв покровов патриот11.04.24 23:19
NEW 11.04.24 23:19 
в ответ AlexNek 11.04.24 20:57
Предположим обратное...
Получили, что значение объекта базы нулевое, что делаем дальше?
if(db == null) ...

чел, ты не дурачок случаем?

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

#42 
Программист коренной житель12.04.24 08:11
NEW 12.04.24 08:11 
в ответ AlexNek 11.04.24 17:48
А почему null, а не сразу исключение, тогда сразу всё заткнется без каких то дальнейших шагов.

Ну можно и сразу исключение. Зависит от фабрики и от того, что она должна возвразать.

В общем случае фабрика не может знать является ли отсутствие объекта ошибкой. Ну скажем в случае если мы ищем заказ по ID и ничего не можем найти, то это скорее ошибка. А если мы ищем клиента по фамилии (где ID - это фамилия) и не можем найти, то это может оказаться просто новый клиент и никакой ошибки тут нет. Фабрика должна создавать объекты и не должна принимать никаких решений. Плюс к этому поведение фабрики всегда должно быть одинаковым.

Как бы там ни было, это уже детали реализации фабрики и договоренностей между архитекторами.

#43 
Программист коренной житель12.04.24 08:15
NEW 12.04.24 08:15 
в ответ alex445 11.04.24 18:10
Я работаю и мышью, и клавой.

Всем плевать на то как ты работаешь :)

Программы пишутся для того, чтобы с ними было удобно работать конкретному клиенту. Уверяю тебя, никто не думают о том, как ты работаешь за компом ;)

#44 
Murr патриот12.04.24 15:39
Murr
NEW 12.04.24 15:39 
в ответ AlexNek 11.04.24 22:01

не скользкий. а опытный...


у тебя есть два субтипа объектов:

- который может не назначаться значением

- обязан иметь значение.


для первого нулл является нормально возвращаемым значением

для второго нулл - ситуация возникающая при ошибке.


Переводить ситуацию из первой во вторую путем введения суррогатного нулл-объекта однотипного со значимым результатом есть дебилизм обыкновенный, менеджерский... т.е. Я предпочту разруливание ситуации на уровне типов, а не значений.


Вопрос об исключениях вообще элементарен

- либо исключения используются для обработки ошибочных ситуаций

- либо они используются для нормального управления логикой программы (да, такое тоже случается)

Соответственно - либо - да, либо - нет.

#45 
AlexNek патриот12.04.24 22:03
AlexNek
NEW 12.04.24 22:03 
в ответ Срыв покровов 11.04.24 23:19
чел, ты...

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

Разве с переходом на личности можно прийти к какому-либо результату?


Получили, что значение объекта базы нулевое… Т.к. для этого налоговый номер необходим

В упор не вижу никакой связи между этими двумя высказываниями.

Ну а если перейти к вашему примеру, то правильно ли я понял, что в одном случае нужно выдавать нулл, а в другом исключение? То есть намеренно делаем поведение функции непредсказуемым, для того кто не в теме.


клиент Местной фирмой или иностранной

почему фирмой? И откуда можно взять что именно определено как местная страна? Это всё видно отсюда? GetTaxIdByCustomerId(int)

#46 
AlexNek патриот12.04.24 22:09
AlexNek
NEW 12.04.24 22:09 
в ответ Murr 12.04.24 15:39
не скользкий

еще как, пришлось за хвост дёрнуть, чтобы получить цивилизованный ответ бебе


В принципе можно было и согласится, но смущает "статистика"

Постоянно попадается что-то типа этого, но ни разу не наоборот.

https://medium.com/javarevisited/just-dont-return-null-dcd...

https://medium.com/@jadhavsid1101/why-returning-null-from-...

#47 
Срыв покровов патриот12.04.24 22:32
NEW 12.04.24 22:32 
в ответ AlexNek 12.04.24 22:03

по мне так все логично

Функция, возвращающая налоговый номер, выдаёт null, Если он не определён.

почему фирмой? И откуда можно взять что именно определено как местная страна? Это всё видно отсюда? GetTaxIdByCustomerId(int)

если налоговый номер начинается с DE, то фирма местная. Если с какого-то иного кода страны, то иностранная.

Если налогового номера нет, то это исключение.

#48 
AlexNek патриот12.04.24 22:51
AlexNek
NEW 12.04.24 22:51 
в ответ Срыв покровов 12.04.24 22:32
по мне так все логично

Только потому, что вы вероятно "живете" в этом домене.


А по мне, функция берет на себя слишком много и для этого много нужно смотреть реализацию функции.


Если налогового номера нет, то исключение.

Если налоговый номер не определён, то возвращаем null

Если налоговый номер неправильный, то?

Если фирма иностранная, то исключение.

Если клиент не найден то ?


И по вашему описанию хотелось бы видеть, что то в виде этого

string? GetTaxIdByCustomerId(int customerId, string residentСountryId)


И какое отличие от "номера нет" от "номер не определен"?

А если клиент не фирма?

#49 
Бесконечный цикл постоялец12.04.24 22:56
NEW 12.04.24 22:56 
в ответ AlexNek 12.04.24 22:09, Последний раз изменено 12.04.24 23:00 (Бесконечный цикл)
В принципе можно было и согласится, но смущает "статистика"Постоянно попадается что-то типа этого, но ни разу не наоборот.https://medium.com/javarevisited/just-dont-return-null-dcd...https://medium.com/@jadhavsid1101/why-returning-null-from-...

Фигня все это, от лукавого. Нет никаких причин не использовать null или любое другое (другие) значения, если они прописаны в доках функции. Более того, если есть только один единственный особый случай, то гораздо удобнее использовать null. Ну типа: "Край, ничем не могу помочь. Разбирайся сам."

В первой ссылке какие-то мантры. А по поводу аргументов из второй ссылке:


  • Return an empty collection - Это не по теме. Мы говорим о значении, а не о коллекции. Автор съезжает с темы.
  • Throw an exception. Это вообще другой холивар: return vs. exception. Опять автор съезжает да и проблему не решает, т.к. это надо ловить выше.
  • Return an optional value. This way, the caller can use the optional value to check whether a value was returned or not, and handle the empty case appropriately. - Ну и в чем выгода? По любасу надо проверять возврат по поводу особого случая?
  • Use the Null Object pattern. Здесь типа даже если ничего не возращено, то все идет по плану. Это вообще зашквар какой-то. Типа юзер не найден, но далее все идет по плану. Это как?
  • Use assertions. И чем это отличается от явных проверок? Ну впрочем это лучшее решение, чтобы проверять отсутствие null во время выполнения если это нельзя проверить во время компиляции (как в Котлин например). Полезно, если null вообще невозможен. Но мы же говорим о случае, когда она возможен.


Основная рекламируемая выгода от этих наворотов это избежать nullpointerexception (это как срашный сон). Но я бы сказал, что этb средства означают заметать мусор под ковер. Надо наоборот: чем раньше такие nullpointerexception возникают, тем лучше, поскольку сразу видно кто где накосячил, а не ждать весны (релиза), чтобы видеть кто где насрал.


#50 
Срыв покровов патриот13.04.24 00:20
NEW 13.04.24 00:20 
в ответ AlexNek 12.04.24 22:51
Если налогового номера нет, то исключение.
Если налоговый номер не определён, то возвращаем null

С точки зрения информации в БД это один и тот же случай .

#51 
alex445 патриот13.04.24 13:27
NEW 13.04.24 13:27 
в ответ AlexNek 12.04.24 22:51, Последний раз изменено 13.04.24 13:28 (alex445)
А по мне, функция берет на себя слишком много

Когда пытается возвращать сочинения вместо наллового айди.


Вернуть налловый айди из базы это работа с базой. Интерпретировать возврать это бизнес-логика.

#52 
AlexNek патриот13.04.24 14:50
AlexNek
NEW 13.04.24 14:50 
в ответ Бесконечный цикл 12.04.24 22:56
В первой ссылке какие-то мантры. А по поводу аргументов из второй ссылке

разбирать приведенные ссылки особого смысла нет, это просто был как пример, что обычно попадается.


Более того, если есть только один единственный особый случай, то гораздо удобнее использовать null.

ничего не имею против, непонятно только отчего подобные рекомендации не попадаются так же часто как и "запрет" на использовании нулл


Мы говорим о значении

не знаю отчего вы так решили, разговор о том что может возвращать функция. Если требуется value type выделить, давайте выделим и разберем их отдельно


чем раньше такие nullpointerexception возникают

так именно об этом и разговор. Только если НПФ возникает - это уже ошибка, а раз ошибка то исключение должна выбрасывать функция.

#53 
AlexNek патриот13.04.24 14:52
AlexNek
NEW 13.04.24 14:52 
в ответ Срыв покровов 13.04.24 00:20
С точки зрения информации в БД это один и тот же случай .

Тогда в каком случае выдаётся null, а в каком исключение?

#54 
AlexNek патриот13.04.24 14:56
AlexNek
NEW 13.04.24 14:56 
в ответ alex445 13.04.24 13:27
Когда пытается возвращать сочинения вместо наллового айди.

Это всё конкретный пример, на основе которого нужно выработать определенные правила, а после их проверить на других примерах.

#55 
Срыв покровов патриот13.04.24 16:32
NEW 13.04.24 16:32 
в ответ AlexNek 13.04.24 14:52
Тогда в каком случае выдаётся null, а в каком исключение?

см. выше.

#56 
AlexNek патриот13.04.24 17:01
AlexNek
NEW 13.04.24 17:01 
в ответ Срыв покровов 13.04.24 16:32

см. выше. Goto давно запрещено бебе


Если налогового номера нет, то исключение.
Если налоговый номер не определён, то возвращаем null
#57 
Срыв покровов патриот13.04.24 19:29
NEW 13.04.24 19:29 
в ответ AlexNek 13.04.24 17:01

сказочный долбоёб

#58 
AlexNek патриот13.04.24 20:20
AlexNek
NEW 13.04.24 20:20 
в ответ Срыв покровов 13.04.24 19:29

Понимаю, неделя выдалась плохая, настроение фиговое, хочется с кем-то поругаться. Бывает.

Самое простое обвинить кого-то, не задумываясь о первопричинах.

#59 
MrSanders коренной житель13.04.24 21:11
NEW 13.04.24 21:11 
в ответ AlexNek 11.04.24 21:55
Нужны правила отчего не нужно. Запрещаем вообще или есть какие то исключительные случаи?

Я не Ололёша, про шарп рассказывать не могу, я в нём не копенгаген. Но "в общем" - запрещаем вообще, единственный исключительный случай - когда нам запретить не дают. Требуют, чтобы мо могли хранить и, соответственно, возвращать null.

В каком именно?

Паскаль он один. Виртовский. Ну, пусть будет борландовский турбо-паскаль, ладно. Называть дельфи паскалем как называть шарп - си.

#60 
1 2 3 4 5 6 7 8 все