Pergunta

Aqui está uma pergunta para aqueles de vocês com experiência em projetos maiores e API / projeto quadro.

Eu estou trabalhando em um quadro que será usado por muitos outros projetos no futuro, assim que eu quero torná-lo agradável e extensível, mas ao mesmo tempo ele precisa ser simples e fácil de entender.

Eu sei que um monte de pessoas queixam-se que o .NET framework contém muitas classes seladas e membros privados. Devo evitar essa crítica e abrir todas as minhas aulas com abundância de membros virtuais protegidas?

É uma boa idéia para fazer como muitos dos meus métodos e propriedades protegida virtual quanto possível? Em que situações você evitar protegida virtual e os membros fazem privado.

Foi útil?

Solução

Sua classe inclui membros de dados; métodos que executam operações internas básicas sobre os membros de dados onde a funcionalidade nunca deve mudar deve ser sempre privado. Assim, métodos que fazem as operações básicas com membros seus dados, como inicialização e de atribuição deve ser privado. Caso contrário, você corre o risco de "segunda ordem" classes de derivados recebendo um conjunto incompleto de comportamentos habilitado; primeira membros de derivativos poderiam redefinir o comportamento da classe.

Isso tudo dito, eu acho que você deve ter muito cuidado com a definição de métodos como "protegida virtual". Gostaria de usar muita cautela na definição de métodos como "protegida virtual", porque isso não só declara o possibilidade de substituir a funcionalidade, mas em alguns aspectos definir um expectativa de overridden funcionalidade. Que soa para mim como um conjunto underdefined de comportamentos para substituir; Eu preferiria ter um conjunto bem definido de comportamentos para substituir. Se você quiser ter um conjunto muito grande de comportamentos substituível, eu prefiro olhar para Aspect Oriented Programming, que permite esse tipo de coisa de uma forma muito estruturada.

Outras dicas

Quando você marcar um método com a palavra virtual, você está permitindo que os usuários a mudar a forma como aquele pedaço de lógica é executado. Para muitos propósitos, que é exatamente o que você quer. Eu acredito que você já sabe disso.

No entanto, os tipos devem ser projetados para este tipo de extensão. Você tem que escolher ativamente os métodos, em que faz sentido para que o usuário alterar o comportamento. Se você acabou de bater em tudo virtual sobre o lugar corre o risco de arruinar a integridade do tipo, ele realmente não ajuda o usuário a entender o tipo, e você pode introduzir uma série de bugs, incluindo questões relacionadas com a segurança.

Eu prefiro a abordagem conservadora. Eu marcar todas as minhas aulas com sealed menos que eu queira especificamente para permitir herança e nesses casos (poucos) Eu só faço os métodos necessários virtual.

É fácil remover a tag sealed se as necessidades da classe para a mudança para permitir herança no futuro. No entanto, se você quer mudar uma classe, que já está sendo usado como uma classe base para algum outro tipo, corre o risco de quebrar a subclasse quando você alterar a classe base.

Meu ponto de vista é:

  • Se você puder usuário events, o seu preferido para métodos protected.
  • Tente métodos evitar protected quanto possível, se não for possível, então você tem que usá-lo; -).

Escolhendo protected sobre private é uma decisão de projeto deliberado. Você está afirmando que sua classe suporta explicitamente ter essa função utilizado, com tudo (esforço de design e implementação) a sobrecarga que vem com isso. Eu só iria usar protected naquelas situações onde eu sei que é necessário, principalmente porque eu estou fazendo isso sozinho. (Você também encontrará comentários de desenvolvedores BCL ao longo das mesmas linhas que o que eu disse.)

A diferença de desempenho virtual / não-virtual é irrelevante em qualquer máquina que é poderoso o suficiente para executar o .NET Framework.

Não, você não pode ter "muitos". No entanto, a ideia de que devemos apenas fazer todos protegidos em vez de privada ou evitar "selou" a todo o custo é bobagem. Gostaria de manter "métodos auxiliares" e estruturas de dados internas privado.

É uma idéia boa para fazer como muitos dos meus métodos e propriedades protected virtual possível?

Não é tão boa idéia.

métodos virtuais protegidas fornecem pontos de extensibilidade no quadro, enquanto a adição de acoplamento.

Não são mais promissoras técnicas para fornecer extensibilidade: Composição e Delegação .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top