2017-01-15 2 views
1

unterstützt Ich habe eine Schnittstelle, die es nennen wir IOperation mit der einzigen MethodeException werfen in Interface-Implementierung, wenn Methodenargumente sind nur teilweise

void Operate(TimeSpan time); 

Einer meiner Implementierungen ist nur auf Hardware-Einschränkungen aufgrund der Lage voll Millisekunden Handling zwischen 4 ms und 1000 ms.

1) Sollte ich eine Ausnahme auslösen, wenn jemand die Methode mit einer Zeit von weniger als 4 oder mehr als 1000 aufruft? Wenn ja, ist ein NotSupportedException oder ein ArgumentOutOfRangeException besser? Alternativ runden Sie bis zu 4 oder bis zu 1000 ab, wenn das Argument nicht passt.

2) Wenn die Zeit zwischen 4 und 1000 ist, aber die Eigenschaft TotalMilliseconds bruchstückhaft ist, ist es in Ordnung, auf volle Millisekunden zu runden? Oder eine Ausnahme auslösen?

Meine Lieblingsweise wäre, in beide Situationen eine NotSupportedException zu werfen, weil nach der Schnittstelle die Argumente nicht ungültig sind und daher eine ArgumentOutOfRangeException scheint nicht imho passen.

Darüber hinaus scheint interne Rundung irgendwie den Anrufer zu überstimmen, ohne ihn zu informieren. Auf der anderen Seite fühle ich mich schlecht über die nicht vollständig Erfüllung der Schnittstelle Vertrag, wie sollte der Anrufer auf meine NotSupportedExceptions reagieren, da Schnittstellen gibt es Vertrauen zu dem Anrufer die Methoden sind nach Vertrag implementiert

Antwort

1
  1. Runde bis zu 4 oder bis zu 1000, wenn Argument nicht passt - Sie sollten es nicht tun. Ihr Kunde erwartet, dass er während, sagen wir, eine Minute, aber mit einem solchen Ansatz wird er Operate nur eine Sekunde. Wenn Sie den Vertrag nicht einhalten können, sollten Sie mindestens clear about that sein, da sich das System sonst möglicherweise unerwartet verhält.
  2. Wenn die Zeit zwischen 4 und 1000 ist, aber die TotalMilliseconds -Eigenschaft ist Bruch, ist es OK, nur auf volle Millisekunden zu runden? - es kommt darauf an. Stimmen Sie zu, dass der wahrscheinlichste Verlust oder die Addition von beispielsweise einer halben Millisekunde für die meisten Systeme nicht kritisch ist, aber andererseits theoretisch in einigen Fällen verwendet werden kann, in denen jede Nanosekunde von Bedeutung ist.
  3. NotSupportedException oder ArgumentOutOfRangeException
    • ArgumentOutOfRangeException - das Client unter der Annahme, kann nicht überprüfen, was für diesen Parameter ein gültiger Wert ist, wird es eine Verletzung der Liskov Substitution Principle sein. Wenn Sie jedoch eine zusätzliche Methode wie bool IsValid(TimeSpan) angeben, wird diese Problematik nicht angewendet, da diese Schnittstelle annimmt, dass der Client den Parameter mit IsValid überprüft.
    • - says "Die Ausnahme, die ausgelöst wird, wenn eine aufgerufene Methode nicht unterstützt wird oder wenn versucht wird, einen Stream zu lesen, zu suchen oder zu schreiben, der die aufgerufene Funktion nicht unterstützt". Es scheint eine perfekte Lösung für Fälle zu sein, in denen eine bestimmte Operation aufgrund von Implementierungseinschränkungen nicht durchgeführt werden kann. Fälle wie dieser. Ich empfehle nur very specific about the issue(error message) in der Ausnahme. Sie können sogar ArgumentOutOfRangeException als NotSupportedExceptionInnerException verwenden, um das Beste aus beiden Ausnahmetypen zu erhalten.
+0

Vielen Dank für Ihre Meinungen und die hilfreiche Links. Ich entschied mich, eine "NotSupportedException" in Fall 1 und Fall 2 zu werfen, um den Client nicht zu dominieren. Ich gab ihm eine bedeutungsvolle Nachricht. – Creepin

0

Sie sollten Schnittstelle Trennung implementieren Prinzip, basierend auf dem Hardwaresystem.

0

1) Eine solche Rundung nach oben oder unten leicht zu unvorhersehbarem Verhalten führen könnte. Sie würden jetzt mit diesem Nebeneffekt vertraut sein, Sie könnten sogar einige Informationen darüber in der Methodenbeschreibung schreiben, aber das reduziert die Lesbarkeit des Codes, jemand, der diesen Code vielleicht in Zukunft verwenden würde, könnte überrascht sein, dass das von ihm bereitgestellte Argument vollständig geändert wurde . Versuchen Sie solche Nebenwirkungen zu vermeiden, wann immer es nicht notwendig ist.

2) Es hängt von der Situation ab, aber in den meisten Fällen wäre eine solche Rundung in Ordnung. Die Lösung bestimmter Methoden mit sehr kurzen Zeiträumen muss berücksichtigt werden. Beachten Sie, dass z.B. .NET

DateTime.Now 

hat systemspezifische Auflösung und meistens ist es nicht weniger als 10ms.

+0

Danke für den Hinweis auf das 'DateTime.Now' Verhalten! – Creepin

Verwandte Themen