Skip to content

Padrão Emergente

Versionamento

Data Versão Descrição Autores
13/09/2021 1.0 Criação do documento Gabriel Batalha, Hugo Bezerra, Kleidson Alves, Lucas Gabriel e Lucas Rodrigues
19/09/2021 1.1 Aplicação do Lazy Load Davi Antônio, Gabriel Batalha, Hugo Bezerra, Kleidson Alves, Lucas Gabriel, Lucas Rodrigues, Wellington Jonathan

Introdução

Lazy Load (carregamento preguiçoso) é um padrão de projeto que é muito utilizado no desenvolvimento de software e consiste em atrasar a inicialização de um objeto até que ele seja necessário. O objetivo do Lazy load é melhorar o desempenho da aplicação, principalmente aquelas que fazem carregamentos massivos de dados, carregando os dados conforme seja necessário. Dessa forma, a sua utilização pode reduzir o tempo de carregamento, além de conservar largura de banda e alguns recursos do sistema, tanto do servidor quanto do cliente.

Existem basicamente 4 formas de se implementar o Lazy Load, sendo elas,virtual proxy, value holder, ghost, e lazy initialization. Os nossos estudos focaram na Lazy Initialization.

Lazy Initialization

Lazy initialization (inicialização preguiçosa) é uma das formas de implementação do Lazy Load e se consiste em uma tática de atraso na criação de um objeto até o momento em que seja necessário, isso é feito a partir da implementação de uma função que irá checar primeiro se aquele objeto é nulo e em caso afirmativo irá calcular as propriedades do objeto e criá-lo durante a execução da função.

Ao utilizar o lazy initialization obtemos duas características importantes, o atraso de uma operação custosa até o momento em que ela se torna extremamente necessária e salvando o resultado garantimos que não vamos precisar realizar aquela mesma operação novamente.

O lazy initialization está sendo implementado, a seguir, como um exemplo toy. A Linguagem Dart tem um modificador late que tem como funcionamento especial implementar o lazy initialization .

No exemplo toy, na classe CategoryScreen o late é aplicado para a variável Firestore Instance de forma que ela só é inicializada na primeira vez que for acessada, o que caracteriza o lazy initialization.

Modelagem

Exemplo Toy

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class CategoryScreen extends StatelessWidget {
    const CategoryScreen({ Key? key }) : super(key: key);
    late final FirebaseFirestore firestoreInstance;
    @override
    Widget build(BuildContext context) {
       firestoreInstance = FirebaseFirestore.instance;
       return FutureBuilder <QuerySnapshot>(
          future: firestoreInstance.collection('produtos').get(),
          builder: (context, snapshot){
            if(!snapshot.hasData)
              return Center(child: CircularProgressIndicator());
            else{
              var dividedTiles = ListTile.divideTiles(
                tiles: snapshot.data!.docs.map(
                  (doc){
                   return CategoryTile(doc);
                  }
                ).toList(),
                color: Colors.grey).toList();
              return ListView(
                children: dividedTiles
              );
            }
          }
        );
      }
    }

Outras implementações

Falando simplificadamente sobre as outras formas de implementação do Lazy Load, temos que o virtual proxy é um método que consiste em, quando acessar um objeto, chamar um objeto virtual com a mesma interface do objeto real. Quando o objeto virtual é chamado, carrega-se o objeto real, depois delega para ele.

O método ghost consistem em carregar um objeto em um estado parcial, apenas usando um identificador. Então, quando uma propriedade do objeto for chamado pela primeira vez, carregue os dados completos.

O método value holder consiste em criar um objeto genérico que lida com o comportamento do carregamento preguiçoso. Este objeto deve aparecer no lugar dos campos de dados de um objeto.

Referências

FOWLER, Martin. Patterns of Enterprise Application Architecture. Addison-Wesley, 2002.

Null safety - Lazy initialization. Disponível em: https://dart.dev/null-safety/understanding-null-safety#lazy-initialization. Data de acesso 19/09/2021

Lazy initialization. Disponível em: https://en.wikipedia.org/wiki/Lazy_initialization. Data de acesso: 13/09/2021

Lazy Initialization. Disponível em: http://www.javapractices.com/topic/TopicAction.do?Id=34. Data de acesso: 13/09/2021

What is Lazy Loading. Disponível em: https://www.imperva.com/learn/performance/lazy-loading/. Data de Acesso: 13/09/2021

Lazy loading. Disponível em: https://pt.wikipedia.org/wiki/Lazy_loading. Data de Acesso: 13/09/2021