2013-11-25 12 views
6

redundanten Code zu reduzieren, habe ich einige Methoden throw Helfer:Gedanken zu werfen Helfer

protected static X ThrowInvalidOperation(string operation, X a, X b) { 
    throw new InvalidOperationException("Invalid operation: " + a.type.ToString() + " " + operation + " " + b.type.ToString()); 
} 

Verbrauch:

public static X operator +(X a, X b) { 
     if (...) { 
      return new X(...); 
     } 
     return ThrowInvalidOperation("+", a, b); 
    } 

Problem: Da der Betreiber + muss immer einen Wert zurückgeben, ich behebt dies, indem ThrowInvalidOperation einen Wert zurückgibt und es mit returnThrowInvalidOperation("+", a, b);

aufrufen

Es gibt viele Nachteile - eine ist, weil ich es nicht von einer Methode aufrufen kann, die einen anderen Typ zurückgibt.
Ich wünschte, es gibt dort eine Möglichkeit, die Hilfsfunktion zu markieren "wirft immer eine Ausnahme", so dass der Compiler die Rückgabewerte nicht mehr verfolgt.

Frage: Welche Möglichkeiten habe ich, damit dies funktioniert?

+1

Haben Sie in Betracht gezogen, die Exception im Helper zu erstellen, während Sie sie in die Operatorimplementierung werfen? Z.B. 'throw NewInvalidOperationException (...);' – Caramiriel

Antwort

6

Sprechen Sie die Ausnahme:

protected static Exception MakeInvalidOperation(string operation, X a, X b) 
{ 
    return new InvalidOperationException(
     "Invalid operation: " + a.type + " " + operation + " " + b.type); 
} 

es dann werfen:

throw MakeInvalidOperation("+", a, b); 

Sie in guter Gesellschaft:

// Type: Microsoft.Internal.Web.Utils.ExceptionHelper 
// Assembly: WebMatrix.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 
// MVID: 3F332B40-45DB-42E2-A4ED-0826DE223A79 
// Assembly location: C:\Windows\Microsoft.NET\assembly\GAC_MSIL\WebMatrix.Data\v4.0_1.0.0.0__31bf3856ad364e35\WebMatrix.Data.dll 

using System; 

namespace Microsoft.Internal.Web.Utils 
{ 
    internal static class ExceptionHelper 
    { 
     internal static ArgumentException CreateArgumentNullOrEmptyException(string paramName) 
     { 
      return new ArgumentException(CommonResources.Argument_Cannot_Be_Null_Or_Empty, paramName); 
     } 
    } 
} 

Obwohl es nicht so viel Code ist Ihr zu schreiben eigene benutzerdefinierte Exception -basierte Art (oder InvalidOperationException -basierte) und def In einigen Konstruktoren, die eine Nachricht für Sie formatieren.

Um redundanten Code

zu reduzieren Wenn ich das höre, denke ich AOP, die von Postsharp recht gut umgesetzt wird. Wenn Sie viel redundanten Code haben, sollten Sie AOP in Betracht ziehen, aber denken Sie daran, dass es vielleicht übertrieben ist.

+1

Es gibt nur zwei Möglichkeiten: Ich bin zu dumm für meinen Job * ODER * Ich habe diesen Job zu lange gemacht - die Lösung ist weit zu einfach ... – joe

+0

@joe Was ist los? eine dritte, sich gegenseitig ausschließende Lösung? :) –

+1

@taspeotis: Du hast Recht - das sind die Tage besser nicht zu Hause verlassen – joe