2013-11-25 15 views
6

Aby zmniejszyć nadmiarową kod, mam kilka metod rzut pomocnicze:Myśli o pomocników rzutów

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

Zastosowanie:

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

Problem: Ponieważ operator + zawsze musi zwrócić wartość, ja Naprawiono to, zwracając wartość przez ThrowInvalidOperation i wywołując ją za pomocą returnThrowInvalidOperation("+", a, b);

Istnieje wiele wad - jednym z nich jest to, że nie mogę tego nazwać metodą zwracającą inny typ.
Chciałbym, aby istniał sposób oznaczania funkcji pomocnika "zawsze zgłasza wyjątek", aby kompilator przestał śledzić zwracane wartości.

P: Jakie mam możliwości, aby to zadziałało?

+1

Czy rozważałeś utworzenie wyjątku w helperie, podczas gdy wrzucono go do implementacji operatora? Na przykład. 'throw NewInvalidOperationException (...);' – Caramiriel

Odpowiedz

6

Dodać wyjątek:

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

Następnie wrzucić go:

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

jesteś w dobrym towarzystwie:

// 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); 
     } 
    } 
} 

Chociaż to nie jest tak dużo kodu do pisania własny niestandardowy typ oparty na Exception (lub InvalidOperationException) i def ine konstruktora, który formatuje wiadomość dla ciebie.

Aby zmniejszyć kod nadmiarowy

Kiedy słyszę to, myślę AOP który jest realizowany przez PostSharp całkiem dobrze. Jeśli masz dużo zbędnego kodu, powinieneś rozważyć AOP, ale pamiętaj, że może to być przesada.

+1

Są tylko dwie możliwości: jestem zbyt głupia dla mojej pracy * LUB * Zrobiłem to zadanie zbyt długo - rozwiązanie jest daleko do prostego ... – joe

+0

@joe trzecie, wzajemnie powiązane rozwiązanie? :) –

+1

@taspeotis: Masz rację - te dni lepiej nie wychodzić z domu – joe

Powiązane problemy