2015-11-21 3 views
0

У меня есть сценарий следующим образом:Можно ли применять ограничения для нескольких методов в C#

Int MethodOne (int param) { 
    If (param > 5) { 
     Return 0; 
    } 
    Return param; 
} 

Int MethodTwo (int param) { 
    If (param > 5) { 
     Return 0; 
    } 
    Return param * anotherVariable; 
} 

Можно ли применить условный «метод не должен выполняться если параметр> 5» для всех моих методов без переписывая его внутри каждого метода?

+0

Мне было просто интересно, можно ли избежать повторения кода в этом случае? – Souk21

+1

upvoting, потому что люди сбрасывают без комментариев, чтобы помочь пользователю улучшить вопрос. –

ответ

4

Один из способов не пройти Int (см primitive obsession)

public class NotMoreThanFive 
{ 
    public int Value {get; private set;} 
    public NotMoreThanFive(int value) 
    { 
    Value = value > 5 ? 0 : value; 
    } 
} 

Теперь

Int MethodOne (NotMoreThanFive param) { 
    Return param.Value; 
} 

Int MethodTwo (NotMoreThanFive param) { 
    Return param.Value * anotherVariable; 
} 
1

Я не знаю, как сделать то, что спросил ОП, так что вот лучший ответ, который я мог бы придумать. Одним из способов может быть создание другого метода Restriction(), чтобы вы могли его изменить один раз, а не в каждом методе.

bool Restriction(int param) 
{ 
    return param <= 5; 
} 

int MethodOne(int param) 
{ 
    return Restriction(param) ? param : 0; 
} 

int MethodTwo(int param) 
{ 
    return Restriction(param) ? param * anotherVariable : 0; 
} 
+0

И как это удовлетворяет условию _without переписывая его внутри каждого метода_? – Steve

+0

Ну, это не так. Но я не знаю, как делать то, что задал ОП, поэтому я попытался дать лучший ответ, который мог бы придумать. –

+1

Я согласен с вами, но ваш комментарий должен быть добавлен в начале вашего ответа. – Steve

1

Вы можете использовать функцию.

Func<int,int> restrict = x => x <= 5 ? x : 0; 

int MethodOne (int param) { 
    return restrict(param); 
} 
int MethodTwo (int param) { 
    return restrict(param) * anotherVariable; 
} 
//... 

И когда вы просто делаете restrict(param) он будет делать этот чек для вас и вернет нужный номер.

+0

'int MethodThree (int param) {return anotherVariable/restrict (param); } 'будет сильно падать. –

+0

@ArthurRey в любом случае рухнет, когда вы попытаетесь разделить на '0'. и ОП должен знать об этом. –

0

Вместо написания нескольких методов, просто написать один метод, который принимает параметр, чтобы решить, какие функции его необходимо позвонить и поставить свое условие в верхней части этого метода:

Int MethodOne (int func, int param) { 
    If (param > 5) { 
     Return 0; 
    } 

    switch(func) 
    { 
     case 1: Return param; break; 
     case 2: Return param * anotherVariable; break; 
     ... 
    } 
} 
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication8 
{ 
    class Program 
    { 
     delegate int restriction(int x, string methodName); 

     static void Main(string[] args) 
     { 
      int x = MethodOne(6); 
      Console.WriteLine(x); 

      int x1 = MethodOne(4); 
      Console.WriteLine(x1); 

      int x2 = Methodtwo(6); 
      Console.WriteLine(x2); 

      int x3 = Methodtwo(4); 
      Console.WriteLine(x3); 



      Console.ReadLine(); 
     } 

     public static int restrictionMethod(int param, string methodName) 
     { 
      if (param > 5) 
      { 
       param = 0;    

      } 
      if (methodName == "MethodOne") 
      { 
       return param; 
      } 
      else if (methodName == "Methodtwo") 
      { 
       return param * 4; 
      } 

      return -1; 
     } 

     public static int MethodOne(int param) 
     { 
      restriction rx = restrictionMethod; 
      int returnValue = rx(param, "MethodOne"); 
      return returnValue; 
     } 

     public static int Methodtwo(int param) 
     { 
      restriction rx = restrictionMethod; 
      int returnValue = rx(param, "Methodtwo"); 

      return returnValue; 
     } 


    } 
}