É uma boa prática agrupar um conjunto de propriedades relacionado em sua própria estrutura / classe?


10

Escrevendo um objeto User em Swift, embora minha pergunta esteja relacionada a qualquer linguagem fortemente tipada. Um usuário pode ter vários links (perfil do Facebook, perfil do Instagram etc.). Algumas perguntas sobre isso.

  1. É uma boa prática agrupar links em seu próprio objeto?
    struct Usuário {
       var firstName: string
       var lastName: string
       var email: string
       links var: Links
    }
    Links de estrutura {
       var facebook: string
       var instagram: string
       var twitter: string 
    }

Ou eles devem estar soltos? Eu sei que tecnicamente as duas maneiras são boas, mas me pergunto se existe uma abordagem recomendada, em geral - especialmente para facilitar a leitura.

struct User { 
   var firstName: string
   var lastName: string
   var email: string
   var facebookLink: string
   var twitterLink: string
   var instagramLink: string
}
  1. Em um cenário como esse, os links devem ser uma coleção / lista? Achei que não deveria ser uma lista, porque há um número fixo de opções de links disponíveis, e não um número crescente. Meu pensamento está certo?

  2. É uma boa prática colocar meus métodos de rede dentro do objeto Usuário, como getUsers, getUser, updateUser?

Sei que isso pode ser subjetivo, mas estou tentando entender qual é a melhor prática em situações semelhantes. Gostaria de receber qualquer indicação.

Respostas:


30

Você quer

  • zero de uma coisa,
  • uma coisa, ou
  • um número arbitrário da coisa.

Estou chocado que seu design preveja que o número de links necessários sempre será três e que você saiba quais são os nomes deles para sempre.

O que estou pregando é chamado de regra do infinito zero . Pode não ser óbvio a princípio, mas é o que me diz que seu design não é tolerante ao futuro.

Eu me sentiria diferente se houvesse algo sobre esses links que fosse especial para eles. Alguma coisa especial que eu faço diferente ao acessar um link do facebook que não faço para um link do twitter. Isso os tornaria coisas diferentes. Mas isso não é indicado neste código.

É por isso que não me incomodo com a sequência de emails. Eu sei que é usado de uma maneira diferente dos links.

Então, até que eu veja um motivo para usar esses links de maneira diferente, estou do lado de uma coleção de links.


4
FacebookProfile, InstagramProfile, ...Eu acho que o OP já respondeu à pergunta. Seu idioma está nos dizendo que os usuários podem ter nenhum ou vários perfis relacionados a redes sociais. Mas o programador dentro dele transformou esse elemento em meros links. Por que não uma coleção de Profiles? Eu concordei com CandiedOrange. Você está assumindo muito sobre o futuro. Novas redes sociais podem aparecer. Os reais podem desaparecer. Os usuários podem ir e vir de uma rede para outra.
LAIV

Isso é uma adivinhação. Digamos que você queira usar esses perfis para logins sociais. Tendo o componente Perfil, temos por onde começar. Onde encapsular informações sobre a autenticação e a sessão atual com esses perfis. Isso pode ser considerado YAGNI ou excesso de engenharia, mas não vale a pena pensar nisso, veja se esses recursos podem ser solicitados ou se podem fornecer valor ao nosso aplicativo. Caso contrário, apenas descarte-os.
LAIV

1
@ Prabhu depende de por que você está limitando. Meu palpite é que apenas muitos se encaixam na GUI. O que é bom. Mas não limite a estrutura de dados por causa da GUI. As GUIs mudam por um capricho. As estruturas de dados são caras para mudar. Realmente vale a pena acertar na primeira vez.
Candied_orange #

2
Essa é a questão. Apenas adote as estruturas que tornarão possíveis mudanças futuras menos dolorosas. Nem mais nem menos. Nós, Candied e eu dizemos isso porque nós (acredito) enfrentamos situações semelhantes frequentemente e prevemos possíveis recursos suscetíveis de mudar ou evoluir. Por fim, você está mais próximo do projeto e de sua perspectiva futura.
21418 Laiv

1
@ Prabhu: Observe que você fez uma pergunta sobre boas práticas , não se é a abordagem mais concisa para o seu cenário específico. Normalmente, evito o excesso de engenharia, mas o custo de manutenção futura (adição / remoção de links, atualização das definições de classe de entidade, ...) supera em muito o custo da implementação de uma coleção de links. Se você chamou suas colunas link1, link2, link3, a necessidade de uma coleção teria sido mais evidente. No entanto, o fato de você ter dado um nome mais significativo às colunas não altera o fato de ser uma coleção de dados repetitivos.
Flater

6

Você está prestes a cair na armadilha "Eu vejo uma possibilidade técnica".

Só porque você vê uma característica comum entre os itens não significa que faz sentido aplicar alguma agregação neles. A agregação deve significar algo. Não no nível técnico, mas no domínio do seu problema.

Todos eles são bons, mas no contexto de uma classe de usuário, isso significa alguma coisa? Não. É tão sem sentido quanto seria subgrupos usando classes denominadas "strings" e "numbers".

O problema com esse tipo de coisa é que borra o seu modelo. Isso força o leitor de código a separar o significativo do sem sentido, antes de ter uma compreensão completa do domínio.

Ninguém nunca fala sobre os links de um usuário. Seria diferente se você chamasse sua agregação SocialNetworkIds. Como isso realmente significaria algo, seria uma propriedade verdadeira do Usuário e não uma coleção técnica arbitrária.


Exatamente qual foi minha dúvida que me levou a fazer essa pergunta. A única relação entre os diferentes links é que eles possivelmente seriam exibidos juntos na interface do usuário. Portanto, nesse caso, você sugeriria NÃO colocá-los em um objeto separado corretamente, mas mantê-los diretamente sob o objeto Usuário?
Prabhu

1
Eu não acho que seria útil neste caso. Você ainda não tem um problema que justifique a adição de uma camada de complexidade. Se você tivesse muito mais propriedades, pode ter havido um ganho em um esforço de agrupamento (com nomes adequados para os grupos). É difícil dizer o que é apropriado sem contexto. A linha inferior é que deve facilitar as coisas. Entender e / ou prosseguir com o que quer que seja seu próximo passo no processo de desenvolvimento.
Martin Maat

Eu geralmente como evitar o excesso de engenharia, mas eu pergunto: você teria dito a mesma coisa se OP tinha chamado seus campos link1, link2, link3? O design de uma estrutura de dados é independente do nome dos campos, portanto, meu exemplo é funcionalmente equivalente. É uma questão de proteção para o futuro. A YAGNI geralmente se aplicava, mas, se alguma coisa, a mídia social se mostrou suscetível à popularidade e mudanças virais. Evitar a reconstrução de todos os novos sites populares de mídia social parece desejável. Caso contrário, você corre o risco de cair no campo "o que é mais um campo?" armadilha, que pode criar uma dívida enorme.
Flater

1

Em geral, acho que seria razoável ter os links por conta própria, structse é provável que você aplique operações semelhantes a cada um deles, e principalmente se você sempre executa as mesmas operações em todos eles. Se eles são para fins não relacionados em seu aplicativo, eu os separaria. Por exemplo, se eles fossem a página inicial do usuário, o site do provedor de seguro de saúde e um link para o site de notícias favorito, provavelmente não os agruparia, pois eles parecem não relacionados. Mas para três sites de mídia social, parece que eles serão tratados da mesma forma em um aplicativo e, como tal, provavelmente devem ser agrupados. Eu usaria um nome mais descritivo do que no Linksentanto. (Que tipo de links? Com ​​que finalidade no seu aplicativo?)

Eu concordo com o seu pensamento no # 2. Como mencionado acima, se o número crescer ou se tornar variável, uma lista ou outra coleção seria uma boa escolha, mas não para o cenário que você descreveu.

Eu não colocaria métodos de rede dentro dos objetos que retêm os dados recuperados pela rede. De onde os dados vieram e como obtê-los geralmente são irrelevantes para o principal objetivo de uma classe. E se, no futuro, você desejar obter alguns dados do disco? Ou deseja que o usuário o insira? Vá longe o suficiente nessa estrada e uma Userclasse simples precisa ter código para lidar com todos os métodos possíveis de entrada e recuperação de dados. Apenas faça uma Userclasse reter e manter os dados enquanto estiverem na memória. Tudo o resto pode ser tratado por classes mais apropriadas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.