3

フレームワークに明確に統合しようとしているShunting-Yardアルゴリズムの実装があります。現在、私はそれをすべて、単純なパブリックインターフェイスを備えたクラスにパックしています。

namespace MathematicalParser {
  public class ExpressionParser {
    public ExpressionParser(string expression, List<string> variables);
    public double GetNumericValue(Dictionary<string,double> variableValues);
  }
}

このクラスの中には、さまざまな名前を関数にマップするためのヘルパークラス、ヘルパー列挙型、静的変数などがたくさんあります。これらはすべてプライベートであるため、ライブラリのユーザーには関係ありません。

コードの保守性を向上させるために、論理的に無関係なコードを独自のクラスに分離しようとしていますが、これらのクラスはExpressionParserの外部では意味がないため、名前空間MathematicalParserへの可視性を制限したいと思います。 (これにはExpressionParserのみが含まれます)。

これをc#でどのように実現するのが最善ですか。内部キーワードはアセンブリでのみ機能し、プライベートは名前空間では使用できません。

4

3 に答える 3

1

(元の質問に対する私のコメントに照らして)本当にこれを実行したい場合は、すべてのヘルパークラスを単一のアセンブリにまとめて内部にすることができるため、効果的に使用を停止できます。次に、ユーザーに使用させる2番目のアセンブリを作成し、「public」クラスとメソッドを2番目のアセンブリに配置します。次に、を使用InternalsVisibleToして、「パブリック」アセンブリが他の「プライベート」アセンブリのヘルパークラスとメソッドを使用できるようにします。

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

これは、ライブラリを使用しているユーザーに、「パブリック」ライブラリコードを含むアセンブリとは異なるアセンブリで作業するように強制する必要があることを意味します。あなたの質問から、彼らは同じアセンブリで動作していると言っていると思います。その場合、「パブリック」ライブラリを別のアセンブリに分離する必要があります。そして、これを行った場合、メソッドを内部に作成し、それらを同じアセンブリに配置するだけで、結局のところその仕事ができます。

2つのアセンブリのルートを使用し、同僚が同じアセンブリで作業している場合、少なくとも、別のアセンブリを参照する際に、使用を妨げる可能性のある追加の「ステップ」があります。

それでも不十分な場合...わかりません。WCFWebサービスを作成して、それを実行してください*。

*それは風刺でした

于 2012-07-18T13:20:24.060 に答える
1

プライベートネストクラスを使用してみましたか?
ここを見てください:C#のプライベート内部クラス-なぜそれらはもっと頻繁に使用されないのですか?

于 2012-07-18T11:40:25.140 に答える
1

私はこれをしません(ジョーと同じ意見です)が、ロピナの答えから派生した別の解決策があります:ネストされたクラス+部分的なクラス

PublicClass.cs:

namespace MyNamespace
{
    public partial class PublicClass
    {
        public int ReturnSomeStuff()
        {
            MyHelperClass1 tmp = new MyHelperClass1();
            MyHelperClass2 tmp2 = new MyHelperClass2();

            return tmp.GetValue1() + tmp2.GetValue2();
        }
    }
}

PrivateClass1.cs:

namespace MyNamespace
{
    public partial class PublicClass
    {
        private class MyHelperClass1
        {
            public int GetValue1()
            {
                return 5;
            }
        }
    }
}

PrivateClass2.cs:

namespace MyNamespace
{
    public partial class PublicClass
    {
        private class MyHelperClass2
        {
            public int GetValue2()
            {
                return 10;
            }
        }
    }
}

Program.cs:

public class Program
{
    private static void Main(string[] args)
    {
        PublicClass tmp = new PublicClass();

        MyHelperClass2 zz;  // Can't access MyHelperClass2 here cause it's private

        Console.WriteLine(tmp.ReturnSomeStuff());
        Console.ReadLine();
    }
}

ご覧のとおり、さまざまなヘルパークラスは、物理的にさまざまなファイルに分けられています(コードの保守に役立つ場合があります)。そして、それらに直接アクセスすることはできません。それらはにプライベートPublicClassです。

于 2012-07-18T13:54:45.410 に答える