Havia uma grande diferença entre o que as funções fazem e o que a classe faz.
Vamos explicar do zero.🙂 (apenas sobre o imperativo)
Todos nós sabemos que a história da programação começou com comandos básicos diretos (por exemplo: Montagem).
Em seguida, a programação estruturada veio com controles de fluxo (por exemplo: if, switch, while, for etc). Este paradigma permite aos programadores controlar o fluxo do programa de forma eficaz e também minimizar o número de linhas de código por loops.
Em seguida, veio a programação de procedimentos, que agrupa as instruções em procedimentos (funções). Isso deu dois grandes benefícios para os programadores.
1. Agrupe as instruções (operações) em blocos separados.
2. É possível reutilizar esses blocos. (Funções)
Mas, acima de tudo, os paradigmas não deram uma solução para o gerenciamento de aplicativos. A programação de procedimentos também pode ser usada apenas para aplicativos de pequena escala. Isso não pode ser usado para desenvolver grandes aplicativos da web (por exemplo: banking, google, youtube, facebook, stackoverflow etc), não pode criar estruturas como android sdk, flutter sdk e muito mais ......
Assim, os engenheiros pesquisam muito mais para gerenciar os programas de maneira adequada.
Finalmente, a Programação Orientada a Objetos vem com todas as soluções para gerenciar aplicativos em qualquer escala (de hello world a Trilhões de pessoas usando a criação de sistemas, por exemplo, google, amazon e hoje 90% dos aplicativos).
Em oop, todos os aplicativos são construídos em torno de Objetos. Significa que o aplicativo é uma coleção desses objetos.
portanto, os objetos são a construção básica para qualquer aplicativo.
classe (objeto em tempo de execução) agrupa dados e funções relacionadas a essas variáveis (dados). assim, o objeto compõe os dados e suas operações relacionadas.
[Aqui, não vou explicar sobre oop]
👉👉👉 Ok, agora vamos para a estrutura de flutter.👈👈👈
-Dart suporta procedimentos e oop Mas, o framework Flutter é completamente construído usando classes (oop). (Porque grande estrutura gerenciável não pode criar usando procedural)
Aqui, vou criar uma lista de razões pelas quais eles usam classes em vez de funções para fazer widgets.👇👇👇
1 - Na maioria das vezes, o método de construção (widget filho) chama o número de funções síncronas e assíncronas.
Ex:
- Para baixar a imagem da rede
- obter entrada do usuário etc.
portanto, o método de construção precisa ser mantido em um widget de classe separado (porque todos os outros métodos chamados pelo método build () podem ser mantidos em uma classe)
2 - Usando a classe widget, você pode criar o número de outra classe sem escrever o mesmo código repetidas vezes (** Use Of Inheritance ** (extends)).
E também usando herança (estender) e polimorfismo (substituir), você pode criar sua própria classe personalizada. (Abaixo o exemplo, lá eu irei personalizar (Substituir) a animação estendendo MaterialPageRoute (porque sua transição padrão eu quero personalizar) .👇
class MyCustomRoute<T> extends MaterialPageRoute<T> {
MyCustomRoute({ WidgetBuilder builder, RouteSettings settings })
: super(builder: builder, settings: settings);
@override //Customize transition
Widget buildTransitions(BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child) {
if (settings.isInitialRoute)
return child;
// Fades between routes. (If you don't want any animation,
// just return child.)
return new FadeTransition(opacity: animation, child: child);
}
}
3 - Funções não podem adicionar condições para seus parâmetros, mas usando o construtor do widget de classe, você pode fazer isso.
Abaixo, exemplo de código👇 (este recurso é muito usado por widgets de framework)
const Scaffold({
Key key,
this.bottomNavigationBar,
this.bottomSheet,
this.backgroundColor,
this.resizeToAvoidBottomPadding,
this.resizeToAvoidBottomInset,
this.primary = true,
this.drawerDragStartBehavior = DragStartBehavior.start,
this.extendBody = false,
this.extendBodyBehindAppBar = false,
this.drawerScrimColor,
this.drawerEdgeDragWidth,
}) : assert(primary != null),
assert(extendBody != null),
assert(extendBodyBehindAppBar != null),
assert(drawerDragStartBehavior != null),
super(key: key);
4 - As funções não podem usar const e o widget Class pode usar const para seus construtores. (que afetam o desempenho do tópico principal)
5 - Você pode criar qualquer número de widgets independentes usando a mesma classe (instâncias de uma classe / objetos). Mas a função não pode criar widgets independentes (instância), mas a reutilização pode.
[cada instância tem sua própria variável de instância e que é completamente independente de outros widgets (objeto), mas a variável local da função depende de cada chamada de função * (o que significa que, quando você altera um valor de uma variável local, ela afeta todas as outras partes do o aplicativo que usa esta função)]
Havia muitas vantagens na aula em relação às funções. (Acima, apenas alguns casos de uso)
🤯 Meu pensamento final
Portanto, não use funções como bloco de construção de seu aplicativo, use-as apenas para fazer operações. Caso contrário, ele causará muitos problemas impossíveis de lidar quando seu aplicativo se tornar escalável .
- Use funções para fazer uma pequena parte da tarefa
- Use a classe como bloco de construção de um aplicativo (gerenciamento de aplicativos)
📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍 📍📍📍📍📍📍📍
VOCÊ NÃO PODE MEDIR A QUALIDADE DO PROGRAMA POR NÚMERO DE DECLARAÇÕES (ou linhas) USO POR ELE
📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍 📍📍📍📍📍📍📍
Obrigado pela leitura