namespace cpp {}

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


lernen:minikurs:struktur

minikurs(9): Daten bündeln

The upper limit for an understandable number of parameters is about 7. This routine has 11.
  bResult = CreateProcessAsUser(
    hToken, NULL, lpCommandLine, NULL, NULL, FALSE,             
    NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); 

Diese Anweisung dokumentiert eine (leider) übliche Programmierpraxis (Microsoft Developers' Network, alle Kommentare gelöscht). Was ist daran falsch?

  • Nur Eingeweihte wissen, warum genau soviele Werte und an welcher Stelle diese stehen müssen.
  • Jeder Aufruf einer solchen Funktion erfordert Nachschlagen in der Programmierdokumentation.
  • Auch nichtsnutzige Dinge wie NULL müssen angegeben werden. Der Unfug macht etwa die Hälfte aller Angaben aus.

Wie transportierst Du ein Kilogramm Tomaten, einen Haufen Kartoffeln, Deinen Wochenendeinkauf? Etwa auch jede Kartoffel einzeln? Wir benötigen dringend einen Beutel, eine Kiste oder einen Einkaufswagen für den ganzen Ramsch.

Zusammenfassen

Datensätze (records) vereinen zusammengehörende Daten, die nicht alle denselben Typ haben müssen. Die Inhalte eines Datensatzes (struct in C und C++) lesen sich wie ein Teil des Datenkatalogs. Tatsächlich sind sie das auch.

parkplatz.h
//: parkplatz.h : Autos und Zweiraeder - R.Richter 2007-01-13
/////////////////////////////////////////////////////////////
 
#ifndef PARKPLATZ_H
#define PARKPLATZ_H
 
struct Parkplatz
{
  int fahrzeuge;
  int reifen;
};
 
int autos (Parkplatz p);
int mopeds(Parkplatz p);
 
#endif // PARKPLATZ_H

Weil die neuen, zusammengesetzten Typen in mehreren Quelltextabschnitten auftauchen, werden sie im Header mit den verarbeitenden Funktionen angegeben. Die Parameterliste wird umso kürzer, je mehr Angaben sinnvoll zusammengefasst werden können.

Beachte, wie auf die Teilangaben des Parkplatzes p zugegriffen wird:

parkplatz.cpp
//: parkplatz.cpp : Autos und Zweiraeder - R.Richter 2007-01-13
////////////////////////////////////////////////////////////////
 
#include "parkplatz.h"
 
int autos (Parkplatz p)
{
  return p.fahrzeuge - mopeds(p);
}
 
int mopeds(Parkplatz p)
{
  return (4*p.fahrzeuge - p.reifen) / 2;
}

Das Hauptprogramm löst sich von den Grunddatentypen:

parkplatz7.cpp
//: parkplatz7.cpp : Autos und Zweiraeder - R.Richter 2007-01-13
////////////////////////////////////////////////////////////////
 
#include <iostream>
#include "parkplatz.h"
 
int main()
{
  Parkplatz p;
 
  std::cout << "Fahrzeuge: ";
  std::cin >> p.fahrzeuge;
 
  std::cout << "Reifen: ";
  std::cin >> p.reifen;
 
  std::cout << "Autos: "       << autos (p) << '\n'; 
  std::cout << "Motorraeder: " << mopeds(p) << '\n'; 
 
  return 0;
}

Mit einer einzigen Variable werden alle zugehörigen Datenwerte angelegt. Übungsaufgabe: Erprobe, wie mehrere Parkplätze in einem Programm angelegt werden können.

Um nahe an den Fachbegriffen des Problembereichs programmieren zu können, braucht es geeignete Datentypen. In C++ programmieren heißt, sich die Datentypen zu schaffen, die zur Beschreibung des Aufgabenbereichs notwendig sind. Die wenigen Grundtypen reichen aus, um beliebig komplexe Datenstrukturen zu schaffen.

Bereit zum Abheben? Angsthasen sollten hier abbremsen. Wir haben den Entscheidungspunkt auf der Startbahn erreicht. Mit zunehmender Höhe treten die Grunddatentypen in den Hintergrund. Ab jetzt verlassen wir die Ebene der C-Programmierung und wenden Techniken von C++ an. Fahrwerk einziehen.

Umordnen

Aus der Vogelperspektive sieht die Welt ganz anders aus… Bis hier gab es Daten und Funktionen nebeneinander. Aus der Ferne gesehen, in der objektorientierten Programmierweise, verschmelzen Daten und die ihnen zugeordneten Funktionen zu einer Einheit.

parkplatz.h
//: parkplatz.h : Autos und Zweiraeder - R.Richter 2007-01-13
/////////////////////////////////////////////////////////////
 
#ifndef PARKPLATZ_H
#ifndef PARKPLATZ_H
 
struct Parkplatz
{
  int fahrzeuge;
  int reifen;
 
  int autos ();
  int mopeds();
};
 
#endif // PARKPLATZ_H

Die Funktionen sind nun in die Datenstruktur integriert. Parameter sind hier unnötig, denn alle Daten sind in der Struktur zusammengefasst. Funktionen, nun Methoden (engl. member function) genannt, können direkt damit arbeiten.

parkplatz.cpp
//: parkplatz.cpp : Autos und Zweiraeder - R.Richter 2007-01-13
///////////////////////////////////////////////////////////////
 
#include "parkplatz.h"
 
int Parkplatz::autos ()
{
  return fahrzeuge - mopeds();
}
 
int Parkplatz::mopeds()
{
  return (4*fahrzeuge - reifen) / 2;
}

Im Hauptprogramm werden Methoden und Daten in gleicher Weise als objekt.komponente angesprochen:

parkplatz8.cpp
//: parkplatz8.cpp : Autos und Zweiraeder - R.Richter 2007-01-13
////////////////////////////////////////////////////////////////
 
#include <iostream>
#include "parkplatz.h"
 
int main()
{
  Parkplatz p;
 
  std::cout << "Fahrzeuge: ";
  std::cin >> p.fahrzeuge;
 
  std::cout << "Reifen: ";
  std::cin >> p.reifen;
 
  std::cout << "Autos: "       << p.autos () << '\n'; 
  std::cout << "Motorraeder: " << p.mopeds() << '\n'; 
 
  return 0;
}

Dahinter steckt eine ganz andere (neue?) Denkweise. Statt eine Funktion auf passive Daten anzuwenden, wird das Objekt aufgefordert, die notwendigen Aktionen auszuführen und die Antwort zu liefern. Manche sprechen davon, dass eine "Botschaft" an das Objekt gesendet wird und das Objekt dann selbst "weiß", wie es auf diese "Nachricht" reagieren muss. Nun, das ist sehr blumig. Richtig ist, dass die Methoden der Objekte einen großen Teil der zu erledigenden Arbeit übernehmen können und dazu nur angestoßen werden müssen. Bevor du weiterblätterst, eine wichtige Frage: Welche Aufgaben könnten die Parkplatzobjekte noch übernehmen?

Weiter: Teil 10.

1)
Steve McConnell: Code complete. Microsoft Press, Redmond WA (1993) S. 73
lernen/minikurs/struktur.txt · Zuletzt geändert: 2014-07-13 16:15 von 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki