Каков был бы самый разумный способ запуска последовательностей перестановочного кода для запуска через перечислитель? - PullRequest
1 голос
/ 09 июля 2009

У меня есть следующее перечисление (псевдокод)

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

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

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

Ответы [ 3 ]

0 голосов
/ 09 июля 2009
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 вместо Action <>.

0 голосов
/ 09 июля 2009

Вы, ребята, имели в виду нечто подобное?

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 голосов
/ 09 июля 2009

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

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

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


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...