グラフを書くためのライブラリの一つに、Graphvizというものがあります。
調べてみたところ、クラス図を書くこともできるようなので、Javaのリフレクションを使ってクラス図を書いてみました。
まだ単体のクラスを出力できるだけですが、関連を出力できるようになるとなかなかおもしろそうです。
参照
Graphviz
UML Diagrams Using Graphviz DOT
2014年7月28日月曜日
2014年7月21日月曜日
C#でアプリケーション設定ファイルを拡張する方法
.NETには標準で設定ファイルを読み込むためのAPIが公開されています。
そのままでも単純なキー=値形式の定義できます。
カスタマイズするには、主に次の3つのクラスを使用します。
カスタマイズした設定項目のルートになるクラスです。
ConfigurationElementクラス
設定値をもつXMLエレメントに対応するクラスです。
ConfigurationElementCollectionクラス
複数のConfigurationElementをまとめるクラスです。
そのままでも単純なキー=値形式の定義できます。
カスタマイズするには、主に次の3つのクラスを使用します。
- ConfigurationSectionクラス
- ConfigurationElementクラス
- ConfigurationElementCollectionクラス
カスタマイズした設定項目のルートになるクラスです。
class NetworkConfigurationSection : ConfigurationSection { [ConfigurationProperty("LocalHost")] public NetworkConfigElement LocalHost { get { return base["LocalHost"] as NetworkConfigElement; } set { base["LocalHost"] = value; } } [ConfigurationProperty("Networks")] public NetworkConfigElementCollection Networks { get { return base["Networks"] as NetworkConfigElementCollection; } } }
ConfigurationElementクラス
設定値をもつXMLエレメントに対応するクラスです。
class NetworkConfigElement : ConfigurationElement { [ConfigurationProperty("IPAddress")] public string IPAddress { get { return base["IPAddress"] as string; } set { base["IPAddress"] = value; } } }
ConfigurationElementCollectionクラス
複数のConfigurationElementをまとめるクラスです。
class NetworkConfigElementCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new NetworkConfigElement(); } protected override object GetElementKey(ConfigurationElement element) { NetworkConfigElement elm = element as NetworkConfigElement; if (null == elm) return null; return elm.IPAddress; } }
2014年7月14日月曜日
ちょっとしたツールを作るのに便利なPythonのcmdモジュールを使うための3ステップ
シンプルなコマンドラインツールが必要なとき、Pythonのcmdモジュールが有力な選択肢になります。ツールを実装するために必要な3ステップを紹介します。
以下Tips。必須ではありませんが、知っておくと便利です。
- cmd.Cmdクラスを継承したクラスを作る
- do_XXXメソッドを定義する
- cmdloopメソッドを呼ぶ
cmd.Cmdクラスを継承したクラスを作る
特に言うべきことはありません。普通に継承するだけです。
class HelloCmd(cmd.Cmd): ...
do_XXXメソッドを定義する
メソッド名の"XXX"がコマンドになります。
パラメータを受け取るためのargパラメータがポイントです。
def do_hello(self, arg): print 'hello, ' + str(arg)
cmdloopメソッドを呼ぶ
クラスをインスタンス化し、cmdloopを呼ぶとREPLがスタートします。
終了するにはCtrl-Cで落とします。
>>> HelloCmd().cmdloop() (Cmd) hello Taro Hello, Taro (Cmd) Traceback (most recent call last): File "", line 1, in File "/usr/lib/python2.7/cmd.py", line 130, in cmdloop line = raw_input(self.prompt) KeyboardInterrupt
以下Tips。必須ではありませんが、知っておくと便利です。
2014年7月7日月曜日
Google GuiceのBest Practicesを訳してみた - Guiceがインスタンス化するクラスのコンストラクタはできるだけ隠蔽する
Guiceがインスタンス化するクラスのコンストラクタはできるだけ隠蔽する
次のシンプルなインターフェイスについて考える。
一般的には、次のようなpublicクラスで実装することだろう。
ちょっと見ただけでは、このコードには何も問題がないようにみえる。不幸なことに、
よく知られたことだが、コンストラクタをpublicにするといいことは何もない。publicコンストラクタは、ソースとともに誤った使用方法を広めてしまう。誤った使用方法には次のようなデメリットがある。
正すためには、単純に実装クラスとコンストラクタの両方の可視性を制限すればよい。通常はパッケージプライベートを選択すればよく、次のような効果が得られる。
参照
Keep constructors on Guice-instantiated classes as hidden as possible.
次のシンプルなインターフェイスについて考える。
public interface DataReader { Data readData(DataSource dataSource); }
一般的には、次のようなpublicクラスで実装することだろう。
public class DatabaseDataReader implements DataReader { private final ConnectionManager connectionManager; @Inject public DatabaseDataReader( ConnectionManager connectionManager) { this.connectionManager = connectionManager; } @Override public Data readData(DataSource dataSource) { // ... read data from the database return Data.of(readInData, someMetaData); } }
ちょっと見ただけでは、このコードには何も問題がないようにみえる。不幸なことに、
よく知られたことだが、コンストラクタをpublicにするといいことは何もない。publicコンストラクタは、ソースとともに誤った使用方法を広めてしまう。誤った使用方法には次のようなデメリットがある。
- リファクタリングが困難になる
- インターフェースによる抽象化を破壊する
- ソースとの結びつきを強める
正すためには、単純に実装クラスとコンストラクタの両方の可視性を制限すればよい。通常はパッケージプライベートを選択すればよく、次のような効果が得られる。
- クラスを同じパッケージ内のModuleでバインドする
- クラスを対象とする単体テストは、直接インスタンス化する
参照
Keep constructors on Guice-instantiated classes as hidden as possible.
登録:
投稿 (Atom)