Nuno Gomes /*Aventuras e Desventuras de um programador*/

var assuntos = new { Linguagem = "C#", Tecnologia = "ASP.NET" };

ASP.NET - Lições para o Futuro I

Ontem encontrei um pedaço de código que pode ser representado por:

public class DemoList : WebControl
{
    protected override object SaveViewState()
    {
        object x = base.SaveViewState();
        object y = this.Items;
        return new Pair(x, y);
    }
    protected override void LoadViewState(object savedState)
    {
        Pair pair = (Pair)savedState;
        base.LoadViewState(pair.First);
        this.Items = (List<WebControl>)pair.Second;
    }

    public List<WebControl> Items
    {
        get; set;
    }
    [...]
}

Um WebControl que reimplementa os métodos de LoadViewState e SaveViewState para permitir persistir uma colecção de controlos que herdam de WebControls.

Por definição os controlos usam o ViewState para persistir o seu estado e cada controlo presente na hierarquia de controlos é chamado a contribuir para o ViewState final da página.

Ora, o cenário que descrevi é de facto muito estranho e poderia apontar para uma duplicação de dados em ViewState:

  • O estado guardado pelo próprio controlo presente na colecção
  • O estado guardado pelo controlo DemoList na serialização da colecção.

Para os que nesta altura já reparam que este cenário não é possivel Smile vou acrescentar mais uns pormenores relativos ao cenário que descrevo:

  • Não sendo a classe WebControl serializavel, os controlos presentes na colecção implementam o interface ISerializable para descreverem o modo como a serialização se deverá processar
  • Os controlos presentes na colecção nunca são adicionados à colecção de controlos do controlo DemoList e por isso nunca participam no ciclo de vida da página

Agora que o cenário está mais composto é perceptivel que:

  • cada controlo da colecção está apenas a servir de DTO pelo o seu uso é inadequado e devia ser uma classe simples
  • a escolha de usar um controlo como item da colecção obrigou à implementação adicional do interface ISerializable

Para além do esforço adicional e da menor legibilidade do código esta implementação também produz:

  • uma maior assinatura em memória, por cada Request, pois um WebControl é de longe mais complexo que uma classe simples
  • performance em carga poderá estar comprometida

Por esta altura deverão estar a pensar que esta implementação só tem pontos negativos mas tal não é verdade.

O uso do interface ISerializable optimiza o processo de serialização/deserialização do objecto e poderá nalguns casos reduzir a dimensão do ViewState.

Avaliação final: NÃO REPETIR

Posted: 3-8-2011 2:19 por Nuno Gomes | with no comments
Filed under: ,
Leave a Comment

(requerido) 

(requerido) 

(opcional)

 

(requerido) 

If you can't read this number refresh your screen
Enter the numbers above: