• ベストアンサー

フォルダー名とクラス名が被らないようにしたい

C#3.5を使用しています。 同じプロジェクト下に「Class1」というフォルダと「Class1」というクラスを 作成してコンパイルすると 「名前空間 'Test' に 'Class1' の定義が既に含まれています。」 というエラーになって、 つまりどちらかの名前を変えれば(例えばClass1のクラス名のほうを「Test_Class1」に変更するなど)問題ないのですが、 できればフォルダの方の名前も、クラスの方の名前も、それぞれの配置位置も変えたくありません。 そういうふうにやるのは不可能なのでしょうか?

この投稿のマルチメディアは削除されているためご覧いただけません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> Wizard_Zeroさんはどのように階層を利用しているのでしょうか? まず、クラスを役割や目的で分類します。 次に、分類した複数のクラスを明確に指し示す名称を考えます。この名称が名前空間であり、フォルダ名になります。 例えばこんな感じですね。 MyApp ルート名前空間 Program.cs エントリポイントを含むクラス MyApp.Forms フォームを格納する名前空間 MainForm.cs/SubForm.cs などのフォームクラス MyApp.Forms.Dialogs ダイアログを格納する名前空間 Config.cs/About.cs などのダイアログフォームクラス MyApp.Forms.UserControls ユーザーコントロールを格納する名前空間 MyApp.Storage データの入出力管理を処理する名前空間 File.cs/Chunks.cs などのファイル処理のためのクラス ポイントというか私が気をつけていることは、なるべく.NETに存在する名前を使わないようにしていることと、名前空間の名詞を複数形にすることです。単に「Form」だけだとFormクラスとかち合ってしまうので「Forms」とすることでそれを回避しています。(ビルドができてもインテリセンスが働かなくなってしまうことがあるので) 私の場合はチームや会社で開発した経験がないので、自己流な部分がほとんどですが、名前空間の切り分け方やクラス名の付け方は.NET Frameworkそのものを参考にしました。個人で開発するのであれば、自分流のルールや命名規則を作っておくと良いと思います。(これは名前空間だけでなく変数名やプロパティ名などにもあてはまりますね。)

takagoo100
質問者

お礼

ご返答ありがとうございます。 なるほど、複数形を用いるということですね。 具体的でとても参考になりました。 ありがとうございます。 ただもう一つ疑問に思うことがあって、 もしよろしければ最後にもう一つだけお答え頂けないでしょうか? タブで切り替えられる複数のTreeViewをもつアプリケーション(http://paint.s13.dxbeat.com/up/src/paint_19155.jpg.html) の場合、自分としては複数のTreeViewの内容をできるだけ散らばらないように 一つのフォルダの中で記述したいと思い、TreeViewsフォルダを作ってその中にさらに それぞれのTreeViewフォルダを配置して、さらにそれぞれのNodeフォルダを配置する(ここまではやりすぎかなぁ・・・) 次のような構造で考えているのですが、 (文字数の関係で「この回答に補足をつける」を参照して下さい)

takagoo100
質問者

補足

TreeViewsフォルダ(このフォルダの中に各TreeViewの内容を配置する) ├─── データモデルフォルダ(データモデルTreeView) │     ├─── メインモデルNodeフォルダ(データモデルTreeViewの中のメインモデルNode) │     │     ├ フォーム(ダイアログ?)(Itemを追加するウィザードみたいな?http://paint.s13.dxbeat.com/up/src/paint_19156.jpg.html) │     │     ├ 設定(メインモデルNodeの共通の設定情報) │     ├─── 外部キーNodeフォルダ │     │     ├ フォーム │     │     ├ 設定 │     ├ フォーム(データモデルTreeViewに共通のフォームデザインや内容) │     ├ 設定(データモデルTreeViewに共通の設定情報) ├─── データディクショナリフォルダ(左から2つ目のタブのTreeView) │     ├─── データディクショナリNodeフォルダ │     │     ├ フォーム │     │     ├ 設定 │     ├ フォーム │     ├ 設定 ├ フォーム(各TreeViewに共通のデザイン&内容でそれぞれが継承します) ├ 設定(各TreeViewに共通の設定情報) これだとWizard_Zeroさんのようなやり方と少し違ってくるような気がするのですが、 例えばWizard_Zeroさんのやり方に当てはめると「ダイアログを格納する名前空間」という風に 分けられているので、 MyApp.Forms.Dialogs フォルダ ├─── TreeViewsフォルダ(ここにTreeViewsフォルダを作ってしまう) │     ├─── データモデルフォルダ │     │     ├─── メインモデルNodeフォルダ │     │     │     ├フォーム(ダイアログ?http://paint.s13.dxbeat.com/up/src/paint_19156.jpg.html) という感じになるのでしょうか? Wizard_Zeroさんならこのアプリケーションの場合、どのように配置を考えますか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.4

> MyApp.DataModelsやMyApp.DataDictionariesは何のデータを保持すれば良いのでしょうか? ここはデータの木構造のルートとなる部分なので、各ノードを管理するクラス(例えばコレクションクラス等)や、ノードで共通する部分をカプセル化した基底クラスなどなどですね。 > Expand(ノードが開いているか)だけは保存するデータとした方が良さそう そこはプロジェクトの仕様にあわせればよいと思います。データとインターフェイスを分離するといっても、完全に壁で隔ててしまう必要はありません。

takagoo100
質問者

お礼

ご返答ありがとうございます。 大方のイメージができました。 本題からずれた質問かもしれませんが、ここまで回答して頂きありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

私の場合は、データとインターフェイスはなるべく分けて考えるようにしています。フォームやコントロールは、あくまでデータを可視化し、表示・編集するためのものに過ぎないので、コントロールとデータを直結して構成するとどうしても煩雑になってしまいがちですね。 補足で示した範囲で言うと「データモデル」と「データディクショナリ」という2つのデータのまとまりがあり、それぞれ可視化に適しているのがTreeViewである、と考えられます。「TreeViewを使いたいからデータを木構造にした」のではなく「データの分類法を木構造にしたから、TreeViewを使う」という発想ではないでしょうか? その場合、あくまで主体は「データ」ですので、TreeViewの配下には置かず、データとTreeViewを切り離して考えます。こうすると、データをTreeViewへ送り込む手段が必要になりますが、データのまとまり自体が木構造になっていれば、ノードの構成はさほど面倒ではなくなります。これにはいくつか方法が考えられます。 ・データとTreeViewを受け取ってノードを構成するクラス ・データからノードを構築することができるTreeView継承クラス ダイアログに関しては、補足にあるようにデータの名前空間に埋め込んでしまってもいいですし、Forms.Dialogs名前空間の配下に配置してもいいと思います。正直、ここは悩ましいところですね・・・。 データ構造を完全に把握しているわけでありませんが、私ならこんな感じにします。 [ データ部分 ] MyApp.DataModels MyApp.DataModels.Nodes MyApp.DataDictionaries MyApp.DataDictionaries.Nodes [ インターフェイス部分 ] MyApp.Forms MyApp.Forms.Dialogs MyApp.Forms.Dialogs.DataModels データモデルで使うダイアログ MyApp.Forms.Dialogs.DataDictionaries データディクショナリで使うダイアログ MyApp.Forms.TreeViews データをTreeViewへ送るためのパイプ役になるクラス。 名前空間の切り分けは「何を主体にするか」を意識すると良いと思います。 断片的な情報しか得ていないのでこれを鵜呑みにするのは危険だと思いますが、考え方の参考になればと思います。

takagoo100
質問者

お礼

ご返答ありがとうございます。 なるほど、たしかにデータと制御やデザインは分けた方がわかりやすそうですね。 ところでずっとWizard_Zeroさんの[ データ部分 ]の構成を考えていて、 これ以上深く掘り下げるのはどうかと思ったのですが、 どうせ自分で考えても分からなそう(^^;)なので伺いたいのですが、 MyApp.DataModels.NodesやMyApp.DataDictionaries.Nodesの部分は MyApp.DataModels.Nodes ├ メインモデルNodeのデータ集合クラス ├ 外部キーNodeのデータ集合クラス というふうに、それぞれのノード情報に合ったデータのリストを保持してるクラスを記述すれば良いと思うのですが MyApp.DataModelsやMyApp.DataDictionariesは何のデータを保持すれば良いのでしょうか? TreeViewのデザイン部分は[ インターフェイス部分 ]に任せれば良いと思うのですが、 デザインに関することでも、Expand(ノードが開いているか)だけは保存するデータとした方が良さそうですが、 そういうデータなのかなと

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

試してみましたがエラーは出ませんでした。 Class1\Class1.cs 以外にClass1というクラスが定義されていたりしませんか? クラス名ではなく名前空間でかぶっているかもしれません。Test.Class1というクラスとTest.Class1という名前空間は共存できないので別の名前にするしかありません。フォルダ名を変えなくても名前空間を変えることは可能です。 // 定義できない例 // Class1\Class1.cs namespace Tester.Class1 { class Class1 {} } // Class1.cs namespace Tester { class Class1 {} } // これなら大丈夫 // Class1\Class1.cs namespace Tester.Class1A { class Class1 {} } // Class1.cs namespace Tester { class Class1 {} }

takagoo100
質問者

お礼

ご返答ありがとうございます。 >クラス名ではなく名前空間でかぶっているかもしれません。 まさにこれでした・・・ Class1フォルダの下に作ったClass2.csファイルに書かれている namespace Test.Class1 { class Class2 { } } の「Test.Class1」が被っていました。 別の名前にするしかないとのことですが、 ここからは別の質問になっちゃうかもしれないので申し訳ないのですが、 やむおえず別の名前にするときに、何かこうコツというかパターンみたいな付け方はあるのでしょうか? 例えばC#での比較的大きな規模のプログラムの場合 Wizard_Zeroさんはどのように階層を利用しているのでしょうか? 自分はできるだけフォルダの階層と名前空間を合わせたいと思ってるのですが。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • クラスファイルについて

    javaで例えばjavac Test.javaと打ち込むとコンパイルできディレクトリにTest.classというファイルができるのにもかかわらず、java Test と打ち込むとエラーがでてしまいます。クラスの定義がないみたいな感じででてきてしまいます。コマンドプロンプトのdir Testr.classと入力しても確かにファイルは存在しているのですが・・・。なぜなのでしょうか?

  • どのようなクラス名をつけた方が良いのでしょうか?

    C#でクラスライブラリを自作しようと考えているのですが、 入力された値などをチェックするバリデーションクラスを作りたいと思っています。 プログラム言語「PHP」のフレームワークで 「zend framework」というのがありまして、C#のライブラリでもそのような構造にしたいと思いまして、 そこで次のような構造で ┬ Mylibrary(ライブラリ名) │└ Validateフォルダ │ ├Alpha.css(アルファベットかチェック) │ ├Date.css(日付かチェック) ├Validate.css(各種のバリデーションを繋げて、一括でチェックする、または管理するクラス) というふうに考えていたのですが、コンパイルすると「Validate.css」で次のような 「名前空間 'Mylibrary' に 'Validate' の定義が既に含まれています。」 と名前がバッティングするようなのです・・・ なので仕方なく、「Validate.css」ファイルの方を、 「ValidateManager.css」(←この違いも自分の中では曖昧ですが・・・→)「ValidationManager.css」 や単に 「Validationt.css」 にしたり、それかValidateフォルダ(「namespace Mylibrary.Validate」)の方を 「Validations」(「namespace Mylibrary.Validations」) にしようか迷っています・・・ みなさんなら(このようなライブラリを作るか否かも含めて)どのような名前を付けるのか アドバイスを頂けないでしょうか?

  • C++ のクラスの定義

    C++の初心者です。 C++のことでお聞きしたいことがあります。 namespace test1{ class A { friend class B; protected: int a; }; } とtest1の下にAクラスを作り namespace test2{ class B { public: test1::A A1; }; } と別のnamespaceにBというクラスを作り、 A1というAのインスタンスを持ちたいのです。 しかし、Aというクラスを先に宣言しているので Bというクラスが解らないらしく friendがうまく働きません。 friend class test2::B としても test2がまだ宣言されていないので、 ????とコンパイルエラーが出ます。 先にtest2::B を宣言してしまうと、 今度はtest1::Aが解らずに エラーが出てしまいます。 こんな場合はどのように書けばよろしいのでしょうか? 環境はwindows2000でVC++ 6.0です。 どうか宜しくお願いいたします。

  • C++のtemplateクラス前方宣言について教えてください

    C++で、以下のようなコードを書いたのですがコンパイルが通りません。 どのようにコードを修正すればコンパイルを通すことができるでしょうか??教えてください。 template <class _T> class Test; // 上をclass Test<_T>にしてもコンパイルは通りません void main() {   Test<int> hoge; } template <class _T> class Test { public:   _T val;   Test():val(0){}; }; /*! エラー内容: 前方宣言class Test;の場合 'hoge'が未定義のclass'Test<_T>'で使用しています。   with   {     _T=int   } 前方宣言class Test<_T>;の場合 構文エラー:';'が'<'の前にありません。 構文エラー:'<' 'hoge'が未定義のclass 'Test<_T>'で使用しています。 */ 開発環境: VisualStudio2005 AcademicEdition WindowsXP Professional メモリ:2048MB CPU:Core2Duo 1.33GHz よろしくお願いします。

  • クラス宣言とアクセス制御

    お世話になります。 独学でJavaの学習を始めました。 (仕事で必要になったためです) Java のソースファイル名は、main メソッドを宣言するクラスの クラス名と一致させなければならないようですが、これは そのクラスを public をつけて宣言したときに限るのでしょうか? 以下のソースを「hello.java」という名前で保存し、コンパイルすると エラーが出ますが、「public」を削除して再びコンパイルすると、 コンパイルが通り、「test.class」が生成されます。 ********** public class test { public static void main (String args[]) { System.out.println("Hello World"); } } ********** 同一パッケージ外からクラスを参照する場合、クラス名とソースファイル名を 一致させてあげないとクラスを見つけられない、ということなのでしょうか? とんちんかんな認識でしたら申し訳ありませんが、 ご教授頂ける方、宜しくお願い致します。 また、実際に Java を使って開発されている方にお伺いしたいのですが、 現場では main メソッドを宣言するクラスのクラス名と、ソースファイルの ファイル名を一致させる、ということは常識というか、暗黙の了解みたいな ものなのでしょうか? (もちろんプロジェクト毎のコーディング規約によると思うのですが…)

    • ベストアンサー
    • Java
  • 同じクラス名はつけないほうが良いですか?

    違うタグなら同じクラスの名前を付けてもいいでしょうか? たとえば、 ********************************************** <STYLE type="text/css"> th.test{ width:15em; } td.test{ color:red; } </STYLE> </head> <body> <table border=1> <tr><th class="test">a</th><th class="test">b</th></tr> <tr><td class="test">c</td><td>d</td></tr> </table> ********************************************** のように、thタグとtdタグで同じtestというクラス名を付けても問題なく動作しますが このようなコードはほかの人から見てもきれいなコードと認識されますか? 同じクラス名はつけないほうが良いですか?

  • 内部クラスのインスタンスを外部クラスが保持する場合

    C++での内部クラスの宣言の仕方なのですが、例えば、 class Outer { private:    class Inner; public:    Outer();    ~Outer(); }; class Outer::Inner { public:    Inner();    ~Inner(); }; のように単純に内部クラスが宣言されているだけならば、 その具体的な定義を外側に書くことは可能と思うのですが、 class Outer { private:    class Inner    {    public:       Inner();       ~Inner();    }; public:    Outer();    ~Outer();    Inner inner; //内部クラスのインスタンス }; のように外部クラスが内部クラスのインスタンスを保持していた場合には、 上記のようにインスタンス作成より上で外部クラスの宣言内に内部クラスの定義を書かないと、 コンパイルが通らない(VC++2008)と思います。具体的な中身がないままインスタンスを 作っているのでエラーを吐く理由もわからないでもないですが、 見易さ的に上の例のようにかけないのかなとも思ったりします。 インスタンスを外部クラスに持たせずともどうとでもなるのですが、 あえて上のようなことをしたくなった場合には下のような方法で記述する以外ないのでしょうか?

  • javaでメインクラスが見つからないエラーが出てしまいます。

    javaでメインクラスが見つからないエラーが出てしまいます。 やさしい簡単なプログラム class test { public static void main(String[] args) { System.out.println("Viva!"); } } をjavacでクラスファイルを作った後に(ここまではできます)java test.class を行うと could not find the main class というエラーが出てしまいます。 教科書の通りにjdkをインストールして、パスを環境変数に通して、コマンドプロンプトでコンパイルしかしていません。 なにが悪いんでしょうか?

    • ベストアンサー
    • Java
  • 自分で作ったクラスを継承するとエラーが出ます。

    サーブレットを勉強しているのですが、自分で作成したクラスを継承した サーブレットを作成してコンパイルするとその継承したクラスの シンボルを解釈できませんというエラーが出ます。 たとえばclass01というクラスを継承したclass02.javaをコンパイルすると シンボルを解釈できません public class02 extends class01{ といったエラーが出てしまいます。 どうも自分で作ったクラスを読み込めていないようなのですが どうしたらよいのでしょうか? 初歩的な質問かもしれませんが、よろしくお願いします。 ちなみにOSはWin2000、サーブレットはJRUNを使用しています。

    • ベストアンサー
    • Java
  • 同一パッケージ内の継承について

    同一パッケージ内で継承したクラス Test2.java をコンパイルすると「シンボルを見つけられません シンボル:クラス Test1」とエラーになります。 --------Test1.java------- package test; public class Test1{ メソッド } ------------------------- --------Test2.java------- package test; public class Test2 extends Test1{ メソッド } ------------------------- Test1.java,Test2.javaとも同一フォルダ(D:\java\test)にあります。 ちなみにカレントディレクトリをD:\java\testにして javac Test2.java でコンパイルしようとしています。 同一パッケージ内のクラスを継承するというのはおかしなことなんでしょうか?また、コンパイルの仕方もあわせてご教示願えれば助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
このQ&Aのポイント
  • PX-M6712FTとPX-M6711FTはEPSON社製品のプリンターです。金額にも差があり、違いがあると思われますが、実際の違いはスピードだけです。
  • PX-M6712FTとPX-M6711FTはEPSON社製品のプリンターで、金額にも差があります。しかし、違いは主にスピードの違いです。
  • PX-M6712FTとPX-M6711FTはEPSON社製品のプリンターで、金額にも差があります。しかし、違いはスピードのみです。
回答を見る