2012-03-07 14 views
3

私はについてのアドバイスを求めています。のシンボリックリンクなしでファイルディレクトリを表現するための優雅なデザインがあります。/A/B/Cのサブディレクトリ)。私の現在の考え方は、この方向に向いています。ディレクトリツリーのデータ表現の優雅なデザインを求める

ルートパスが与えられています。os.path.walk()トップダウンです。 2つのクラスは私が興味を持っているノードタイプを表し、親子関係を追跡します。

class ADir(object): 
    def __init_(self, name, parent=None): 
     self.name = name 
     self.parent = parent 
     self.children = [] 
    def add_child(self, id): 
     self.children.append(id) 

class AFile(object): 
    def __init_(self, name, parent=None): 
     self.name = name 
     self.parent = parent 

私は私にそれはすべてが非常に多く、既存の、一般的なツリーアルゴリズムの再実装ように感じるように開始さなどのディレクトリ/ファイルの位置を与える機能、既存のディレクトリの再実装のチェックをしなければなりません。

Trawling Trough StackExchange、Googleなどは、さまざまなアプローチのホストをもたらします。私が見つけたものはどれも、ディレクトリ構造が与えられている自然な境界線を利用していないようです。

ディスカッション、ブログエントリ、およびコードへのあらゆる考えや指針は高く評価されます。

+0

妥当と思われるもの私はその質問が何であるか分かりません。たぶん、あなたが達成しようとしていることを説明したら... –

+0

Pythonのデータモデルにファイルディレクトリ構造をマッピングするときに、私が車輪を再発明しようとしているのが私の質問の要点です。元の仕様は、ディレクトリ構造をXMLに変換し、_lxml.etree_のようなものでクエリを処理することを提案しました。私は、特にペイロード(ファイルのセットに対する操作)をエレガントにつけることができないので、私には過酷で不器用なようです。たぶん、これは私のかなり広い質問に対する背景が何であるかを少し良く説明します。 – Axial

答えて

2

今日の言語でのツリー構造の問題は、それらのすべてに合わせて1つの構造を作成することが難しいことです。 (親ポインタの有無にかかわらず、子はペア(バイナリまたは赤黒のツリー)またはリスト(ルックアップキーのインデックス付き/なし)

トラバーサルを定義することは可能ですがすべてのアルゴリズムではアルゴリズムごとに異なる実装が必要です。

次に、ツリー内の要素を調べる問題があります。インデックス(バイナリツリーではかなり役に立たない)で動作していますか?どのように私たちは相対的なパスを表現するのですか?

これは私たちが多くの現代的な言語で構築されていて木はないという理由からです。 Scalaは、一般的なツリータイプの概念をサポートする数少ないオブジェクト指向言語の1つですが、バイナリツリーだけであり、それも幾分奇妙です。

さらに、ほとんどのオブジェクト指向言語は、既存のクラスのフラグメントからクラスを構築するのに十分な方法をサポートしていません。あなたは継承することができます(しかし、すべてを取得する)、複数の継承(さらに多くの問題)、mix in(いくつかの欠点なしで複数の継承のいくつかの機能)。しかし、実際には次のような特徴がありません。タイプFooからメソッドx()を取得し、メソッドy()BarからBazにビルドします。

OOベースのツリーベースクラスでは、特定のユースケースに対して多くの微調整が必​​要ですが、同じ関数を直接実装するには同じ量(またはそれ以下)のコード行が必要になります。

+0

Aaronありがとう、これは非常に有用であり、カスタマイズされた実装が必要であるという私の疑惑を検証します。Scalaへのポインタとその汎用ツリー型も面白いです。 – Axial

関連する問題