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
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