LINUX.ORG.RU

Задачка для ума. Из С++, но язык значения не имеет - главное типизация


1

2

Есть функция. Она должна в списке объектов найти объект по заданым свойствам.

Что делать, если функция не нашла объект?

Бросить исключение - не хочется. Понятие пустого объекта нет.

★★★★
Ответ на: комментарий от namezys

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

yoghurt ★★★★★
()
Ответ на: комментарий от mi_estas

> Аргумент: так деревянее и быстрее.

не правда

namezys ★★★★
() автор топика
Ответ на: комментарий от namezys

Да, в том же смолтоке есть методы типа #at:ifAbsent, которым вторым аргументом передаётся блок кода на случай фейла.

yoghurt ★★★★★
()
Ответ на: комментарий от anonymous

> Что, говорят у тебя там УКАЗАТЕЛЬ?

У меня там как минимум ИНДИКАТОР

namezys ★★★★
() автор топика

язык значения не имеет

func :: [a]->Maybe a

EnolaGay
()
Ответ на: комментарий от namezys

> В этом и весь ужас, что человек написал фрее
В чем ужас? В том что я плюсов не знаю? Считайте это псевдокодом.

Если я правильно понял, то мутение это приведение типов. Ну если исключение там это значит что тип не поддерживается, и это ошибка логики где-то в коде.

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

любое действие между конструирование/деструктурирвоание и очистой памяти может привезти к утечке ресурсов

namezys ★★★★
() автор топика

errno = EOBJNOTFOUND;
return false;

Jetty ★★★★★
()

Возвращать смарт-указатель, который может быть null. Или вообще отключить исключения в опциях компилятора. Ссылками никогда не пользоваться, это ненужное костыльное говно которое было внесено чтобы заставить работать operator[] и унарный operator*.

Absurd ★★★
()
Ответ на: комментарий от namezys

>ссылки - это хорошо, если умело

Ссылка не может быть null, ссылку нельзя переназаначать другим объектам. Итого, ссылка - это ненужный кастрированный варинт указателя.

Absurd ★★★
()
Ответ на: комментарий от namezys

Усложню условия - не пользоваться указателем

Возвращать объект по значению - плохо. В некоторых языках и возможности такой нет. Так что пусть будет пойнтер.

Deleted
()
Ответ на: комментарий от Absurd

> Ссылка не может быть null, ссылку нельзя переназаначать другим объектам.

И это хорошо

Итого, ссылка - это ненужный кастрированный варинт указателя.

С соврешенно другой семантикой

namezys ★★★★
() автор топика
Ответ на: комментарий от x0r

>ну это в ущербных крестах :)

В других языках проблем топикстартера не бывает. Возвращают null или nil там какой-нибудь, если вернуть нечего. Ну в хацкеле оборачивают тип в Maybe, да.

Absurd ★★★
()
Ответ на: комментарий от JackyTreehorn

вообще это перезагон на фоне шаблона на шаблоне на шаблоне на шаблоне

namezys ★★★★
() автор топика
Ответ на: комментарий от namezys

>> Ссылка не может быть null, ссылку нельзя переназаначать другим объектам.

И это хорошо

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

Absurd ★★★
()
Ответ на: комментарий от Absurd

> С такой логикой и оператор деления это зло, т.к в знаменателе может быть зеро.

Оно не упадет. Да и деления реже возникает, чем обращение к объекту.

А писать код check_pointer(obj_p)->methosd() - зло

namezys ★★★★
() автор топика
Ответ на: комментарий от namezys

>> Возвращают null или nil там какой-нибудь, если вернуть нечего.

И улетаем в segmentation fault

А там в большинстве случаев и делать нечего кроме как умереть. Вот нужен тебе объект типа mutex. А ОС взяла и не дала его тебе в силу сочетания каких-то внутренних факторов, вернула null. Вариантов дальнейшего успешного продолжения работы без этого мутекса нет. Что делать? Терминатить процесс, чего еще.

Absurd ★★★
()
Ответ на: комментарий от JackyTreehorn

Да не нужен указатель, есть другие возможности

References? Суть та же. Только мне сильно не нравится в C++, что references слишком похожи на обычные переменные. Вроде для удобства, но резко снижается ясность кода.

Deleted
()

Бросить исключение - не хочется.

А это и нельзя в общем случае.

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

Deleted
()
Ответ на: комментарий от JackyTreehorn

Ясность кода - это химера.

Для компилятора - возможно. Но не для программиста, которому этот код придется менять дет через пять :)

Deleted
()
Ответ на: комментарий от Absurd

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

Шикарно. и весь http сервер падает, да еще с хер знает какой ошибкой

namezys ★★★★
() автор топика
Ответ на: комментарий от JackyTreehorn

Ссылка в данном случае не подходит, потому что объекта может и не быть.

Значит, остается один разумный вариант: pointer.

Deleted
()
Ответ на: комментарий от Deleted

В большинстве случаев абсолютно пофиг, ссылка ли это или переменная. Если код в порядке.

JackyTreehorn
()
Ответ на: комментарий от namezys

С++ это постоянная борьба с возможностью отстрелить себе ногу

Это правда. Так что нефиг.

Deleted
()

возвратить null. Перегибать с исключениями не стоит, исключение можно выкинуть, если дальнейшее выполнение кода функции вызвавшей функцию поиска бессмысленно, т.е. функциональность остального кода метода не допускает отсутствие искомого объекта.
Это типичный совет в любой книге с названием «Effective <подставить свое>».

FollowTheRabbit
()
Ответ на: комментарий от namezys

>и весь http сервер падает, да еще с хер знает какой ошибкой

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

Absurd ★★★
()
Ответ на: комментарий от FollowTheRabbit

Но ведь указатели ИНДИКАТОР^WЗЛО!

anonymous
()
Ответ на: комментарий от Deleted

Ну пилять, не нравится буст - напиши свое, делается на коленке за пять минут.

JackyTreehorn
()
Ответ на: комментарий от JackyTreehorn

Слухи об этом сильно преувеличены.

Зато как пугают.

Если умеешь писать правильно - сложно отстрелить. правда вчера два часа втыкал в сообщение: у объекта а, который не является классом, пытаются вызвать метод


class A {...}; class B{ bool isNull(); }; class C {...};

void f(C c)
{
  B a( A(c) );
  if( a.isNull() )
    ...
  ...
}

namezys ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.