Introduction
背景と動機
.NETが備えているコレクションは線形コレクションです。コレクションはハッシュセット型、配列型、リスト型、辞書型など様々ありますが、本質的には線の構造となっています。
一方、一般のファイルシステムは木形コレクションと捉える事ができます。要素はノードで管理され、階層構造になっています。
この様な木形コレクションをサポートするライブラリは既存でいくつか存在しますが、ファイルシステムのようなモデルのライブラリを見つけることができませんでした。
そこで私はファイルシステムを論理的に解釈し、純粋なオブジェクトとして扱える木型のコレクションとして実装できないかと考えアイディアをまとめました。
階層構造のデータを柔軟に管理し、直感的にアクセスできる仕組みを作ろうと考えたのです。
ユースケース
VirtualStorageLibrary
は、以下のような多様なユースケースでの活用が期待されます。
- 自然言語処理(NLP)
- ナレッジベースシステム
- ゲーム開発
- 階層型クラスタリング
- 教育と学習
これらの詳細なユースケースとその具体的な活用方法については、READMEを参照してください。
設計の方針
VirtualStorageLibrary
は、オンメモリで動作するツリー構造をベースにしたコレクションを提供し、アプリケーション開発者がデータを効率的に管理できるよう設計されています。直感的なAPIを重視し、柔軟性、拡張性を考慮した設計を採用しています。
単純性
ノードタイプのサポート
VirtualStorageLibrary
では、それぞれの役割に応じてノードの種類(ノードタイプ)を3つ定義しました。それは、アイテム、ディレクトリ、シンボリックリンクです。このように、ノードの役割をある程度具体化し限定することで、その役割に応じた実装が可能になります。これは、一つのノードに複数の役割を持たせる方式よりも単純で、効率的に動作させることができるという利点があります。VirtualItem<T>
: アイテムを表すノードです。ユーザー定義型T
を内包しています。VirtualDirectory
: ディレクトリを表すノードです。VirtualSymbolicLink
: シンボリックリンクを表すノードです。
ノード間の疎結合性
ノード間の疎結合性とは、ノードの依存関係を最小限に抑えることで、ノード管理の柔軟性、効率性を高める性質を意味します。一般的にツリー構造は、ノード自身が他のノードへの参照を保持し、ノードの探索をサポートします。VirtualStorageLibrary
では、ディレクトリのみが自分の子供達のノードへの参照を保持します。つまり、ディレクトリは自分の子供達のノードにししか関心を示しません。これは、ノードツリーのコピー、移動等の操作を効率的に実行できる利点があります。
柔軟性
- ユーザー定義型のサポート
VirtualStorageLibrary
のメインとなるVirtualStorage
クラスは、ユーザー定義型クラスを扱うジェネリック型クラスです。
ユーザー定義型はどのようなクラスを定義しても構いません。
これによって柔軟にアプリケーションデータを扱うことができます。 - ディープクローンのサポート
VirtualStorageLibrary
は、一般のファイルシステムのように各ノードが個々の実体を持っています。
つまり、複数のノードが同じ実体を参照する、という事はありません。
ノードをコピーした場合、ノードのディープクローンが実行され、コピー元と同じ内容のノードが新たに作成されます。
アイテムに内包されているユーザー定義型クラスはIVirtualDeepCloneable
インターフェースを実装する事によって、ディープクローンに対応させる事ができます。 - パス文字の定義
デフォルトで定義しているパス文字は、一般のファイルシステムで使われているセパレータ/
、ドット.
、ドットドット..
、ルート文字/
に準じて初期設定されています。
これらはVirtualStorageSettings
クラスで初期設定されており、ライブラリ初期化後はVirtualStorageState
クラスで設定を変更する事ができます。 - ノード名禁止文字、ノード名禁止文字列の定義
デフォルトで定義しているノード名禁止文字は、ドット.
、ドットドット..
、ノード名禁止文字列はセパレータ/
が初期設定されています。
これらはディレクトリにノードを追加する際のノード名の有効性チェックで使用されます。
これらはVirtualStorageSettings
クラスで初期設定されており、ライブラリ初期化後はVirtualStorageState
クラスで設定を変更する事ができます。 - ノードリスト表示条件の定義
ノードリストはあらかじめ設定された表示条件に従って取得する事ができます。
表示条件は以下の要素で構成されます。
デフォルトは、フィルタリングなし、グルーピングあり(昇順)、ノード名プロパティによるソート(昇順)です。
これはVirtualStorageSettings
クラスで初期設定されており、ライブラリ初期化後はVirtualStorageState
クラスで設定を変更する事ができます。- フィルタリング
ノードタイプ(ディレクトリ、アイテム、シンボリックリンク)をOR条件で指定する事によってフィルタリングする事ができます。 - グルーピング
ノードタイプによってグルーピングするか否かを指定できます。また、グルーピングした際には、グループの順番について昇順/降順を指定できます。 - ソート
グルーピングした際にはグループ内、グルーピングしない場合は全体に対して、指定したプロパティでソートする事ができます。その際、昇順/降順を指定できます。
- フィルタリング
拡張性
- ワイルドカードのサポート
パスはワイルドカードを使用する事ができます。
ワイルドカードを含むパスは、ワイルドカード展開用のAPIを呼ぶことにより、複数の具体的なパスに展開する事ができます。
ノードを操作する各APIは、展開されたパスを渡すことによってノードの操作を行うことができます。 - ワイルドカードマッチャーの定義
ワイルドカードは、IVirtualWildcardMatcher
インターフェースを実装したワイルドカードマッチャークラスによって処理されます。
VirtualStorageLibrary
では、以下の二つのクラスを事前に用意しています。
デフォルトはPowerShellWildcardMatcher
です。
これはVirtualStorageSettings
クラスで初期設定されており、ライブラリ初期化後はVirtualStorageState
クラスで設定を変更する事ができます。
また、IVirtualWildcardMatcher
インターフェースを実装する事より独自のワイルドカードマッチャーを使用する事も可能です。DefaultWildcardMatcher
クラス
正規表現をそのまま使用するワイルドカードPowerShellWildcardMatcher
クラス
PowerShellで採用されているワイルドカード
現在の状況と今後の予定
現在 (2024/08) 、V1.0.0で実装すべき機能は全て実装済みです。
V0.8.0では数件のバグ修正と、30件近い機能改善、リファクタリングが残っている状況です。
これらの作業を進めた上で、V0.9.0に向けた残作業を消化し、V1.0.0での安定版リリースを目指します。
なお、この期間中、ライブラリで提供している機能のクラス名、メソッド名、プロパティ名等は予告なく変更、統合、廃止する事があります。
その場合、リリースノートに詳細を掲載するのでご確認ください。
詳細は、現在の問題点と改善案を参照してください (日本語)。
拡張の可能性
ロードマップ
- V0.9.0: 現在残っているバグ修正、機能改善、リファクタリングを中心に進めます。
- V1.0.0: ユーザーからのフィードバックを基に安定版を予定しています。
- 長期計画: インデクサーの機能改善、ノードの派生クラス、例外処理のスマート化等を計画しています。
フィードバックとコミュニティ協力のお願い
VirtualStorageLibrary
は、皆様からのフィードバックと協力により成長していくプロジェクトです。次のバージョンで優先して取り組むべき機能や改善点について、ぜひIssueやディスカッションでご意見をお寄せください。
また、コードへの貢献、ドキュメントの改善、翻訳の手伝いなど、さまざまな形でのご協力をお待ちしています。プレリリースの段階にある今、ユーザーの皆様の参加が非常に重要です。積極的なご参加をお願いいたします。
ご協力いただきたい内容
VirtualStorageLibrary
の成長には、皆様のフィードバックと協力が欠かせません。以下の方法でプロジェクトに貢献していただけます。
- フィードバック: 使用感や機能についてのご意見をお寄せください。
- バグ報告: 発見されたバグについてご報告ください。
- 機能の改善、追加の要望: 新しい機能の提案や、既存機能の改善要望をお待ちしています。
これらのご意見は、Issueにて受け付けています。積極的なご参加をお願いいたします。
技術的な質問について
技術的な質問がある場合は、StackOverflowをご利用ください。
c#
、.net
、tree
、shared-libraries
、generic-collections
などのタグを組み合わせていただくと、質問が見つけやすくなります。
プルリクエストの受け付けについて
現在、複数人による開発体制が整っていないため、プルリクエストは当分の間、受け付けておりません。
今後の体制が整い次第、対応を進めてまいりますので、ご了承のほどよろしくお願いいたします。
長期ビジョン
VirtualStorageLibrary
は、ツリー構造の管理をさらにシンプルかつ直感的にし、アプリケーション開発者の創造的な活動を強力にサポートすることを目指しています。今後、追加したい機能は既にいくつか挙がっており、想定されるユースケースも既に述べた通りです。しかし、このライブラリの活用方法は無限に広がり、使う中で新たなアイデアが生まれるでしょう。
近い将来、このライブラリが多様な分野のアプリケーションに組み込まれ、さまざまなソリューションの一部として貢献できることを願っています。