Verfasst von: bletra | 6. Mai 2011

WPF: Von Spaghetticode zu MVVM – Teil 1 von 9

In dieser Artikelserie möchte ich eine einfache Applikation, in eine testbare Applikation nach dem MVVM-Pattern umwandeln:

  1. Beispielapplikation mit Spaghetticode
  2. Refactoring 1: Model
  3. MVC, MVP, Presentation Model
  4. MVVM
  5. ICommand
  6. Binding
  7. Refactoring 2: ViewModel
  8. Refactoring 3: View
  9. Zusammenfassung

Beispielapplikation mit Spaghetticode

Für den Blog und die Vorlesung habe ich die Applikation, wie sie in http://www.wintellect.com/CS/files/folders/sample_files/entry18694.aspx dargestellt ist, noch einmal vereinfacht: Adressen für Blog-Feeds können einer Liste hinzugefügt werden. Beim Hinzufügen werden Informationen über den Blog ausgelesen. Die Liste kann gespeichert werden und wird bei Applikationsstart geladen.

Bei Ein-Personen-Projekten ist man versucht, die Applikation schnell zusammenzuklicken und quick&dirty zu implementieren. VB6, WinForm, Asp.Net und auch WPF verführen einen auch dazu. Man ist produktiv und hat schnell eine lauffähige Version, die man immer und immer wieder startet, bis es irgendwann alles so läuft, wie gewollt. Für eine kleine Applikation (wie sie hier exemplarisch betrachtet wird) oder zum Hobby ist dies auch ausreichend und führt in etwa zum Code, wie er im folgenden Listing abgebildet ist.

public partial class MainWindow : Window
{
    private Dictionary _feeds;
    private const string REPOSITORY_FILENAME = "feeds.dat";
    public MainWindow()
    {
        InitializeComponent();
        LoadFeeds();
    }

private void btnAddFeed_Click(object sender, RoutedEventArgs e)
{
    this.Cursor = Cursors.Wait;
    Uri feedUri;
    Uri.TryCreate(txtFeedAddress.Text, UriKind.Absolute, out feedUri);
    if (feedUri != null)
    {
        WebClient request = new WebClient();
        string xml = request.DownloadString(feedUri);

        if (xml.Length != 0)
        {

            StringReader stringReader = new StringReader(xml);
            XmlReader reader = XmlReader.Create(stringReader);
            SyndicationFeed feed = SyndicationFeed.Load(reader);
            if (feed != null)
            {
                if (!_feeds.ContainsKey(feed.Title.Text))
                {

                    _feeds.Add(feed.Title.Text, txtFeedAddress.Text);
                    txtFeedAddress.Text = string.Empty;
                    lbFeeds.Items.Refresh();
                }
            }
        }
    }
    this.Cursor = Cursors.Arrow;
}

    private void btnSave_Click(object sender, RoutedEventArgs e)
    {
        FileStream writeStream = new FileStream(REPOSITORY_FILENAME, FileMode.Create);
        BinaryFormatter serializer = new BinaryFormatter();
        serializer.Serialize(writeStream, _feeds);
        writeStream.Close();
    }
    private void LoadFeeds()
    {
        FileStream readStream = new FileStream(REPOSITORY_FILENAME, FileMode.Open);
        BinaryFormatter serializer = new BinaryFormatter();
        _feeds = serializer.Deserialize(readStream) as Dictionary;
        readStream.Close();
        lbFeeds.ItemsSource = _feeds;
    }
}

Dieser Code ist übersichtlich und somit leicht verständlich, erfordert keine besonderen Kenntnisse und Abstraktion.

Aber: Wiederverwendung ist nicht möglich und Weiterentwicklung ohne Refactoring führt zwangsweise zu Spaghetticode.

Applikationen, die bei einem Kunden ausgeliefert werden, dürfen so nicht entwickelt werden. Der Aufwand und damit die Kosten eines Produkts liegen großteils in der Wartung und Weiterentwicklung einer Applikation, ca. 70% der Kosten entstehen erst nach dem ersten Roll-Out. Diese Zahl macht deutlich, wir brauchen wartungsfreundliche Software. Außerdem werden erfolgreiche Desktopapplikationen häufig auch im Web gewünscht. Um hier eine Parallelentwicklung und damit die Wartung von zwei Produktlinien zu optimieren, muss die Applikation modular und damit wiederverwendbar aufgebaut werden.

Als ersten Refactoring-Schritt drängt sich die Kapselung eines Models auf: Die Kernfunktionalität, das Speichern, Laden der Feed-Liste und das Laden eines Feeds können einfach ausgelagert werden. Wie dies gemacht wird, erläutere ich im nächsten Artikel.

Advertisements

Responses

  1. […] Beispielapplikation mit Spaghetticode […]

  2. Kannst du auch ein WPF-Beispiel zum Download anbitten?


Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Kategorien

%d Bloggern gefällt das: