1

私は次の列挙型(疑似コード)を持っています

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

お分かりいただけると思います...各文字が 4 行のコードを表している場合、渡された RunSequence に従って、これらの 16 行のコードを目的のシーケンスで実行するためのロジックを構築する最もスマートな方法は何でしょうか?

私は完全に迷っています...これはまったく異なるアプローチで達成する必要がありますか? goto ではなく OO アプローチを使用したい ... デザインパターン

4

3 に答える 3

0

コードの各 4 行のチャンクは、独自のメソッド内にある必要があります。何かのようなもの

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

次に、CodeExecutor と呼ばれるパラメーターなしでデリゲートを作成できます。正しいメソッドを指すコード ブロックごとに、デリゲートのインスタンスをインスタンス化します。デリゲート インスタンスを正しい順序 (またはリストなど) で読み込んだ配列をメイン関数に渡します。それを繰り返し、各デリゲートを呼び出します。


別の同様の方法があります。Run() というメソッドを定義する ICodeBlockRunner というインターフェイスを作成します。一意のコード ブロックごとに、インターフェイスを実装するクラスを作成し、Run() メソッドを実装して 4 行のコードを実行します。次に、関数は、ICodeBlockRunners (もちろん、ICodeBlockrunner を実装するインスタンス化されたクラス) の配列 (または列挙可能なもの) を目的の順序で受け入れます。値を反復処理し、各 ICodeBlockRunner で Run() を呼び出します。

于 2009-07-09T08:31:02.323 に答える
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<> の代わりに Action<ContainerClass> を使用します。

于 2009-07-09T08:33:30.620 に答える
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 
于 2009-07-09T11:59:00.953 に答える