Quais são os problemas de design ao retornar uma hashtable de um método público quando você deseja retornar vários itens em vez de criar uma classe e retornar um objeto disso?
Se houver problemas, em que circunstâncias faz sentido fazê-lo?
Como a resposta a essa pergunta muda dependendo se o idioma é dinâmico ou não?
Editar: Isso é para esclarecer que as chaves seriam constantes e fazem parte do código, não dos dados. Algo para o qual normalmente criamos uma classe. A questão é por que seria errado usar a hashtable, se criar uma classe realmente parece ser a escolha certa.
fonte
Um dos problemas seria que, em muitos casos, a chave da tabela de hash seria uma string. Portanto, os consumidores do método precisariam saber de antemão quais chaves usar para extrair os dados. Isso daria o potencial de erros devido a erros de ortografia ao acessar os dados.
Outra desvantagem é a refatorabilidade. Se você decidir mais tarde alterar o nome de um membro, terá várias sequências mágicas que também precisam ser alteradas. É muito mais simples renomear um membro da classe usando as ferramentas de refatoração fornecidas pela maioria dos bons IDE. Com uma tabela de hash, você provavelmente teria que fazer uma operação de localização / substituição em todos os arquivos de origem, o que poderia ser problemático.
Por fim, você perderá a verificação do tempo de compilação do acesso do membro - em termos de nome e tipo. O último não é um problema se a sua tabela de hash contiver apenas um tipo de objeto, mas se ela contiver muitos (mesmo na mesma cadeia hierárquica), você realmente deseja aproveitar o sistema de tipos do seu idioma e obter a verificação do tempo de compilação lá. Na maioria dos IDE, você terá algum tipo de recurso intellisense / autocomplete - eles funcionam analisando o sistema de tipos, mas não poderão ajudá-lo com as chaves da tabela de hash.
Quanto aos momentos em que seria apropriado retornar uma tabela de hash (ou outra coleção de pares de valores-chave), você usaria isso quando os valores e as chaves não fossem conhecidos no momento da compilação. Por exemplo, se você tiver um método que analise uma string de consulta e retorne as chaves e os valores correspondentes, uma tabela de hash seria uma boa opção. Nesse caso, você também gostaria de pensar em retornar algum tipo de tabela de hash imutável ou apenas de leitura.
Editar - A maioria dos pontos levantados nesta resposta deixa de ser aplicada quando você está falando sobre linguagens dinâmicas :)
fonte
O argumento mais importante contra isso seria que você está expondo muitas informações ao consumidor. O código consumidor apenas precisa saber que é uma coleção de valor-chave (dicionário) de algum tipo; seja implementado como um hashmap, uma lista de associações, um teste ou qualquer outra coisa, é relativamente desinteressante. Portanto, a maneira correta seria retornar por uma interface adequada (
IDictionary
ou qualquer que seja o idioma de sua escolha) em vez do tipo real.Tudo isso assumindo que você realmente precisa de um dicionário para representar seus dados, ou seja, seus dados consistem em pares de chave / valor, onde as chaves são únicas entre o conjunto de dados e não podem ser corrigidas em tempo de compilação. Se você possui chaves pré-conhecidas, deve criar um tipo adequado (ou vários, conforme necessário) para seus dados. Tudo se resume a considerar as próprias chaves como parte dos dados ou parte do código.
EDIT :
Para esclarecer, estou usando o termo dicionário para significar o tipo mais genérico de estrutura de dados de valor-chave aqui; Não me refiro a nenhuma implementação específica de linguagem, como Python
dict
ou .NETDictionary
.fonte
Uma pergunta que eu me faria é "as chaves estão mudando neste dicionário?" Se eles são constantes, você deve retornar um objeto ou outra estrutura de dados apropriada. Se eles são dinâmicos, convém retornar algum tipo de estrutura de estilo de dicionário. Finalmente, se houver algumas chaves que serão constantes e um conjunto desconhecido de chaves dinâmicas, convém retornar uma estrutura de dados híbrida, incluindo alguns valores fixos e algum tipo de dicionário para o estouro.
fonte