Каковы проблемы проектирования при возврате хеш-таблицы из открытого метода, когда вы хотите вернуть несколько элементов вместо создания класса и возврата объекта этого?
Если у него есть проблемы, то при каких обстоятельствах имеет смысл это делать?
Как меняется ответ на этот вопрос в зависимости от того, является ли язык динамичным или нет?
Редактировать: чтобы уточнить, что ключи будут постоянными и являются частью кода, а не данных. То, для чего мы обычно создаем класс. Вопрос в том, почему было бы неправильно использовать хеш-таблицу вместо этого, если создание класса действительно кажется правильным выбором.
источник
Одна из проблем заключается в том, что во многих случаях ключом для хэш-таблицы будет строка. Таким образом, потребители метода должны знать заранее, какие ключи использовать для извлечения данных. Это может привести к ошибкам из-за неправильного ввода данных при доступе к данным.
Еще один недостаток - рефакторируемость. Если позже вы решите изменить имя члена, у вас будет куча волшебных строк, которые также нужно изменить. Намного проще переименовать члена класса, используя инструменты рефакторинга, предоставляемые большинством хороших IDE. С хеш-таблицей вам, вероятно, придется выполнить операцию поиска / замены для всех исходных файлов, что может быть проблематично.
Наконец, вы потеряете проверку времени компиляции доступа члена - как с точки зрения имени, так и типа. Последнее не является такой проблемой, если ваша хеш-таблица содержит только один тип объекта, но если в нем много (даже в одной и той же иерархической цепочке), вы действительно хотите использовать систему типов вашего языка и проверить там время компиляции. В большинстве IDE у вас есть какие-то функции intellisense / autocomplete - они работают, глядя на систему типов, но не смогут помочь вам с ключами хеш-таблицы.
Что касается случаев, когда было бы целесообразно возвращать хеш-таблицу (или другую подобную коллекцию пар ключ-значение), вы использовали бы это, когда и значения, и ключи не известны во время компиляции. Например, если у вас есть метод, который анализирует строку запроса и возвращает ключи и соответствующие значения, хеш-таблица будет хорошим выбором. В этом случае вам также стоит подумать о возвращении какой-нибудь неизменяемой или только для чтения хеш-таблицы.
Редактировать - большинство вопросов, поднятых в этом ответе, перестают применяться, когда вы говорите о динамических языках :)
источник
Наиболее важным аргументом против этого будет то, что вы предоставляете слишком много информации потребителю. Потребляющему коду нужно только знать, что это какой-то набор значений ключей (словарь); Реализовано ли это как хэш-карта, список ассоциаций, три или что-то еще, относительно неинтересно. Таким образом, правильным способом будет возврат через подходящий интерфейс (
IDictionary
или любой другой язык, который вы предпочитаете) вместо реального типа.Все это при условии, что вам действительно нужен словарь для представления ваших данных, то есть ваши данные состоят из пар ключ / значение, где ключи уникальны среди набора данных и не могут быть исправлены во время компиляции. Если у вас есть заранее известные ключи, вы должны создать правильный тип (или несколько, как требуется) для ваших данных. Все сводится к тому, считаете ли вы сами ключи частью данных или частью кода.
РЕДАКТИРОВАТЬ :
Чтобы уточнить, я использую термин словарь для обозначения наиболее общего типа структуры данных ключ-значение здесь; Я не имею в виду какую-либо языковую реализацию, такую как Python
dict
или .NETDictionary
.источник
Один вопрос, который я хотел бы задать себе: «меняются ли ключи в этом словаре?» Если они постоянны, вы должны вернуть объект или другую подходящую структуру данных. Если они динамические, вы можете захотеть вернуть некую структуру словарного стиля. Наконец, если есть некоторые ключи, которые будут постоянными, и некоторый неизвестный набор динамических ключей, вы можете вернуть гибридную структуру данных, включающую в себя некоторые фиксированные значения и некоторый словарь для переполнения.
источник