Raphael Lorenzeto

Visual Basic | .Net Framework | Windows Presentation Foundation | and stuff

Posts Tagueados ‘stream

NotSupportedException, NotImplementedException e a Task List

fazer um comentário »

Para os que já viram as duas classes, a diferença entre elas é algo um tanto confuso:

A NotSupportedException deve ser usada quando uma classe não suporta determinado método definido na classe-base ou em uma interface e é obrigado a implementar. Esse “não-suporte” tem que ser de certa forma planejado, quero dizer, a classe não deve suportar tal procedimento por definição. Em algum ponto do planejamento isso teve que ser pensado e tiveram que chegar à conclusão de que “não, não podemos suportar essa funcionalidade ou não tem como executar tal tarefa“.

Pegue por exemplo a classe ArrayList (em System.Collections): Ela é uma lista normal, pode adicionar ou remover elementos e faz o que listas fazem, mas pode ser que você queira impedir alterações a partir de um determinado momento. Para tal, pode-se usar a função ArrayList.ReadOnly(list As ArrayList) As ArrayList, que pega uma lista normal e a torna somente leitura. A partir de agora, a lista vai invocar a NotSupportedException nos métodos que tentarem a modificar, como Add e Remove.

Um outro exemplo, melhor inclusive, é o do System.IO.Stream. Pelo menos umas 20 classes derivam de Stream, mas poucas são as que suportam o posicionamento arbitrário do cursor de leitura, quero dizer: Ao usar o FileStream, você pode ler os 100 primeiros bytes, em seguida pular para os 400 últimos e depois ir para o meio do arquivo, já ao usar o NetworkStream você é obrigado a ler (ou escrever) em seqüência. Você não pode “pular” ou “seek” para outro ponto do stream e se você tentar, a classe vai invocar a NotSupportedException.

Já a NotImplementedException tem outro propósito. Essa exception deve ser invocada quando determinada parte do código ainda não tiver sido escrita mas com certeza será porquê o objeto tem que suportar tal função por definição.

Quando você cria uma nova classe e coloca as interfaces de primeira, o “Implements IList” por exemplo, o VS cria todos os procedimentos em branco. Você pode codificar os que você vai precisar usar de imediato e colocar nos outros:

Throw New NotImplementedException()

Assim durante o desenvolvimento da aplicação, quando tal método for por acaso acessado será notado que ele ainda não foi implementado, mas espera-se que seja antes da versão final. Você pode pensar “Ah, deixar em branco é mais fácil”. Sim, de fato é, mas se nenhum artifício for usado, o método poderá acabar ficando para sempre em branco, o que pode gerar algum tipo de anomalia no teu aplicativo, já que se a classe implementa uma interface, espera-se que ela implemente tudo que a interface define.

Uma boa idéia para versões futuras do VS é dar à NotImplementedException o mesmo tratamento dos comentários iniciados por “TODO”. O Visual Studio 2002 introduziu a “Task List” embutida e dinâmica. Quando você inicia uma linha de comentário com “TODO”, uma nova tarefa é adicionada à Task List contendo o arquivo e o número da linha. Exemplo:

Public Overrides Function ToString() as String
	'TODO: ToString
	Return String.Empty
End Function

Existem outros prefixos que também podem ser usados por padrão no VS, são eles:

'HACK: Na verdade nunca usei esse.
 'UNDONE: Vai fazer a pausa para o almoço? 'Marque a linha na qual está trabalhando. 'UnresolvedMergeConflict: Esse é usado quando o VS converte um 'projeto de uma versão anterior e encontra um problema que 'não pode ser resolvido automaticamente.

Outra coisa legal é que você pode criar os seus próprios “marcadores”. Na janela de opções do Visual Studio, em Environment > Task List você pode criar novos “Tokens”, atribuindo inclusive a prioridade que cada um possui.

Agora, 10 pontos para quem souber me dizer se o correto seria “A NotSupportedException” ou “O NotSupportedException”. Classes têm gênero masculino/feminino?? :-)

RLA.

Escrito por raphaabreu

janeiro 7, 2008 em 12:00 pm

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.