2009-07-09 3 views
1

У меня есть следующее перечисление (псевдо-код)Что было бы самым умным способом запуска перестановочных кодовых последовательностей для запуска через перечислитель?

enum RunSequence : int 
{ 
ABCD = 1 , 
BCDA = 2 , 
DABC = 3 , 
.... 
} 

Вы получаете идею ... Теперь, если каждая буква представляет собой несколько 4 строк коды, что бы быть самым умным способом построения логики для выполнения тех 16 строк кода в желаемой последовательности в соответствии с RunSequence прошло

Я полностью потерял ... должно ли это быть достигнуто с помощью совершенно другого подхода? Я бы предпочел не использовать goto, но некоторый подход OO ... design pattern

+0

ммм ... получил очки без ответа;) – 2009-07-09 08:27:57

+0

Кстати, есть 24 перестановки (A, B, C, D), а не 16. –

+0

Но вы сделали это wiki сообщества, так что вы не получили репутацию (и я не буду, если вам нравится мой ответ). – colithium

ответ

0

Каждый 4-строчный фрагмент кода должен быть в собственном методе. Что-то вроде

ExecuteCode_A(){/*...*/} 

Затем вы можете создать делегата без параметров CodeExecutor. Создайте экземпляр делегата для каждого блока кода, указывающего на правильный метод. Передайте массив, загруженный экземплярами делегата в правильном порядке (или список или что-то еще) в вашу основную функцию. Итерации через него, вызывая каждого делегата.


Существует еще один подобный метод. Создайте интерфейс под названием ICodeBlockRunner, который определяет метод Run(). Для каждого уникального кодового блока создайте класс, реализующий интерфейс, и реализуйте метод Run() для выполнения 4 строк кода. Тогда ваша функция будет принимать Array (или что-то Enumerable) из ICodeBlockRunners (экземпляров, которые реализуют ICodeBlockrunner, конечно) в желаемом порядке. Вы будете перебирать значения и вызывать Run() для каждого ICodeBlockRunner.

0
private static Dictionary<char, Action> funcDic = new Dictionary<char, Action>{ 
{ 'A', funcA }, { 'B', funcB }, { 'C', funcC }, { 'D', funcD } }; 

public static void Run(RunSequence sequence){ 
    foreach (char c in Enum.GetName(typeof(RunSequence), sequence)) 
     funcDic[c](); 
} 

Где funcA..funcD - методы, содержащие фрагменты кода. Если вам нужно передать параметры между фрагментами кода, поместите их в класс контейнера и используйте Action ContainerClass> вместо Action <>.

0

Ребята, вы что-то понимаете?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ColorsUtility 
{ 
    public abstract class Runner 
    { 

     public abstract void Run (string param); 
    } 

    class ARunner : Runner , ICodeBlockRunner 
    { 
     public override void Run(string param) 
     { 
      Console.WriteLine("ARunner Run() "); 
     } //eof method 
    } //eof class 

    class BRunner :Runner , ICodeBlockRunner 
    { 
     public override void Run(string param) 
     { 
      Console.WriteLine("BRunner Run() "); 
     } //eof method 
    } //eof class 

    class CRunner : Runner , ICodeBlockRunner 
    { 
     public override void Run(string param) 
     { 
      Console.WriteLine("CRunner Run() "); 
     } //eof method 
    } //eof class 

    class PermutationRunner 
    { 

     public PermutationRunner() 
     { 
      throw new Exception("Need integer for setting the running sequence"); 

     } 

     public PermutationRunner(EnuExecSetter enu) 
     { 
      this.PopulateRunners(enu); 

     } 

     private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
     public enum EnuExecSetter 
     { 
      ABC = 1, 
      ACB = 2, 
      BCA = 3, 
      BAC = 4, 
      CAB = 5, 
      CBA = 6 
     } //eof enum 

     static void Main(string[] args) 
     { 
      string param = "theParam"; 

      foreach (int val in Enum.GetValues(typeof(EnuExecSetter))) 
      { 
       Console.WriteLine("Volume Value: {0}\n Member: {1}", 
       val, Enum.GetName(typeof(EnuExecSetter), val)); 
       PermutationRunner pr = new PermutationRunner((EnuExecSetter)val); 
       pr.BigRun(param); 
       Console.WriteLine("hit a key "); 

       Console.ReadLine(); 


      } 


     } //eof method 


     public List<Runner> Runners { get; set; } 

     private void PopulateRunners(EnuExecSetter enu) 
     { 
      string param; 
      List<Runner> runners = new List<Runner>(); 

      switch (enu) 
      { 
       case EnuExecSetter.ABC: 
        runners.Add(new ARunner()); 
        runners.Add(new BRunner()); 
        runners.Add(new CRunner()); 
        break; 
       case EnuExecSetter.ACB: 
        runners.Add(new ARunner()); 
        runners.Add(new CRunner()); 
        runners.Add(new BRunner()); 
        break; 
       case EnuExecSetter.BCA: 
        runners.Add(new BRunner()); 
        runners.Add(new CRunner()); 
        runners.Add(new ARunner()); 
        break; 
       case EnuExecSetter.BAC: 
        runners.Add(new BRunner()); 
        runners.Add(new ARunner()); 
        runners.Add(new CRunner()); 
        break; 
       case EnuExecSetter.CAB: 
        runners.Add(new CRunner()); 
        runners.Add(new ARunner()); 
        runners.Add(new BRunner()); 
        break; 
       case EnuExecSetter.CBA: 
        runners.Add(new CRunner()); 
        runners.Add(new BRunner()); 
        runners.Add(new ARunner()); 
        break; 
       default: 
        runners.Add(new CRunner()); 
        runners.Add(new BRunner()); 
        runners.Add(new ARunner()); 
        break; 

      } 
      this.Runners = runners; 

     } //eof method 


     public void BigRun(string param) 
     { 
      foreach (Runner r in this.Runners) 
      { 
       r.Run(param); 
      } 
     } 

    } //eof class 

public interface ICodeBlockRunner 
{ 
    void Run(string param); 

} 

} //eof namespace 
+0

Сортировка, но минус перечисление, кажется неудобным. Я думал больше о заполнении списка во время выполнения, основанном на пользовательском интерфейсе, или, как вы первоначально получили вход. Словарь, упомянутый выше, является отличной идеей, если вы хотите использовать ввод символов. – colithium