normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

.NETのインターフェースの実装クラスはImplで終わらないのか?

Javaの文化と.NETの文化では、例えば以下の様に色々とネーミングルールが異なります。

分類 Java .NET
インターフェース 特になし 頭にIをつける(IFilterとか?)
実装クラス 最後にImplつける(SmpServiceImplとか?) 特になし(と思ってた!!)

しかしまぁ、ちゃんと見てたら.NETにもちょこちょことImplで終わってるクラスもあるんですよね。例えばAuto Mapperの実装とかも結構Implが入ってます。

せっかくなので、以下のテストコードを用いて試してみました。いくつかのアセンブリからクラスを持ってきて、インターフェースの実装クラスからImplで終わっているクラスを引っ張ってきました。

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Reflection;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //var assemblies = typeof(Program).Assembly.GetReferencedAssemblies()
            //    .Select(assemblyName => Assembly.Load(assemblyName));
            var assemblies = AppDomain.CurrentDomain.GetAssemblies();
            Console.WriteLine("読み込んだアセンブリ = {0}", string.Join(" , ",
                                    assemblies.Select(a => Path.GetFileName(a.CodeBase)).ToArray()));

            var classes = assemblies.Select(assembly => assembly.GetTypes())
                                    .SelectMany(t => t).Where(t => t.GetInterfaces().Count() > 0);
            var implClasses = classes.Where(t2 => t2.FullName.EndsWith("Impl"));
            Console.WriteLine("Implで終わるクラスの割合 = {0}/{1}", implClasses.Count(), classes.Count());
            Console.WriteLine("Implで終わるクラス一覧 = {0}", string.Join(" , ",
                                    implClasses.Select(clazz => clazz.Name).ToArray()));
            Console.Read();
        }
    }
}

結果は以下となりました。読み込んだアセンブリ中5117個のインターフェースを実装したクラスのうち、Implがついてるクラスは4/5117個ありました。でも・・・、これってオープンソース(Codeplexの奴とか)を調査対象とするともっと比率が変わりそうだなぁ。

  • 読み込んだアセンブリ
    • mscorlib.dll
    • Microsoft.VisualStudio.HostingProcess.Utilities.dll
    • System.Windows.Forms.dll
    • System.Drawing.dll
    • System.dll
    • Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll
    • Microsoft.VisualStudio.Debugger.Runtime.dll
    • ConsoleApplication1.vshost.exe
    • System.Core.dll
    • System.Xml.Linq.dll
    • System.Data.DataSetExtensions.dll
    • Microsoft.CSharp.dll
    • System.Data.dll
    • System.Xml.dll
    • ConsoleApplication1.EXE
  • Implで終わるクラスの割合
    • 4/5117
  • Implで終わるクラス一覧
    • ActiveXImpl
    • _InitRuntimeDllImpl
    • XmlTextReaderImpl
    • XmlValidatingReaderImpl