ポリモーフィズムで条件分岐をなくす

using System;

class Program
{
    enum Programmer { Java, CSharp, VBnet };

    static void Main(string[] args)
    {
        Programmer[] programmers = 
            { 
                Programmer.Java,
                Programmer.CSharp,
                Programmer.VBnet,
                Programmer.CSharp
            };

        foreach (var p in programmers)
            Coding(p);

        Console.ReadKey();
    }

    private static void Coding(Programmer Language)
    {
        switch (Language)
        {
            case Programmer.Java:
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Java Coding");
                break;
            case Programmer.CSharp:
                Console.ForegroundColor = ConsoleColor.Blue;
                Console.WriteLine("C# Coding");
                break;
            case Programmer.VBnet:
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("VB.NET Coding");
                break;
        }
    }
}

この状態だと、扱う言語が増えた場合は条件分岐を増やさないといけない。
ポリモーフィズムを用いて共通の型を抜き出し、呼び出し元はインターフェースを介して処理を呼び出すようにする。そうすることで実装クラスを直接参照しなくてよくなるので、条件分岐が無くせる。

using System;

class Program
{
    interface IProgrammer
    {
        void Coding();
    }

    class JavaProgrammer : IProgrammer
    {
        void IProgrammer.Coding()
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Java Coding");
        }
    }

    class CSharpProgrammer : IProgrammer
    {
        void IProgrammer.Coding()
        {
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("C# Coding");
        }
    }

    class VBnetProgrammer : IProgrammer
    {
        void IProgrammer.Coding()
        {
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("VB.NET Coding");
        }
    }

    static void Main(string[] args)
    {
        IProgrammer[] programmers = 
            { 
                new JavaProgrammer(),
                new CSharpProgrammer(),
                new VBnetProgrammer(),
                new CSharpProgrammer()
            };

        foreach (var p in programmers)
            p.Coding();

        Console.ReadKey();
    }
}

さらに各実装クラスで実行しているメソッドを抽象クラスに抜き出す。
そうすることにより、処理の宣言を一元化し、重複コードを削除する。

using System;

class Program
{
    interface IProgrammer
    {
        void Coding();
    }

    abstract class Programmer : IProgrammer
    {
        protected abstract ConsoleColor GetSkinColor();
        protected abstract string GetContent();

        void IProgrammer.Coding()
        {
            Console.ForegroundColor = GetSkinColor();
            Console.WriteLine(GetContent());
        }
    }

    class JavaProgrammer : Programmer
    {
        protected override ConsoleColor GetSkinColor()
        {
            return ConsoleColor.Red;
        }

        protected override string GetContent()
        {
            return "Java Coding";
        }
    }

    class CSharpProgrammer : Programmer
    {
        protected override ConsoleColor GetSkinColor()
        {
            return ConsoleColor.Blue;
        }

        protected override string GetContent()
        {
            return "C# Coding";
        }
    }

    class VBnetProgrammer : Programmer
    {
        protected override ConsoleColor GetSkinColor()
        {
            return ConsoleColor.Green;
        }

        protected override string GetContent()
        {
            return "VB.NET Coding";
        }
    }

    static void Main(string[] args)
    {
        IProgrammer[] programmers = 
            { 
                new JavaProgrammer(),
                new CSharpProgrammer(),
                new VBnetProgrammer(),
                new CSharpProgrammer()
            };

        foreach (var p in programmers)
            p.Coding();

        Console.ReadKey();
    }
}

サンプルコードの構成はまんま下記ブログを参考にさせていただきましたm(_ _)m
トルネード・プログラミング オブジェクト指向入門 第7回 ポリモーフィズムによる条件分岐の排除