フォルダの名前とか。

id:sugimotokazuyaさんと、メッセで話をしていたら、
ちょっとグーなアイディアを聞いてしまったので、興奮した勢いでエントリ。


まずは、こやつを見て下さい。


https://www.seasar.org/svn/sandbox/s2dao.net/source/S2Dao.NET/


まぁ、これが全て。なんだけど。
namespaceとフォルダ名の対応関係に妙味があるのです。


分っちゃった人は、続きを読んでも退屈なだけなので、読まなくても良いかと。


javaだと、フォルダの階層とパッケージ名は正しく一致していなければなりません。
所が、.NETの場合、フォルダの階層とnamespaceに対応関係はありません。
只、まぁあえて全く合わない様にするとか、
namespaceは切るけど、コードは1つのフォルダに全部入れるとか、そういうのは無いと思いますが…。


んで。
eclipseで開発をしていると、
その辺はまぁフォルダをフラットに見せてくれる機能があるので、大変便利です。
所が、VisualStudioだと出来ネェんですなぁ…。少なくとも2003では。*1
それとVisualStudioってフォルダ階層が深いと、途端に扱いずらい感じになるんですなぁ。
フォルダを開く時にもたつく感じがあるのと、フォントが大きいせいかな…と思うんだけど…。


でも。
namespaceはちょっくら深めにしたいな…と思うのが心情。
他所様と被るのは哀しいですからねぇ。
フォルダ階層を作ると、新規クラスをプロジェクトに追加する時も、
namespaceを自動的に付けてくれるし。


今までは、namespaceの階層をフォルダ階層と共に深くするのと、
VisualStudioの使い勝手は両立しないのかと思っていたら!
このid:sugimotokazuyaさんのアイディアです。
フォルダ名に「.(ドット)」を含ませる事で、万事解決なのです。
スンバラシイ。


只、僕が.NETの作法を知らないだけカモ…と不安になって、
他のオープンソースプロダクトもちょっと調べてみたり。
まずは、log4net

src
├─Appender
├─Config
├─DateFormatter
├─Filter
├─helpers
│  └─TypeConverters
├─Layout
├─ObjectRenderer
├─Plugin
├─Repository
│  └─Hierarchy
└─spi

例えば、Appenderフォルダに入ってる、FileAppenderと言うクラスは、
namespaceが、log4net.Appenderになっているます。


おや………。


次は、nunit

src
├─core
├─extensions
├─framework
├─install
├─mocks
├─nunit-console
├─nunit-gui
├─samples
│  ├─cpp-sample
│  ├─csharp
│  ├─jsharp
│  ├─money
│  ├─money-port
│  └─vb
├─tests
│  ├─mock-assembly
│  ├─nonamespace-assembly
│  ├─notestfixtures-assembly
│  └─timing-tests
├─uikit
└─util

例えば、frameworkと言うフォルダに入っているAssertと言うクラスは、
namespaceが、NUnit.Frameworkとなっているます。


ゲフッ…。

次は、EnLibのDAAB。

Data
├─Configuration
│  ├─Design
│  │  ├─doc
│  │  └─Tests
│  └─Tests
├─DB2
│  └─Tests
├─doc
├─Instrumentation
│  └─Tests
├─Oracle
│  └─Tests
├─Sql
│  └─Tests
└─Tests

シクシクシクシク。つまり、僕が世間知らずだったって事です。


.NETの作法では、基本的に2階層以上フォルダもnamespaceも深くしないのですねぇ…。
只、全体的に見て、interface階層とその実装階層が分かれていないのが、
非常に気になります。


javaのpackageと.NETのnamespaceには、スコープの違いがあり、
より下位のnamespaceに属するclassは、
直接上位に属するclassをusing宣言*2無しに使えるってのは、
interface階層と実装階層を明示的に分けても、
実装階層のクラスをコーディングし易くする為の仕様だと思っていたんですが、
違うのでしょうか…。

*1:僕が知らないだけの可能性もアリ。

*2:javaのimport宣言みたいなの