Entwurfsmuster für dynamisches C # -Objekt

8

Ich habe eine Warteschlange, die Objekte in einer while-Schleife verarbeitet. Sie werden irgendwo asynchron hinzugefügt .. so:

%Vor%

Und sie werden so verarbeitet:

%Vor%

Nun möchte ich das ändern, um ein TTL-ähnliches (time to live) Flag zu unterstützen, so dass der Dateipfad mehr als n mal hinzugefügt wird.

Wie kann ich das tun, während ich die bool process(String path) -Funktionssignatur beibehalte? Ich möchte das nicht ändern.

Ich dachte darüber nach, eine Map zu halten oder eine Liste, die zählt, wie oft die Prozessfunktion für einen Pfad false zurückgegeben hat und den Pfad bei der n-ten Rückgabe von false aus der Liste gelöscht hat. Ich frage mich, wie dies dynamischer durchgeführt werden kann, und vorzugsweise möchte ich, dass sich die TTL automatisch bei jeder neuen Erweiterung des Prozesses dekrementiert. Ich hoffe, ich spreche nicht Müll. Vielleicht mit etwas wie diesem

%Vor%     
AlexandruC 21.06.2013, 13:12
quelle

3 Antworten

2

Ich mag die Idee einer JobData-Klasse, aber es gibt bereits eine Antwort, die das demonstriert, und die Tatsache, dass Sie mit Dateipfaden arbeiten, gibt Ihnen einen weiteren möglichen Vorteil. Bestimmte Zeichen sind in Dateipfaden nicht gültig, und Sie können daher einen als Trennzeichen verwenden. Der Vorteil hierbei ist, dass der Warteschlangentyp eine Zeichenfolge bleibt und Sie daher keinen der vorhandenen asynchronen Codes ändern müssen. Sie können hier eine Liste reservierter Pfadzeichen sehen:

  

Ссылка

Für unsere Zwecke verwende ich das Prozentzeichen (%). Dann können Sie Ihren Code wie folgt ändern, und nichts anderes muss geändert werden:

%Vor%

Wiederum, vom Standpunkt der reinen Architektur aus betrachtet, ist eine Klasse mit zwei Eigenschaften ein besseres Design ... aber aus praktischer Sicht ist YAGNI : Diese Option bedeutet, dass Sie vermeiden können, anderen asynchronen Code, der in die Warteschlange eindringt, zu ändern. Dieser Code muss immer noch nur die Strings kennen und arbeitet mit diesem unmodifiziert.

Noch eine Sache. Ich möchte darauf hinweisen, dass dies eine ziemlich enge Schleife ist, die dazu neigt, mit einem CPU-Kern wegzulaufen. Wenn dies der Warteschlangentyp ".Net" ist und Ihre Tight-Schleife vor Ihren asynchronen Produktionen steht, um die Warteschlange zu leeren, werden Sie eine Ausnahme auslösen, die aus dem While-Block (true) ausbrechen würde. Sie können beide Probleme mit Code wie folgt lösen:

%Vor%     
Joel Coehoorn 21.06.2013, 14:18
quelle
2

Wenn die Einschränkung ist, dass bool process(String path) nicht berührt / geändert werden kann, dann setze die Funktionalität in myqueue . Sie können die öffentlichen Signaturen von void pushback(string path) und string pop() beibehalten, aber intern können Sie Ihre TTL verfolgen. Sie können die Zeichenfolgenpfade entweder in eine JobData -like-Klasse einschließen, die zur internen Warteschlange hinzugefügt wird, oder Sie können eine sekundäre Dictionary -Verschlüsselung nach Pfad angeben. Vielleicht sogar so einfach wie das Speichern des letzten pop ed-Pfads und wenn der nachfolgende push derselbe Pfad ist, können Sie davon ausgehen, dass es sich um ein zurückgewiesenes / fehlgeschlagenes Element handelt. Außerdem können Sie in Ihrer pop -Methode sogar einen Pfad löschen, der zu oft abgelehnt wurde, und intern den nächsten Pfad abrufen, sodass der aufrufende Code sich des Problems nicht bewusst ist.

    
tcarvin 21.06.2013 14:44
quelle
1

Sie könnten die Funktionalität des "Job-Managers" abstrahieren / einkapseln. Blenden Sie die Warteschlange und die Implementierung vor dem Anrufer aus, damit Sie tun können, was immer Sie möchten, ohne dass die Anrufer sich darum kümmern. Etwas wie das:

%Vor%

Dann kann Ihre Verarbeitungsschleife den TTL-Wert verarbeiten.

Bearbeiten - Eine einfache Verarbeitungsschleife hinzugefügt. Dieser Code ist nicht Thread-sicher, aber sollte Ihnen hoffentlich eine Idee geben.

    
Jason P 21.06.2013 13:23
quelle

Tags und Links