2012-07-04 2 views
3

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

Я хочу проверить, существует ли значение в хэше в хеше. Так что я делаю это.

already_exists_data[:data][:user_id] 

Но что может заставить меня исключение NullPointer если: данные ноль и проверка: данные могут дать мне NullPointer если already_exists_data равна нулю. Так что я в конечном итоге с этим:

if already_exists_data && already_exists_data[:data] && already_exists_data[:data][:user_id] 
    # Do stuff 
end 

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

Я в настоящее время кодирую в Ruby, но у меня была эта проблема с несколькими другими языками.

ответ

2

Если я попрошу своего дворецкого подобрать коробку конфет на столовую на улице Виктории 34, я прошу его только об этом. Я не хочу сказать: Идите на улицу Виктория, и, если найдете, пожалуйста, найдите номер 34, и если вы найдете его ...

Я могу это сделать, потому что он ловит свои ошибки : если он не найдет улицы, он просто вернется с пустыми руками.

Поэтому вы должны использовать try с пустым обработчиком исключений. В псевдокоде:

попробовать {конфеты = улицы ("Виктория") (34) ("столовая") ("стол")}

В языках (например, ruby, с некоторыми домотканой syntactic sugar), где блоки выражения можно написать:

если попробовать {already_exists_data (данные) (user_id)}

сделать _stuff

Сам язык также может помочь: в perl, $streets{Victoria}[34]{dining_room}{table} не определено, когда, например, $streets есть. Конечно, ваш дворецкий может прийти домой с пустыми руками в течение многих лет, прежде чем вы обнаружите, что адрес неправильный.Блок-решение try - и ваш if .. && .... - имеют тот же недостаток: используйте их только тогда, когда вам действительно все равно, если у Victoria Street есть номер 34 или нет.

1

Язык-агностик: не использовать nulls. Когда-либо. Соблюдайте это правило в своих проектах. Если вам абсолютно необходимо, wrap them into Either/Optional which adds explicitness. Некоторые языки, такие как Scala, есть понятие Optional уже построены в

Java-конкретное решение:., если вы должны использовать аннулирует, аннотировать аргументы методы и возвращаемые значения с @Nullable и @Nonnull. Достойные IDE (такие как IntelliJ) способны анализировать ваш код и выделять возможные варианты поиска, если значение получено из такого метода.

1

Другая возможность заключается в том, чтобы обернуть доступ хеширования вызовом функции и выполнить «грязную» работу внутри функции. Тогда ваш код будет что-то вроде (синтаксис псевдо-код):

accessHash(already_exists_data, data, userid) 

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