2017-02-20 31 views
2

Предположим, у меня есть следующий классЛучший подход к проектированию 8 перегруженных методов с комбинацией из 4 параметров

public static class ClassA 
    { 
     public static Type2 B { get; set; } 
     public static Type3 C { get; set; } 
     public static Type4 D { get; set; } 

     public static string Method(Type1 a, Type2 b, Type3 c, Type4 d) 
     { 
      //do smth 
     } 

     public static string Method(Type1 a, Type2 b, Type3 c) 
     { 
      Type4 d = D ?? defaultValue4; 
      return Method(a, b, c, d); 
     } 

     public static string Method(Type1 a, Type2 b, Type4 d) 
     { 
      Type3 c = C ?? defaultValue3; 
      return Method(a, b, c, d); 
     } 

     public static string Method(Type1 a, Type3 c, Type4 d) 
     { 
      Type2 b = B ?? defaultValue2; 
      return Method(a, b, c, d); 
     } 


     public static string Method(Type1 a, Type2 b) 
     { 
      Type3 c = C ?? defaultValue3; 
      Type4 d = D ?? defaultValue4; 
      return Method(a, b, c, d); 
     } 

     public static string Method(Type1 a, Type4 d) 
     { 
      Type2 b = B ?? defaultValue2; 
      Type3 c = C ?? defaultValue3; 
      return Method(a, b, c, d); 
     } 

     public static string Method(Type1 a, Type3 c) 
     { 
      Type2 b = B ?? defaultValue2; 
      Type4 d = D ?? defaultValue4; 
      return Method(a, b, c, d); 
     } 

     public static string Method(Type1 a) 
     { 
      Type2 b = B ?? defaultValue2; 
      Type3 c = C ?? defaultValue3; 
      Type4 d = D ?? defaultValue4; 
      return Method(a, b, c, d); 
     } 


} 

В которой я должен работать с комбинацией из 4 параметров, где всегда необходимы и другие принимаются в порядке приоритета от параметра, else от свойства и если свойство не установлено или параметр не передан из значения по умолчанию. мне нужно переделать это без Продублируйте кода, так что эти линии

Type2 b = B ?? defaultValue2; 
Type3 c = C ?? defaultValue3; 
Type4 d = D ?? defaultValue4; 

написал только один раз. Это возможно?

ответ

6

Ничего из перечисленного. Создать единственный метод, который принимает объект, представляющий параметры:

public static string Method(MethodArgs args) 
{ 
    // ... 
} 

Это MethodArgs могут быть организованы, как вам нравится, либо рядом с этим классом или как внутренний класс, возможно, даже в совершенно отдельном пространстве имен DTOS и этажерки.

В MethodArgs классе можно проверить аргументы, выполнять любую логику вы как исполнение бизнес-правил на самих аргументов, раскрыть функциональность вручную проверить эту логику, и т.д. Тогда в Method() вы бы подтвердить, что args в некоторых вид действительного состояния и действовать исходя из этого состояния.

Похоже, единственная логика, которую вы продемонстрировали здесь, - это значения по умолчанию, которые могут быть легко инкапсулированы в конструктор MethodArgs.

+0

Спасибо, хорошая идея. – Lums

2

Мне нравится подход Дэвида, поскольку он может позволить вызывающему лицу больше контролировать значения по умолчанию. Если по какой-то причине, что не будет работать для вас, я бы Пользуюсь необязательные аргументы:

public static string Method(Type1 a = null, Type2 b = null, Type3 c = null, Type4 d = null) 
{ 
a = a ?? default1; 
b = b ?? default2; 
c = c ?? default3; 
d = d ?? default4; 
// logic'ing 
} 
+0

О, это похоже на то, что мне нужно, спасибо. – Lums

+1

Вы можете комбинировать это с Дэвидом тоже. Поместите аналогичную подпись в конструктор MethodArgs. –

2

Если вам нужен способ, чтобы принять любой заказ параметров, вы можете попробовать этот подход:

public static class ClassA 
{ 
    public static Type1 A { get; set; } 
    public static Type2 B { get; set; } 
    public static Type3 C { get; set; } 
    public static Type4 D { get; set; } 

    public static string Method(Type1 a, Type2 b, Type3 c, Type4 d) 
    { 
     a = a ?? default1; 
     b = b ?? default2; 
     c = c ?? default3; 
     d = d ?? default4; 
     //do smth 
    } 

    public static string Method(Type1 a, Type2 b, Type3 c) 
    { 
     return Method(a, b, c, D); 
    } 

    public static string Method(Type1 a, Type2 b, Type4 d) 
    { 
     return Method(a, b, C, d); 
    } 

    public static string Method(Type1 a, Type3 c, Type4 d) 
    { 
     return Method(a, B, c, d); 
    } 


    public static string Method(Type1 a, Type2 b) 
    { 
     return Method(a, b, C, D); 
    } 

    public static string Method(Type1 a, Type4 d) 
    { 
     return Method(a, B, C, d); 
    } 

    public static string Method(Type1 a, Type3 c) 
    { 
     return Method(a, B, c, D); 
    } 

    public static string Method(Type1 a) 
    { 
     return Method(a, B, C, D); 
    } 
} 
+0

Это тоже здорово! – Lums

0

Весь остальной ответ замечательно, но я думаю, что такой подход даст вам более 8 перегруженных метод, но сначала я буду использовать реальные типы, а не Type1, TYPE2 ..

public static string Method(int a=1, int b = 2, bool c = false, string d="") 
{ 
    //do something 
    return ""; 
} 

в таком подходе аль готов дать каждому параметру значение по умолчанию, так что нет никакой необходимости проверить, передается или нулевое значение, поэтому мы имеем чистый код немного, так что вызов метода будет как этот

Method(12); // a=12,b=2,c=false,d="" 
Method(12,5); // a=12,b=5,c=false,d="" 
Method(12,5,true); // a=12,b=2,c=true,d="" 
Method(12,5,true,"Hello"); // a=12,b=2,c=true,d="Hello" 

еще больше, потому что все параметры являются необязательными это возможно

Method(); // a=1,b=2,c=false,d="" 

и лучшая часть проходит параметр по имени

Method(d:"Hello"); // a=1,b=2,c=true,d="Hello" 
Method(b:5,c:false); 
Method(d:"Hello",a:2017); 

 Смежные вопросы

  • Нет связанных вопросов^_^