Zum Inhalt springen

Sentinel (Programmierung)

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 5. Januar 2016 um 19:55 Uhr durch Nomen4Omen (Diskussion | Beiträge). Sie kann sich erheblich von der aktuellen Version unterscheiden.
Dieser Artikel wurde am 3. Januar 2016 auf den Seiten der Qualitätssicherung eingetragen. Bitte hilf mit, ihn zu verbessern, und beteilige dich bitte an der Diskussion!
Folgendes muss noch verbessert werden:  Interwikilink ist nicht zielführend, Alternativen siehe QS-Diskussion -- Olaf Studt (Diskussion) 00:08, 4. Jan. 2016 (CET)

Als Sentinel (Aussprache: sentinel/?, engl. für Wächter), Wächter oder Wächterwert (im engeren Sinn) bezeichnet man in der Informatik, dort im Bereich der Programmierung, ein Konstrukt, welches eine Sequenz in einer Weise terminiert, dass die Programmlogik nach einer erfolglosen Inspektion aller echten Fälle (mit unechtem Erfolg) auf das Ergebnis »gefunden« läuft.[1] Wenn so geschehen, wird nachträglich das Ergebnis auf »nicht gefunden« abgeändert.

Damit wird die Anzahl der Abfragen innerhalb der Suchschleife um eine (die Abfrage auf das Ende der Sequenz) verringert auf Kosten geringfügig komplizierterer Erfordernisse und Aktionen außerhalb der Schleife.

Im weiteren Sinn gilt (insbesondere im englischen Sprachraum) jede Form eines Terminators einer Sequenz, so auch das Nullzeichen bei Zeichenketten, als Sentinel.

Beispiel

In den beiden folgenden C-Funktionen Search und SearchWithSentinel soll in einer verketteten Liste vom Typ

// Globale Variable:
struct sll_node {                          // ein Knoten der verketteten Liste
   int key;
   struct sll_node *next;                  // end-of-list-Indikator oder -> nächten Knoten
} sll, *first;

nach einem Schlüsselwert search_key gesucht werden – bei gleichem Suchergebnis.

Version mit NULL

Die Liste sll wird terminiert durch den Nullwert NULL.

// Global:
first = NULL; // vor der ersten Einfügung
// NB: Einfügung nicht gebracht. Sie hat aber für den immer gleichen Terminator zu sorgen.

struct sll_node *Search(struct sll_node *first, int search_key) {
    struct sll_node *node;
    for (node = first; node != NULL; node = node->next) {
        if (node->key == search_key)
            return node;                   // gefunden
    }
    // nicht gefunden
    return NULL;
}

Die for-Schleife enthält pro Schleifenschritt die zwei Abfragen

  1. if (node != NULL) und
  2. if (node->key == search_key).

Version mit Sentinel

Der global zugreifbare Zeiger sentinel zum gezielt präparierten Objekt Sentinel dient als Terminator der Liste sll.

// Globale Variable:
struct sll_node Sentinel, *sentinel = &Sentinel;
// Global:
sentinel->next = sentinel;
first = sentinel; // vor der ersten Einfügung
// NB: Einfügung nicht gebracht.
//     Sie hat aber für den immer gleichen Terminator (hier: Zeigerwert) zu sorgen.

struct sll_node *SearchWithSentinel(struct sll_node *first, int search_key) {
    struct sll_node *node;
    sentinel->key = search_key;        // gezielte Präparation

    for (node = first; node->key != search_key; node = node->next) {
    }
    if (node != sentinel)
        return node;                   // gefunden
    // Nicht gefunden:
    return NULL;
}

Die for-Schleife enthält pro Schleifenschritt nur die eine Abfrage

  1. if (node->key != search_key).

Siehe auch

Einzelnachweise

  1. McConnell, Steve. "Code Complete" Edition 2 Pg. 621 ISBN 0-7356-1967-0