2

私は初心者プログラマーです。愚かさをお詫びします。

少数のクラスのみで小さなプロジェクトを作成するPythonのバックグラウンドから来たので、ほとんどの場合、すべてのコードを1つのファイルに収めることになります。

私は最近c#を学んでいて、かなり大きなコンソールアプリケーション(10,000行以上)を書いています。ここですべてを1つのファイルに入れることはできませんが、プロジェクトをより小さなセグメントに分割する方法がわかりません。

これまでのところ、ソリューション内の名前空間ごとに新しいプロジェクトを作成し、それに応じて各クラスを個別のファイルに分割しています。これまでのところ、私は約4つの名前空間を持っています。私は、他のプロジェクトでそれぞれを使用することを目的として、各名前空間を個別に作成しました。

私は今、コンソールアプリケーションを構築するために各名前空間をつなぎ合わせたい段階にあります。これを行うにはどうすればよいですか?

また、コードを正しい方法で構造化していますか?

また、+ 1、プロジェクト内の完全に異なるディレクトリにあるファイルを使用することは可能ですか?

よろしくお願いします。

4

4 に答える 4

3

多かれ少なかれ正しい軌道に聞こえます。質問/構造への対応:

1)それぞれの一意の名前空間を独自のプロジェクトで表す必要はありません。クラスの整理に役立つ場合は、同じプロジェクト内に複数のサブ名前空間を含めることができます(おそらくそうすべきです)。あなたの場合、それぞれが独自のスタンドアロンコンポーネントとしてプログラムされているように聞こえるので、それぞれのプロジェクトは理にかなっています。

2)各クラスを別々のファイルに分割するのは良いことです。それを続けてください。

3)コードをつなぎ合わせることについて何を求めているのかわからない。Visual Studioでプロジェクトを物理的に参照/リンクする方法、またはAPIをコーディング/アクセスするためのベストプラクティスを意味しますか?前者の場合は、プロジェクトの下の[参照]項目を右クリックして、プロジェクト(コンパイルされたDLLではない)をポイントできます。後者の場合、従うことができるさまざまなプログラミングパターンがありますが、通常は、コードの内部動作に関心がないように、プロジェクトから優れたAPIを抽象化する必要があります。

4)完全に異なるディレクトリからファイルを確実に参照できます。プロジェクトまたはフォルダを右クリックし、[追加]-> [既存のアイテム]を選択して、ファイルを参照します。ファイルを物理的にコピーしないように、「リンク」として追加することをお勧めします:http: //msdn.microsoft.com/en-us/library/9f4t9t92%28VS.80%29.aspx

考えられるソリューション構造に少し入る別のStackOverflowの質問を次に示します。ソリューション:アプリケーションごと、またはアプリケーションスイートごと

于 2012-04-16T18:58:32.643 に答える
3

名前空間から始めるときは、通常、会社名または組織名(たとえば、「A」)を使用します。複数の製品/プロジェクトがあり、そのアイテムのコードを作成している場合は、修飾子を追加する必要があります(たとえば、「B」、「C」など、AB、ACなどがあります)。

次に、一般的なアプローチは、関連する名前空間でタイプをグループ化することです。タイプを作成し、それが一般的な問題に対する汎用/ユーティリティ/ 1回限りのソリューションである場合は、より広いスコープの名前空間に保持する必要があります。いくつかの機能や目的をサポートするためにいくつかのタイプを作成していることに気付いた場合は、それらのタイプを含む狭い名前空間を作成することをお勧めします。たとえば、データ転送オブジェクト、データアクセスオブジェクトなどを含む、AB用のいくつかのデータアクセスコンポーネントを作成する必要があるとします。次に、これらのタイプをABDataAccessのようなものに配置することをお勧めします。

ただし、.NETはOOPパラダイムを使用することに注意してください。OOPパラダイムの1つは、コードの再利用です。したがって、ABとACの両方でデータにアクセスする場合は、再利用可能なデータアクセスコンポーネントを作成して、両方のプロジェクトでのコードの再利用を促進することができます。その場合、A.Commonなどのプロジェクトが必要になる場合があります。このプロジェクトには、製品で使用される一般的なタイプが含まれ、AB、ACなどで利用できる一般的な使用法、一般的な概念、または抽象的な概念が含まれます。

その例をさらに進めてみましょう。

  • プロジェクト:A.Common(アセンブリの名前)
  • 目的:あらゆるプロジェクトで再利用可能なタイプ
  • 名前空間:A、A.DataAccess
  • タイプ:A.DataAccess.DataAccessObjectBase

  • プロジェクト:AB(アセンブリの名前)
  • 目的:製品「B」のタイプ
  • 参照:A.Commmon
  • 名前空間:A、AB、ABDataAccess
  • タイプ:ABDataAccess.DataAccessObject(A.DataAccess.DataAccessObjectBaseを実装)

  • プロジェクト:AC(アセンブリの名前)
  • 目的:製品「C」のタイプ
  • 参照:A.Common
  • 名前空間:A、AC、ACDataAccess
  • タイプ:ACDataAccess.DataAccessObject(A.DataAccess.DataAccessObjectBaseを実装)

これはかなり単純で大雑把な例ですが、アセンブリと名前空間の関係を視覚化するのに役立つことを願っています。

その他のヒント:

  • 特に、意味のある場合を除いて、深い名前空間(ABSomething.SomeMoreStuff.EvenMoreStuffなど)を作成する場合は、名前空間の作成をやりすぎないでください。それはあなたが物を見つけるのを少し難しくします。
  • 名前空間は、より広い目的からより狭い目的に移行する必要があります。さらに、より広い名前空間からのものに大きく依存するより狭い名前空間で型を作成する場合は、必ずより広い名前空間の下に配置してください。例:ABBroader.Narrower。

最後に、ソースファイルごとに1つのタイプのみを作成し続ける必要があります。

于 2012-04-16T19:15:33.530 に答える
2

名前空間は、コードを整理し、関心の分離を提供するのに役立ちます。これは、フォルダーまたは個別のプロジェクトを作成することによっても実行できます。優れたロジック分離により、保守可能でスケーラブルなアプリケーションを構築できます。

新しいフォルダを作成するか、新しいプロジェクトを作成するかを決定するときは、常識に頼る必要があります。たとえば、helloworldアプリケーション用にいくつかのプロジェクトを作成するはやり過ぎです。シングルクラスのフォルダを作成するのもやり過ぎです。ただし、互いに密接に関連するクラスがいくつかある場合は、この特定の懸念事項を他のアプリケーションから分離することを検討してください。たとえば、がある場合はCustomerRepository、とを追加OrderRepositoryVendorRepositoryます。彼らが代表している懸念を強調するのは良い決断です。フォルダを作成Repositoriesし、それらすべてのクラスをそこに移動します。

大規模なアプリケーションでは、ビジネスロジック、データアクセスロジック、ユーザーインターフェイスなどの懸念事項を分離するのが一般的です。通常、これらの懸念に関連するクラスは別々のプロジェクトに行きます。コードを理解し、維持しやすくするために分離が行われていることを覚えておいてください。したがって、名前空間は、あなたとあなたのアプリケーションを維持するすべての人に対する懸念を説明する必要があります。たとえば、次の3つのプロジェクトを使用できます。

FooCompany.BLL
FooCOmpany.DAL
FooCOmpany.UI

これは、ビジネスロジック層、データアクセス層、およびユーザーインターフェイスの頭字語です。「標準」の名前はありません。コードをよりよく説明するものなら何でも使用できます。これは、私が会社のFoo製品バーに通常使用するプロジェクト構造の例です。

// Assembly for business logic
Foo.Bar.Domain
Foo.Bar.Domain.Model
Foo.Bar.Domain.Services
Foo.Bar.Domain.Repositories
// Assembly for data access
Foo.Bar.Persistence.NHibernate 
// Assembly for application services
Foo.Bar.Services
// Project for presentation    
Foo.Bar.Presentation.Web
Foo.Bar.Presentation.Web.Controllers
Foo.Bar.Presentation.Web.Views

ところで、名前空間名を開発している会社の名前で始めるのが一般的な方法です。名前空間の命名ガイドラインを参照してください。これにより、異なる名前空間に同じ名前の2つのクラスがある場合に、名前の競合を回避できます。

于 2012-04-16T20:22:03.197 に答える
1

最後の質問から最初の質問まで始めます。プロジェクト内の完全に異なるディレクトリにあるファイルを使用できます。私はあなたが正しい道を進んでいると思います。別の名前空間についてこのコードを使用できます

using System;
using namespace1; 
using namespace2;
于 2012-04-16T18:44:21.190 に答える