Istniała duża różnica między tym, co robi funkcje, a tym, co robi klasa.
Pozwólcie, że wyjaśnię to od podstaw. (Tylko o imperatyw)
Historia programowania, którą wszyscy znamy, rozpoczęła się od prostych poleceń podstawowych (np. -: Assembly).
Next Strukturalne programowanie przyszło z kontrolkami przepływu (np .-: if, switch, while, for etc) Ten paradygmat daje programistom efektywną kontrolę przepływu programu, a także minimalizuje liczbę linii kodu przez pętle.
Następnie przyszło programowanie proceduralne, które grupuje instrukcje w procedury (funkcje). Dało to dwie główne korzyści dla programistów.
1. Grupuj instrukcje (operacje) w oddzielnych blokach.
2. Potrafi ponownie wykorzystać te bloki. (Funkcje)
Ale przede wszystkim paradygmaty nie dawały rozwiązania do zarządzania aplikacjami. Programowanie proceduralne może być również używane tylko w aplikacjach na małą skalę. Nie można tego używać do tworzenia dużych aplikacji internetowych (np.: Bankowość, Google, youtube, facebook, stackoverflow itp.), Nie można tworzyć frameworków, takich jak android sdk, flutter sdk i wiele więcej ......
Dlatego inżynierowie przeprowadzają znacznie więcej badań, aby właściwie zarządzać programami.
Wreszcie programowanie obiektowe zawiera całe rozwiązanie do zarządzania aplikacjami w dowolnej skali (od hello world do bilionów ludzi korzystających z tworzenia systemów, np.-Google, amazon, a dziś 90% aplikacji).
W oop wszystkie aplikacje są zbudowane wokół obiektów, co oznacza, że aplikacja jest zbiorem tych obiektów.
więc obiekty są podstawowym budynkiem dla każdej aplikacji.
class (obiekt w czasie wykonywania) grupuje dane i funkcje związane z tymi zmiennymi (dane). więc obiekt składa się z danych i powiązanych z nimi operacji.
[Tutaj nie mam zamiaru wyjaśniać oop]
👉👉👉Ok Now Lets come for flutter framework.
-Dart obsługuje zarówno procedury, jak i oop Ale framework Flutter jest całkowicie zbudowany przy użyciu klas (oop). (Ponieważ duże, łatwe w zarządzaniu ramy nie mogą tworzyć przy użyciu procedur)
Tutaj utworzę listę powodów, dla których używają klas zamiast funkcji do tworzenia widżetów
1 - W większości przypadków metoda budowania (widget potomny) wywołuje numer funkcji synchronicznej i asynchronicznej.
Dawny:
- Aby pobrać obraz sieciowy
- uzyskać dane wejściowe od użytkownika itp.
więc metoda budowania musi być przechowywana w osobnym widżecie klasy (ponieważ wszystkie inne metody wywoływane przez metodę build () mogą przechowywać się w jednej klasie)
2 - Korzystając z klasy widżetu możesz utworzyć numer innej klasy bez ponownego pisania tego samego kodu (** Use Of Inheritance ** (extends)).
A także używając dziedziczenia (rozszerzanie) i polimorfizmu (nadpisywanie) możesz stworzyć własną klasę niestandardową. (Przykład poniżej, w tym miejscu dostosuję (Zastąp) animację, rozszerzając MaterialPageRoute (ponieważ domyślne przejście chcę dostosować).
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 - Funkcje nie mogą dodawać warunków do swoich parametrów, ale możesz to zrobić za pomocą konstruktora widżetu klasy.
Poniżej przykład kodu👇 (ta funkcja jest intensywnie używana przez widżety frameworka)
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 - Funkcje nie mogą używać stałej, a widżet klasy może używać stałej dla swoich konstruktorów. (które wpływają na wydajność głównego wątku)
5 - Możesz utworzyć dowolną liczbę niezależnych widżetów przy użyciu tej samej klasy (instancji klasy / obiektów), ale funkcja nie może tworzyć niezależnych widżetów (instancji), ale może to zrobić ponownie.
[każda instancja ma własną zmienną instancji, która jest całkowicie niezależna od innych widżetów (obiektów), ale zmienna lokalna funkcji jest zależna od każdego wywołania funkcji * (co oznacza, że zmiana wartości zmiennej lokalnej wpływa na wszystkie inne części aplikacja korzystająca z tej funkcji)]
Klasa miała wiele zalet w porównaniu z funkcjami ... (powyżej podano tylko kilka przypadków użycia)
🤯 Moja ostatnia myśl
Dlatego nie używaj funkcji jako elementu konstrukcyjnego aplikacji, używaj ich tylko do wykonywania operacji. W przeciwnym razie, gdy aplikacja stanie się skalowalna, spowoduje wiele nieporęcznych problemów .
- Użyj funkcji do wykonania niewielkiej części zadania
- Użyj klasy jako elementu składowego aplikacji (zarządzanie aplikacją)
📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍 📍📍📍📍📍📍📍
NIE MOŻESZ ZMIERZYĆ JAKOŚCI PROGRAMU WEDŁUG LICZBY WYRAŻEŃ (lub LINII).
📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍 📍📍📍📍📍📍📍
Dziękuje za przeczytanie