Zum Inhalt springen

Widget-Design

Wählen Sie jede Designoption aus, die die folgende Anforderung erfüllt:

Anforderung: Der API-Client soll ein einzelnes WidgetImpl-Enum bereitstellen, das alle möglichen Widgets repräsentiert, und das Widget-Trait für WidgetImpl implementieren.

Wenn wir alle möglichen Widgets als ein einzelnes Enum darstellen, wie folgt:

enum WidgetImpl {
Button { /* .. */ },
Text { /* .. */ },
// ..
}
impl Widget for WidgetImpl { /* .. */ }

Dann haben wir ein „geschlossenes System“, in dem es eine nicht erweiterbare Menge möglicher Widgets gibt. Es gibt nur eine Implementierung von Widget und keine Notwendigkeit für dynamische Dispatch. Daher ist nur Option 1 sinnvoll, da render immer nur andere WidgetImpl-Typen zurückgeben würde. Alle anderen Designs enthalten unter dieser Anforderung unnötige Komplexität.


Wählen Sie jede Designoption aus, die die folgende Anforderung erfüllt:

Anforderung: Der API-Client soll für jedes mögliche Widget eine eindeutige Struktur bereitstellen und das Widget-Trait für jede Struktur implementieren. Jedes Widget kann einen Vektor zurückgeben, der Widgets beliebigen Typs enthält.

Im Gegensatz zur vorherigen Frage erwarten wir nun, dass für jedes Widget ein eigener Typ existiert, wie zum Beispiel:

struct Button { /* .. */ }
impl Widget for Button { /* .. */ }
struct Text { /* .. */ }
impl Widget for Text { /* .. */ }

Daher muss ein Vektor von Widgets heterogen sein, d.h. er könnte Widgets unterschiedlicher Typen enthalten. Die Optionen 1, 2 und 3 beschränken jede Widget::render-Implementierung darauf, einen Vektor eines einzelnen Widget-Typs zurückzugeben. Die Optionen 4 und 5 verwenden dynamische Dispatch über Trait-Objekte, um heterogene Widget-Vektoren zu ermöglichen.


Wählen Sie jede Designoption aus, die die folgende Anforderung erfüllt:

Anforderung: Nur Typen, die das Widget-Trait implementieren, sollen von render zurückgegeben werden.

Das Widget-Trait in Option 2 erzwingt nicht, dass Children: Widget ist. Alle anderen Optionen stellen sicher, dass ein Vec<W> für ein W zurückgegeben wird, wobei W: Widget ist.