Одна из проблем заключается в том, что во многих случаях ключом для хэш-таблицы будет строка. Таким образом, потребители метода должны знать заранее, какие ключи использовать для извлечения данных. Это может привести к ошибкам из-за неправильного ввода данных при доступе к данным.
Еще один недостаток - рефакторируемость. Если позже вы решите изменить имя члена, у вас будет куча волшебных строк, которые также нужно изменить. Намного проще переименовать члена класса, используя инструменты рефакторинга, предоставляемые большинством хороших IDE. С хеш-таблицей вам, вероятно, придется выполнить операцию поиска / замены для всех исходных файлов, что может быть проблематично.
Наконец, вы потеряете проверку времени компиляции доступа члена - как с точки зрения имени, так и типа. Последнее не является такой проблемой, если ваша хеш-таблица содержит только один тип объекта, но если в нем много (даже в одной и той же иерархической цепочке), вы действительно хотите использовать систему типов вашего языка и проверить там время компиляции. В большинстве IDE у вас есть какие-то функции intellisense / autocomplete - они работают, глядя на систему типов, но не смогут помочь вам с ключами хеш-таблицы.
Что касается случаев, когда было бы целесообразно возвращать хеш-таблицу (или другую подобную коллекцию пар ключ-значение), вы использовали бы это, когда и значения, и ключи не известны во время компиляции. Например, если у вас есть метод, который анализирует строку запроса и возвращает ключи и соответствующие значения, хеш-таблица будет хорошим выбором. В этом случае вам также стоит подумать о возвращении какой-нибудь неизменяемой или только для чтения хеш-таблицы.
Редактировать - большинство вопросов, поднятых в этом ответе, перестают применяться, когда вы говорите о динамических языках :)