C# - Limitando a visibilidade de seus tipos


 Hoje vamos recordar o conceito de visibilidade na linguagem C# e de como e porque, você deve limitar a visibilidade de seus tipos para ter um código mais robusto.

A visibilidade de uma classe, um método, uma variável ou uma propriedade nos informa como este item pode ser acessado. Os tipos mais comuns de visibilidade são privados e públicos, mas na verdade existem vários outros tipos de visibilidade dentro da linguagem C#.

Os modificadores de acesso são palavras-chave usadas para especificar a visibilidade ou acessibilidade declarada de um membro ou de um tipo.

Os modificadores mais usados são : public, private, internal, protected.

Os seguintes níveis de acessibilidade podem ser especificados usando os modificadores de acesso:

Uma boa prática é limitar a visibilidade de seus tipos e/ou membros restringindo-os a apenas a quem precisa realmente acessar o tipo ou membro.

Porquê ?

Por que, quanto menos visibilidade houver, menor será a probabilidade de ocorrer uma alteração indesejada, ou seja, menor será a chance de outras partes do sistema mudar quando você fizer uma atualização.

Assim, quanto menos lugares puderem acessar um tipo ou membro, menos lugares você terá que modificar, para  fazer uma alteração no seu código.

Dessa forma exponha apenas o que precisa ser exposto, e, tente implementar interfaces com classes menos visíveis.

Como falar é fácil, vejamos um exemplo mais palpável...

Restringindo a visilibilidade de seus tipos

Considere uma classe que faça a validação de números de telefones:

Essa classe esta em produção e funciona bem.

Mas um belo dia você recebe um pedido para realizar a validação de número de telefones internacionais dos EUA e de Portugal.

E agora a sua classe passa a falhar porque ela foi implementada para lidar apenas com números de telefones do Brasil.

Agora, além de validar os números de telefones do Brasil, você terá que validar telefones internacionais.

O que você vai fazer ???

Vamos usar uma abordagem correta, em vez de manter a funcionalidade extra nessa classe, você deve reduzir o acoplamento entre os diferentes itens.

Para isso você deve criar uma interface para validar qualquer número de telefone.

A seguir você altera a classe que atualmente faz a validação para implementar essa interface tornando-a uma classe internal :

E depois você cria a classe para validar os telefones internacionais definindo o seu escopo de visibilidade como internal :

Para concluir a implementação, você precisa criar a classe apropriada com base no tipo do número de telefone (que são definidos em uma enumeração TelefoneTipos).

A seguir você pode usar o padrão Factory para essa finalidade.

Fora do assembly, apenas a interface é visível, ou seja, as classes, que são específicas para diferentes regiões do mundo, são visíveis apenas dentro do assembly.

Você pode adicionar diferentes classes de validação para diferentes regiões sem interferir em quaisquer outros assemblies do sistema.

Dessa forma ao limitar o escopo das classes, você limitou o código que você precisa alterar para atualizar e estender todo o sistema.

É claro que esta é apenas uma das muitas abordagens que você pode usar para implementar a solução deste problema.

Você poderia criar uma classe base abstrata pública para TelefoneValidador que poderia conter algorítmos de implementação comuns. Assim os consumidores poderiam acessar a funcionalidade pública através da classe base acessível.

Nessa abordagem vemos o padrão SOLID Open/Closed em ação que diz que 'as entidades devem estar abertas para expansão e fechadas para alteração.';  pois, agora para validar o número de qualquer outro país basta criar o validador específico.

Até o próximo artigo...

Pegue o código completo do exemplo aqui :  Cshp_visibilidade1.zip

"Bem-aventurado o homem que não anda segundo o conselho dos ímpios, nem se detém no caminho dos pecadores, nem se assenta na roda dos escarnecedores.
Antes tem o seu prazer na lei do Senhor, e na sua lei medita de dia e de noite."

Salmos 1:1,2

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

Referências:


José Carlos Macoratti