12
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

お好み焼きで学ぶ名前空間

Last updated at Posted at 2018-05-19

#お好み焼きとは
小麦粉とキャベツなどを焼く定番のご飯ですね。作り方や具材によって呼び方が変わります。キャベツとネギと山芋とかが入ったのを「関西風」とか、麺が乗ってるのを「広島風」と呼んだりしますね。

僕の住んでる地域では「関西風」お好み焼きが一般的です。ので、お好み焼きといえば、いわゆる「関西風」お好み焼きでした。一方、広島の人はお好み焼きというと「広島風」お好み焼きのことを指すようになります。

これは名前空間の関係にあります。

#それぞれの名前空間
「お好み焼き」と一言で言っても「関西風」とか「広島風」という呼ばれ方をします。この「関西」とか「広島」は名前空間と呼ばれます。それぞれの名前空間でのお好み焼きの宣言は次の様になります。
####・関西の人の名前空間

namespace 関西 {
    class お好み焼き {
        ...
    }
}

####・広島の人の名前空間

namespace 広島 {
    class お好み焼き {
        ...
    }
}

それぞれの「お好み焼き」クラスは、「関西」、「広島」という名前空間に属しています。つまり、同じ名前のクラスですが別物として宣言されました。

#名前空間の使い方
####・ 東京の人同士の会話
東京出身のA君とB君がお好み焼きの話をしています。二人はお好み焼きの話をあまりしないので、誤解がないように注意しながら「関西風」とか「広島風」を付けてお好み焼きを呼びます。

すると、それぞれのお好み焼きの宣言はスコープ解決演算子を使って以下のようになります。

// 関西風お好み焼きインスタンス
関西::お好み焼き k_okonomiyaki = new 関西::お好み焼き();

// 広島風お好み焼きインスタンス
広島::お好み焼き h_okonomiyaki = new 広島::お好み焼き();

 
ここで、スコープ解決演算子「::」を「〇〇風」と訳せば、それぞれが「関西風お好み焼き」、「広島風お好み焼き」を指していることがわかりやすいです。
 
 

####・関西の人と東京の人の会話
東京出身のA君は、大阪出身のCさんともお好み焼きの話をしました。もちろん、「関西風」お好み焼きのことを話すので、ここではわざわざ「関西風」とつける必要はありません。
 
そこで、「関西」という名前空間をusing宣言してみましょう。

// "関西"のusing宣言
using namespace 関西;

// 関西風お好み焼きインスタンス
お好み焼き k_okonomiyaki = new お好み焼き();

// 広島風お好み焼きインスタンス
広島::お好み焼き h_okonomiyaki = new 広島::お好み焼き();

 

先ほどの例と違って、「関西」という名前空間のusing宣言がされているので、わざわざ「関西::」と付けなくても関西風お好み焼きを参照できるようになりました。これからたくさん出て来る関西風お好み焼きの参照をするのが少し楽になり、冗長でなくなりました。

広島風お好み焼きは先ほどと同様に「広島::」と付けています。

 
 

####・広島の人と東京の人の会話
東京出身のA君は、今度は広島出身のDさんとお好み焼きの話をしました。Dさんは「広島風」お好み焼きの話をするので、「広島」という名前空間をusing宣言するのが良さそうです。

// "広島"のusing宣言
using namespace 広島;

// 関西風お好み焼きインスタンス
関西::お好み焼き k_okonomiyaki = new 関西::お好み焼き();

// 広島風お好み焼きインスタンス
お好み焼き h_okonomiyaki = new お好み焼き();

 

これで広島風お好み焼きの参照を「お好み焼き」だけでできるようになりました。シンプルでいいですね。
 
さっきとは逆に、関西風お好み焼きの参照には「関西::」をつける必要があります。
 
 

####・関西の人と広島の人の会話
大阪出身のCさんと広島出身のDさんが出会ってしまいました。二人は熱い「お好み焼き談義」に華を咲かせようとしましたが、うまく会話が噛み合いません。なぜでしょうか。
 

// "関西""広島"のusing宣言
using namespace 関西;
using namespace 広島;

// 関西風お好み焼きインスタンス(?)
お好み焼き k_okonomiyaki = new お好み焼き();

// 広島風お好み焼きインスタンス(?)
お好み焼き h_okonomiyaki = new お好み焼き();

 
 
それぞれの名前空間に「お好み焼き」というクラスが存在するので、どちらを参照するかわからずに名前の衝突が発生しています。これではうまく会話が進まないので少なくとも一方はusing宣言はやめてスコープ解決演算子を使うほうがよいです。
 
しかし、片方だけにusing宣言を使うと、誤って違う方のお好み焼きを参照したり、もう一方が不公平に感じたりするかもしれません。最初の例の様に両方ともスコープ解決演算子を使って会話を進めましょう。

#まとめ
名前空間のusing宣言は便利だけどむやみに使うと衝突するから気をつけようね、って話でした。

お好み焼きの名前空間についてまとめてみました。味噌汁とかラーメンとかでも同じことが言えそうですね。いろんな地域の人がいると名前空間がごちゃごちゃになりやすいので、スコープ解決演算子「〇〇風」をしっかり使って会話をするのがいいでしょう。

#余談
広島の方曰く、広島の名前空間の人に「広島焼き」を参照しようとするとひょんな例外を投げられることがあるそうです(AngryExceptionなど)。つまり非推奨ということですね。呼び出さないように気をつける、もしくは例外処理をしっかりしましょう。

12
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?