第1章 Composite パターン 1/5
‖記事一覧‖ C#.use(better, IronPython=”WPF”)《IronPython2.6》
# IronPython で学ぶ WPF プログラミングの世界
Composite パターンには、いくつの効能があります。ここでは、if/else に象徴される典型的なハードコーディングの問題点を回避するとともに、動的な問題解決が可能になる事例を紹介します。
適用事例: Composite パターン
木構造を持つオブジェクトの集合体を管理したいときに、すぐに思い浮かぶのは古典的な〈GoF〉Composite パターンです。最初は、既存のコントロールに頼らずに、このパターンを適用した事例から紹介します。
まず、パターンの復習から始めます。古典的な Composite パターンを踏襲するための布石が、dirComposite.py です。このとき、複合/単一オブジェクトの違いを意識せずに、オブジェクトの集合体を一様に扱うための工夫が必要になります。
>ipy.exe dirComposite.py
アプリケーションを起動すると、ウィンドウが現れます。1)ボタン〔Open...〕をクリックすると、次のようなダイアログが現れます。
選択したファイルを含むフォルダーの木構造が、ビューに表示されます。ここでは、選択したファイル CompiledModule.cs を含むフォルダー Compiler を頂点とする、木構造が得られます。
その項目がフォルダーなら、名前に続いて、その傘下にあるファイルサイズの合計が表示されます。その項目がファイルなら、名前に続いて、そのサイズが表示されます。たとえば、フォルダー Compiler の傘下にあるファイルの合計が 759110 バイトであり、ファイル Binder.cs のサイズが 14248 バイトであるのが分かります。
何が問題か:大量のスクロール
テキストボックス内には、次のような情報が表示されます。ところが、全体を眺めるには、何度もスクロークする必要があり、実用的ではありません。そこで、既存のコントロールの中から、何か利用できるものがないか、探りたくなります。
+-- Compiler [759110] +-- AST [237712] +-- Binder.cs [14248] +-- ClassDef.cs [6750] +-- Expressions.cs [39651] +-- FlowChecker.cs [15439] +-- FuncDef.Generated.cs [2245] +-- FuncDef.cs [28715] +-- Node.cs [3518] +-- Operator.Generated.cs [5466] +-- Operator.cs [6216] +-- ScopeStatement.Generated.cs [2607] +-- ScopeStatement.cs [21505] +-- Statements.cs [67752] +-- Walker.Generated.cs [23600] +-- CompiledModule.cs [4887] +-- CompilerContext.cs [3912] +-- CompilerHelpers.cs [3066] +-- Generation [256579] +-- AssemblyGen.cs [11034] +-- CodeGen.cs [68231] +-- EnvironmentFactory.cs [3547] +-- EnvironmentNamespace.cs [4428] +-- EnvironmentReference.cs [3102] +-- Namespace.cs [4008] +-- NewSubtypeMaker.cs [3449] +-- NewTypeMaker.cs [48446] +-- OutputGenerator.cs [23332] +-- Slot.cs [22294] +-- SlotFactory.cs [4765] +-- TypeGen.cs [11418] +-- UserTypeGenerator.cs [48525] +-- MethodBinder.cs [55094] +-- MethodTracker.cs [5645] +-- NameConverter.cs [7151] +-- NameEnv.cs [2707] +-- NewTypeInfo.cs [3285] +-- Options.cs [9858] +-- Parser.cs [96070] +-- ParserSink.cs [1866] +-- Token.cs [6316] +-- TokenKind.Generated.cs [22274] +-- Tokenizer.Generated.cs [6289] +-- Tokenizer.cs [36399]
》こちらに移動中です《
↑TOP