Es gab einen großen Unterschied zwischen den Funktionen und der Klasse.
Lassen Sie es uns von Grund auf erklären. « (Nur über Imperativ)
Wir alle wissen, dass die Programmierhistorie mit einfachen Grundbefehlen begann (zB: Assembly).
Die nächste strukturierte Programmierung wurde mit Flusssteuerungen geliefert (z. B. if, switch, while, for usw.). Dieses Paradigma gibt Programmierern die Möglichkeit, den Programmfluss effektiv zu steuern und die Anzahl der Codezeilen durch Schleifen zu minimieren.
Als nächstes kam die prozedurale Programmierung, die Anweisungen in Prozeduren (Funktionen) gruppiert. Dies gab zwei Hauptvorteile für Programmierer.
1.Gruppenanweisungen (Operationen) in separate Blöcke.
2.Kann diese Blöcke wiederverwenden. (Funktionen)
Vor allem aber Paradigmen nicht geben , eine Lösung für Anwendungen verwalten. Die prozedurale Programmierung kann auch nur für kleine Anwendungen verwendet werden. Dies kann nicht für die Entwicklung großer Webanwendungen (z. B. Banking, Google, Youtube, Facebook, Stackoverflow usw.) verwendet werden. Es können keine Frameworks wie Android SDK, Flutter SDK und vieles mehr erstellt werden.
Daher recherchieren die Ingenieure viel mehr, um Programme ordnungsgemäß zu verwalten.
Schließlich bietet die objektorientierte Programmierung die gesamte Lösung für die Verwaltung von Anwendungen in jeder Größenordnung (von der Hallo-Welt bis zu Billionen von Menschen, die die Systemerstellung verwenden, z. B. Google, Amazon und heute 90% der Anwendungen).
In oop werden alle Anwendungen um Objekte herum erstellt. Dies bedeutet, dass die Anwendung eine Sammlung dieser Objekte ist.
Objekte sind also das Grundgebäude für jede Anwendung.
Gruppendaten und Funktionen der Klasse (Objekt zur Laufzeit) in Bezug auf diese Variablen (Daten). Objekt besteht also aus Daten und den damit verbundenen Operationen.
[Hier werde ich nicht über oop erklären]
»Okay, jetzt kommen wir zum Flattern.«
-Dart unterstützt sowohl prozedurale als auch oop-Funktionen. Das Flutter-Framework wird jedoch vollständig mithilfe von Klassen (oop) erstellt. (Weil ein großes verwaltbares Framework nicht mithilfe von Prozeduren erstellt werden kann.)
Hier werde ich eine Liste der Gründe erstellen, warum sie Klassen anstelle von Funktionen zum Erstellen von Widgets verwenden
1 - In den meisten Fällen ruft die Build-Methode (untergeordnetes Widget) die Anzahl der synchronen und asynchronen Funktionen auf.
Ex:
- Netzwerkbild herunterladen
- Eingaben vom Benutzer usw. erhalten
Daher muss die Build-Methode in einem separaten Klassen-Widget gespeichert werden (da alle anderen Methoden, die von der build () -Methode aufgerufen werden, in einer Klasse gespeichert werden können).
2 - Mit der Widget-Klasse können Sie die Nummer einer anderen Klasse erstellen, ohne immer wieder denselben Code zu schreiben (** Verwendung der Vererbung ** (erweitert)).
Mit Vererbung (Erweitern) und Polymorphismus (Überschreiben) können Sie auch eine eigene benutzerdefinierte Klasse erstellen. (Unten im Beispiel: Dort werde ich die Animation anpassen (überschreiben), indem ich MaterialPageRoute erweitere (weil ich den Standardübergang anpassen möchte) .👇
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 - Funktionen können keine Bedingungen für ihre Parameter hinzufügen, aber mit dem Konstruktor des Klassen-Widgets können Sie dies tun.
Unten Codebeispiel👇 (diese Funktion wird häufig von Framework-Widgets verwendet)
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 - Funktionen können const nicht verwenden und das Klassen-Widget kann die const für ihre Konstruktoren verwenden. (die die Leistung des Hauptthreads beeinflussen)
5 - Sie können eine beliebige Anzahl unabhängiger Widgets mit derselben Klasse (Instanzen einer Klasse / von Objekten) erstellen. Die Funktion kann jedoch keine unabhängigen Widgets (Instanz) erstellen, sondern wiederverwenden.
[Jede Instanz hat ihre eigene Instanzvariable und diese ist völlig unabhängig von anderen Widgets (Objekt). Die lokale Variable der Funktion hängt jedoch von jedem Funktionsaufruf ab * (dh wenn Sie einen Wert einer lokalen Variablen ändern, wirkt sich dies auf alle anderen Teile von aus die Anwendung, die diese Funktion verwendet)]
Es gab viele Vorteile in der Klasse gegenüber Funktionen. (Oben sind nur einige Anwendungsfälle aufgeführt.)
🤯 Mein letzter Gedanke
Verwenden Sie Funktionen also nicht als Baustein Ihrer Anwendung, sondern nur für Operationen. Andernfalls verursacht es viele nicht handhabbare Probleme, wenn Ihre Anwendung skalierbar wird .
- Verwenden Sie Funktionen, um einen kleinen Teil der Aufgabe zu erledigen
- Klasse als Baustein einer Anwendung verwenden (Anwendung verwalten)
📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍 📍📍📍📍📍📍📍
Sie können die Qualität des Programms nicht anhand der Anzahl der von ihm verwendeten Aussagen (oder Zeilen) messen
📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍📍 📍📍📍📍📍📍📍
Danke fürs Lesen