Använd vänsterpil och högerpil för att navigera
Eller Ctrl+P för att skriva ut till PDF (eller på papper)
Föreläsning 19
Egna abstraktioner
Problem med Windows Forms
- Mycket kod
- Återkommande mönster
Lösningen
- Egna abstraktioner
- Abstraktion: generalisering av flera konkreta exempel
- I verkligheten: "hus", "maträtt", "flagga"
- I programmering: metoder, klasser
- När nånting är långt och repetitivt, skapa en egen abstraktion!
- Nyckeln till att hantera stora (eller ens mellanstora) program
Flagga
- Trikolor
- Tre lodräta eller vågräta streck
- Vanligaste typen av flagga
- 30 % av alla flaggor
- En abstraktion skulle vara smidigt!
Design av abstraktionen
- Vad är gemensamt?
- Tre streck
- Samma storlek på samtliga
- Vad skiljer sig?
Förenklad variant #1
Metod som ritar ut Belgiens flagga
Förenklad variant #2
Metod som ritar ut lodrät trikolor
Fullständiga varianten
Metod som ritar ut vågrät eller lodrät trikolor
Fler abstraktioner
- Nordisk flagga
- Tabell med etiketter och kontroller
- Inläsning från konsolen med feltolerans
- Lista med föremål och sortering/filtrering
- ...
Varför egna abstraktioner?
- Mindre kod
- Lättare att ändra
- Uttrycker avsikt tydligare
Risker med abstraktioner
- Tvingar in saker i mallar
- Oförutsedda effekter av ändringar
- Koden kan bli för abstrakt
Hur ska metoden interagera med resten av koden?
- Returvärde
- Anropa metoder på instansvariabler
- Anropa metoder på argument
- Anropa globala metoder
Returvärde
- private TableLayoutPanel CreateFlag(...) {
- TableLayoutPanel flag = new TableLayoutPanel {
- ...
- };
- ...
- return flag;
- }
- public MyForm() {
- TableLayoutPanel flag = CreateFlag(...);
- Controls.Add(flag);
- }
Anropa metoder på instansvariabler
- private void CreateFlag(...) {
- TableLayoutPanel flag = new TableLayoutPanel {
- ...
- };
- ...
- Controls.Add(flag);
- }
Anropa metoder på argument
- private void CreateFlag(Control container, ...) {
- TableLayoutPanel flag = new TableLayoutPanel {
- ...
- };
- ...
- container.Controls.Add(flag);
- }
- public MyForm() {
- TableLayoutPanel layout = new TableLayoutPanel {
- ...
- };
- Controls.Add(layout);
- CreateFlag(layout, ...);
- }
Anropa globala metoder
- private void DisplayInfo(...) {
- ...
- MessageBox.Show(...);
- }
- public MyForm() {
- ...
- DisplayInfo(...);
- }