FishbornArchiveShelf (0.0.0.6a) | 2012-06-14 19:33 |
.NETでは、一つのソリューションに複数のプロジェクトファイルを格納し、依存設定に基づいて順次ビルドするようなプロジェクトが構築できるので、そのスタイルを採用しています。
主要なオブジェクト指向言語では、クラス型定義の中にクラス型定義が入れ子になるように記述されていきます。 ノード構造を持つことで、言語自体の予約語との衝突を回避しつつ、同じ目的の機能に対して同じ名前を繰り返し用いることが出来るようにして、 可読性を上げる事が出来ます(例えば既存の別のクラスと同じネーミングパターンを近似する事で、その仕様をエミュレーションする事を暗黙に示し、仕様検討のコストも省いたり出来ます)
VB.NETの場合、純粋な名前空間を示すNamespaceは今のところかなり制約が多いので、ArchiveShelfでは、Classを代わりに用いています。
各プロジェクトとも、共通してルート名前空間にTTMT.FASを採用しています。雑な命名なので、修正はしたほうが良いと思います。
短さを保ちたいのですが、ガイドラインによるとかなり長いものになってしまいますね…。
http://msdn.microsoft.com/ja-jp/library/ms229026%28v=vs.100%29.aspx
ArchiveShelfでは、それほど厳しいコーディング規約は設定していません…極端な話、読みやすければ全てヨシ、としています(と言うのも、マルチプラットフォームではなく.NET環境を前提にする以上、ある程度必然的に.NET風の記述に集束するからです)。またソースコードを編集するときに「新入りは末端だけ書いてシステムに手をつけちゃいけない!」なんて意識は必要ありません。一方で、平等な自由と設計保守を両立するために、少しユニークな3つのルールを設けてあります。
ArchiveShelfでは各ソースコード・モジュールがまずどんな具体的な機能であるか、よりも前に、おおまかな3つの層によって分類・構成されます。これらはそのままネームスペースを意味するクラスと一致し、またArchiveShelf配下のフォルダ構成にも合致します。まずどこに何を書くかを守ってください。
■ LogicとAppBaseの区別
まずはAppBaseにいくつか機能を実装するとします。その実装のうち、さらに抽象化して繰り返し共用できる部分を抽出できるなら、それをまたAppBaseかLogicに記述して、プロジェクト全体の再利用率を上げる方法を検討してください。抽象化した再利用部をAppBaseかLogicのどちらに置くのかは曖昧な場合もありますが、そういう時は「もしLogicパートのみをユーティリティライブラリとしてLogic.dllのように単独リリースしたら?」と仮定してみてください。例えばLogicとAppBaseのどちらにもThreadingネームスペースクラスがあります。LogicのThreadingには汎用スレッド機能のみがあります。AppBaseのThreadingにはLogic.Threadingを再利用しつつArchiveShelfのために具体的に実装されたスレッド処理機能があります。難しい時はMLで質問してください。
GUIについて掘り下げる前に、構成のルールを補足するもう1つのルールを示します。
頑張って英作文するのか、またはちゃんと構造を設計するのか、その二択にします。そして多くの場合、設計と型名と変数名をきちんとしてしまえば、ほとんどはコメントに頼らなくても英文ライクに読める素直なソースコードが出来上がります。とどのつまりは、コメントがなくても読めるのがベストです。そして一度、Grepやジャンプといったソースコードならではの読み進めテクニックを習得してしまえば、意外とコメントというのは有っても無くても、時に長いコメントはとくに、無駄に行が増えて読みにくいだけの存在になってしまうものです。
文書化ツールのためのコメント(関数説明など)は日本語で記述しても良いとします。
また、文字列定数などはコメントではないので、日本語で書くのは問題ありません。ただ、ユーザーへの視認性などがあまり関係なく、簡潔に書ける定数グループであれば、英語で統一するなどしてください(将来的なローカリゼーションコストもある程度考えていただけると幸い)。
そしてGUIのルール。GUIは、印象や気分次第で最も再配置が頻繁に起こる部分です。なので、ArchiveShelfではGUI層だけに特別な制限を課します。
ようするに、GUIだけは思わず蔑んでしまいそうなほど愚直なコードを上から下までダラダラと書き連ねてください、という事です。書き換える時に、手間を惜しむ以上の無念の舌打ちがあってはなりません。GUIは主にフローの実装を行うことになりますが、フロー制御とは、例えばフラグ管理ひとつとっても構造的な安全設計を行いにくく最もヒューマンエラーが起こるシーンになってきます。しかもGUIは気まぐれに仕様変更が起こるものです。愚直のルールとはつまり、そんなGUI製造で、どう転んでもスパゲティを回避するための重要なルールです。リッチな実装を要するGUIを書く唯一の方便は、AppBaseやLogic層に記述する理由を作りそこから呼び出す事です(例えば、何度も再利用できるコンポーネントをAppBaseに記述する、あるいは独立しても再利用できる汎用GUIコンポーネントをLogicに記述するなど)。なお、次の内容に限ってはGUI層にもそれなりに高度な実装が許可されます。
これらのルールを組み立てるにあたり、重要な基準となっているのが「そのソースコードはいつメンテを要するか」という点です。大きく分けて、ソフトウェアのソースコードは「環境に依存するとき」「個別の製品仕様に依存するとき」修正・拡張されます。この2属性の組み合わせに従う時は4つの層に分かれますが、.NETの場合は.NET環境が暗黙に約束されるので「環境依存するかどうか」は系統立てるほど考えなくても良い点になっています。なので、個別の製品仕様に依存するかだけで区分けされます。またもう一点、GUIだけはどうしても気まぐれに仕様変更を呼びます。なので、GUIもまた層として独立させ、フローと実装の境界を明確にします。このプロジェクトでは誰にでも全ての層に等しい編集のチャンスがあります。鉄壁のデグレード対策よりも、例えば新要素の開発工数がどうであれ、それを現況にコミットするための影響範囲や必要な工数だけは、誰にでもすぐに算定しやすいことを重要視しています(なお、エクストリームスタイルに近いため、自動文書化ツールとユニットテスト導入を検討しています)。
最後に、ルールというほどではありませんがお願いがあります。
舌を巻くようなネーミングは歓迎します。ただ、日本語型名とか、同じ目的の機能を示す単語の言い回しが場所によって何通りも変わったりするのは、さすがにヤメテ!
これは、一部の人間にとっては本当に当たり前すぎる話なんですが、もし、この言わんとすることがチンプンカンプンな時は、ハッカーになろう How To Become A Hacker というドキュメントをチラと読んでみると、ニュアンスをつかむ助けになるかもしれません。
もっと合理的で効果の出せる方法があれば、これらのルールもアプリケーションの構造も議論して適宜修正していきましょう。なにぶん、プロジェクト創始者が完全なオープンソース初心者(?)ですので、そのへんはヨロシクお願いしたいと思います。
[PageInfo]
LastUpdate: 2012-06-30 11:47:33, ModifiedBy: tiritomato
[Permissions]
view:all, edit:login users, delete/config:members