無意識理解から脱する【名前空間 編】

Blog Single

今取り組んでいるプロジェクトでPHPのPhalconフレームワークを使用しています。
そのプロジェクトでは作成するクラスほぼ全てに名前空間 namespaceを適用しています。
PHPを使用している方には馴染みがあると思いますが、PHPでは冒頭に名前空間の宣言をするので非常にわかりやすいですよね。

<?php
namespace Miyaji\Models;
// ...

しかし他の言語では名前空間の宣言がわかりにくい!!
「当たり前すぎていちいち認識して使っていない」という方も多いと思います。
かく言う私もその一人です。
ちゃんと意識して使っていこう!というわけで、今回はおさらいしていきます。

名前空間とは

組み込みのクラス/関数/定数 あるいはサードパーティのクラス/関数/定数の名前が衝突する
解決するためには、Extra_Long_Names のような長い名前をつけなければならない
PHP公式リファレンスより抜粋

どの言語においても、名前空間とは上記の問題を解決して各要素を一意にする識別名のことを指します。
なんの機能であるかわかりやすく命名しようとすると、名前が同じものも当然出てきますよね。
そういう時に名前空間は非常に便利です。
しかもいくつにも入れ子にした名前を設定できるので、確実に被らないようにできます。
入れ子にしすぎると使いにくいですが…

言語ごとに見る名前空間

今では名前空間はあって当たり前のように感じますが、言語によっては割と最近になってから追加されたものもあります。
今回は社内でよく使われている言語のいくつかをピックアップして、それぞれの名前空間の取り扱いを見てみましょう。

PHP

冒頭でも書いた通りPHPの名前空間は非常にわかりやすいです。
基本はファイルの一番始めにnamespaceを宣言しているので、どの名前空間にあるのか一目瞭然ですね。
基本的な書き方は次のような感じです。

// a.php
namespace Miyaji\A;

class Test {
    public function call() {
        echo 'A Test call!';
    }
}

function call() {
    echo 'A call!';
}
// b.php
namespace Miyaji\B;

require_once('./a.php');

// use宣言をして使用する
use Miyaji\A\Test;
$test = new Test();
$test->call();

// \でグローバル空間を指定して使用する
\Miyaji\A\call();

Java

Javaには直接的にnamespaceというものはありません。
その代わり、名前空間の役割として機能しているのはpackageです。
namespaceの命名規則とも少し異なっていて、小文字しか使用できません。
呼び出し方をみてみると、namespaceと確かに似ていますね。

// PackageTest.java
package miyaji.a;

public class PackageTest {
    public String getName() {
        return "pacakage:miyaji.a class: PackageTest";
    }
}
// SampleTest.java
public class SampleTest {
    public static void main(String[] args) {
        // パッケージ「package1」のクラス「Package1301」を使用するときは次のようになります。
        miyaji.a.PackageTest pk = new miyaji.a.PackageTest();

        System.out.println(pk.getName());
    }
}

JavaScript

JavaScriptにも名前空間はありますが、PHPと違い「namespace」とはっきり書かせてくれません。
他の言語の名前空間と違いはありませんが、JavaScriptの通常のオブジェクトとの違いがぱっと見わかりにくいです。
名前空間の宣言時には競合していないかを確認の上定義します。

// 名前空間の宣言
var miyaji = miyaji || {};

miyaji.method = {
    call: funcrtion() {
        console.log('miyaji.method call!');
    }
}

miyaji.method.call();

最後に

言語によって定義の仕方や呼び出し方もさまざまなので、忘れがちになりますね。
備忘録程度の簡単な話ではありましたが、これで明日から
「あ、これ名前空間だ」
とコードを書きながら思い出していただけるかなと思います!

参考

Posted by Mao Miyaji
千葉にある夢の国を愛して止まない、元「魚のお姉さん」のエンジニア。PHP, TypeScriptメインで、暇さえあれば色々な言語を一かじり。

Other Posts: