オブジェクト指向の利点 その1 名前の衝突を防ぐ




  1. Perl




  2. オブジェクト指向



  3. 名前衝突防止

 オブジェクト指向で書かれたモジュールは、使いやすいことが多いです。オブジェクト指向で書くのは、便利だからであって「関数型の記述が古い」からではありません。

 今回からはしばらく、関数型のモジュールにはないオブジェクト指向型のモジュールの利点を挙げていきます。

1. 名前の衝突を防いでくれる

 オブジェクト指向のひとつ目の利点は、名前の衝突を防いでくれることです。関数型のモジュールのEncodeと、オブジェクト指向型のモジュールのXML::Simpleを比較してみましょう。

Encode

 Encodeをuseすると、decodeという関数が使用できるようになります。

use Encode;

my $string = 'あ';
my $dec_string = decode('utf8', $string);
XML::Simple

 XML::Simpleをuseしても、何の関数も使えるようになりません。XML::Simple->newして作成したオブジェクからはメソッドが使用できます。

use XML::Simple;
my $file = 'a.xml';
my $parser = XML::Simple->new;
$parser->XMLin($file);

 Encodeをuseすると、decodeという関数が使用できるようになるのですが、もしdecodeという関数がすでにどこかで定義されていたとしたらどうでしょうか?

 そうすると名前の衝突が起こります。一方、オブジェクト指向型のモジュールであるXML::Parserは何の関数もインポートしません。オブジェクト指向型のモジュールは利用者が名前の衝突を気にする必要がないのです。

 これが、一つ目の利点です。オブジェクト指向型のモジュールの欠点は記述が冗長になることです。Encodeのほうが、記述が短いですね。

 指針としては、プログラムの中で頻繁に利用することになり、複雑なオプションの指定がないようなものは関数型のモジュールとして作成すると記述がシンプルになります。

 一方特殊な用途で、オプション指定が複雑なものは、オブジェクト指向型のモジュールにすると、名前の衝突もなく利用しやすいです。

 たいていの場合はオブジェクト指向型のモジュールを作成したほうが良い場合が多いと思います。関数型のモジュールにする場合は良く考えてからにします。