̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2016/ 6/20 通巻715号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    名前空間のエイリアスは省略するな - リーダブルコード(44) グローバルな変数や関数は、既存のコードやライブラリを再利用したときに 名前が衝突してしまう問題が発生する可能性があります。 その問題が発生する 可能性を低くする方法の1つが、名前空間ですが、注意しないとリーダブル ではなくなる(読みにくくなる)可能性があります。 C#言語(.NET Framework)では、new 演算子にクラスを指定するときや、 静的メソッド(関数相当)を呼び出すときに、名前空間(namespace)を using ディレクティブに指定するか、フル ネームを指定しなければなりません。 たとえば、次のように記述します。 using System.IO; var file_name = (string) Path.GetFileName( @"C:\Folder\File.txt" ); または、次のように記述します。 var file_name = (string) System.IO.Path.GetFileName( @"C:\Folder\File.txt" ); ちなみに、@ は、\ によるエスケープをしない文字列(逐語的リテラル文字列) です。 C#で使えます。 このようなコードが一般によく見られますが、実は、どちらもよくありません。 なぜなら、もっとよい記述方法があるからです。 二者択一に制限することは、 よくありません。 それは、エイリアスを使った記述です。 using io = System.IO; // Alias "io::" var file_name = (string) io::Path.GetFileName( @"C:\Folder\File.txt" ); なぜ、この記述がよいのか説明していきましょう。 名前が衝突する、とは、たとえば、ParseXML(XMLを解析する)という関数を アプリケーションで作成したとき、他のモジュールでも別の意味の ParseXML 関数を定義していたら、どちらの ParseXML 関数を呼び出したらよいか区別 できなくなるため、コンパイラーが重複定義エラーを出すことなどによって 名前が衝突することです。 一方で、ClassA の ParseXML メソッドと、ClassB の ParseXML メソッドは、 同じ ParseXML という名前ですが、重複定義エラーにはなりません。 なぜなら、 クラスで区別できるからです。 たとえば、オブジェクトの変数 obj から ParseXML メソッドを呼び出すときは、obj が ClassA か ClassB かによって、 どちらの ParseXML メソッドを呼び出せばよいかを区別できます。 var obj = new ClassA; obj.ParseXML(); 名前空間は、区別する機能だけでなく、記述を簡単にする効果もあります。 身近な例では、学校や会社ではフル ネームではなく名字だけを呼ぶことです。 席の近くの人を口頭で呼ぶときや、同じ課の中にメールするときの名前空間では、 名字だけでよいでしょうが、同じ苗字の人が複数いる広い名前空間ではフル ネーム を使います。 また、広く Cc(カーボン コピー)したメールでも、先頭で宛先に フルネームを書いておけば、文章中は名字だけで済みます。 また、日本から電話を掛けるときは、わざわざ日本の国際電話番号(国番号)を 入力しないで済みます。 00 から始まる国際電話の場合は、国番号を必要と しますが、それ以外の番号のときは日本の国番号の入力は不要です。 最近では、 携帯電話が主流になり、市外局番を省略できるケースがレアになってしまい、 市内であっても市外局番を書くことが多くなりましたが。 上記の C# のコードのように、フル ネームが必要になるときは、using ディレクティブで System.IO という名前空間が指定(限定)されていないとき です。 Visual Studio では、参照するクラスや呼び出すメソッドの名前にカーソルを 合わせると、状況に応じたフル ネームが表示されます。 これは非常に便利なの ですが、Visual Studio がない状況、たとえば、ドキュメントの中のコードや Web ブラウザーでサンプルコードを読むときは、フル ネームが表示されません。 このように、状況によってフル ネームが必要になるケースとならないケース があります。 フル ネームが分かる状況であれば、フル ネームは必要ありません。 また、名前空間を使って名前を分かりやすくすると、それゆえ一般的な単語を 使うことが推奨されるため、検索するときに他の情報(ノイズ)までヒットして しまいます。 たとえば、上記の C# のコードでは、Path.GetFileName が記述されていますが、 Path を検索してもクラスの詳細な説明にたどり着くことはできません。 MSDN で検索すれば、たどり着けますが、System.IO.Path だけでなく System.Windows.Shapes.Path などの候補も出ます。 System.IO.Path を検索すれば、マイクロソフトのライバルである Google でさえ 詳細な説明に正しくヒットします。 using ディレクティブに System.IO が記述されているので、名前空間が省略されて いても System.IO.Path をキーワードに入力できる、と思われるかもしれませんが、 一般のコードは using ディレクティブが多く記述されているため、そのすべての 検索を試していくなんて、できません。 しかし、System.IO.Path.GetFileName のようにフル ネームを必須で記述する のは、読みやすくありません。 System.IO. を何度も読まされることになり、 くどくなるからです。 var name1 = (string) System.IO.Path.GetFileName( @"C:\Folder\File.txt" ); var name2 = (string) System.IO.Path.GetFileName( @"C:\Folder\File.txt" ); そこで、名前空間のエイリアス(別名)を使います。 XML の名前空間のプレフィックス (接頭辞)と同じ機能ですが、名前空間のフル ネームに別名を付けるという機能です。 次のコードの io が名前空間のエイリアスです。 using io = System.IO; // Alias "io::" var file_name = (string) io::Path.GetFileName( @"C:\Folder\File.txt" ); Alias "io::" というコメントを書いておくことを推奨します。 なぜなら、io:: と 書いてあるコード(上記の io::Path)からコピーした io:: で、エイリアスの定義も 検索できるようになるからです。 :: があれば、ローカル変数ではないことが明示的に分かります。 もし、Path というローカル変数が ClassA で定義されていたら、 Path.GetFileName は、System.IO.Path クラスのメソッドではなく、 ClassA のメソッドになります。 ローカル変数ではないときは、:: を必須にする というコーディング ルールにすれば、Path.GetFileName の Path はローカル変数 であるという判断も一瞬でできるようになります。 this を省略しないルールと 同じ効果ですね。 00 から始まる電話番号には国番号も含まれると判断できること とも同じ効果です。 また、名前空間を省略したほうが簡単に記述できるというメリットがあるのに 推奨しない理由は、市外や携帯電話からかけるケースが多くなったために 市外局番を省略しなくなったことと同じです。 最新のスマホでは、現在いる場所 が測定できるため、場所に応じて市外局番を省略して表示することは可能ですが、 そんな機能はありません。 場所(状況)がコロコロ変わるときは、逆にややこしく なってしまうからです。 省略することや略語を使うことは、同じ意味のケースが 多いときに有効になるのです。 また、エイリアスは、1文字でも構いません。 よく、変数名は3文字以上にすること (ただしループ変数 i は除く)というコーディング ルールがありますが、そのような ルールにする必要はありません。 なぜなら、:: で io が名前空間のエイリアスである ことが一瞬で分かり、そのフルネームが記述されている場所は同じファイルの先頭付近 の1か所だけだから、検索ノイズ(誤ったヒット)が派生しないからです。 using app = MyApplication; // Alias "app::" using col = System.Collections.Generic; // Alias "col::" using d = System.Diagnostics; // Alias "d::" using s = System; // Alias "s::" さらに、using ディレクティブをエイリアスの ABC 順にソートしておくとエディター の検索機能すら必要ありません。 また、1文字のほうが一時記憶には適しています。 エイリアスを統一しておくと、略語を使うケースが多くなるため、さらに覚えやすく なります。 ただし、重複する可能性もあるのでルール(強制)にはしません。 エイリアスを必須にするデメリットをあえて挙げるとすれば、名前空間が統合または 分割されたときに、一部のエイリアスを変更しなければならないことです。 ただし、 これはレア ケースであるため、エイリアスを省略するほうが、デメリットが大きい でしょう。 残念ながら、Visual Studio では、エイリアスを省略することが推奨されます。 おそらく、Visual Studio を使ってもらうための戦略なのでしょう。 ソース: https://ja.wikipedia.org/wiki/名前空間 http://www.atmarkit.co.jp/fdotnet/csharp20/csharp20_07/csharp20_07_01.html 注目ニュース 一覧 ◇ GPSが届かない駅構内でも現在地がわかる。Android版 Yahoo!地図アップデート。 http://japan.cnet.com/news/service/35084053/ http://www.gizmodo.jp/2014/05/indooratlas.html … 磁気指紋のフロアマップをクラウドに登録した建物でのみ使用可能。 ◇ Pokemon GO は7月にも配信へ 専用デバイス Plus 7月末発売。 http://www.itmedia.co.jp/news/articles/1606/16/news073.html … 売上高で子供がどれだけスマホを持っているかが明らかになりそう。 ◇ Bluetooth 5 正式発表。到達距離と転送速度に加えてブロードキャストも強化へ。 http://japan.cnet.com/news/service/35084419/ … 到達距離が広がりすぎると、新たなセキュリティが必要になりそう。 ◇ アップルの App Store、アプリサブスクリプションの収益分配率を変更へ。 http://japan.cnet.com/news/service/35083977/ http://jp.gamesindustry.biz/article/1606/16061001/ … ユーザーが2年目のサブスクリプションを払ったときは、手数料を軽減。 ◇ 三日坊主を卒業できる Google カレンダー、新機能。人の生き方を機械学習が改善する。 http://japan.cnet.com/interview/35083880/ … 定期的な予定をインテリジェンスにしたら余計なお世話機能にならなければいいが。 ◇ オープンソース安全神話信奉者が見なかったことにしたい辛い現実。 http://techtarget.itmedia.co.jp/tt/news/1606/13/news10.html … だれかが対応してくれるだろうという傍観者効果で誰も対応しない。 ◇ マイクロソフト、.NET Core のバグ発見報奨金プログラムを発表。 http://japan.zdnet.com/article/35084009/ … 報奨金がないと見つけても報告しないだろう。 ◇ iOS 10、iPad モデル別シェア約40%をサポート対象外の可能性。 http://japan.cnet.com/news/service/35084265/ … アップルはハードウェアが収入源なので、そのアップデートを強要する。 ◇ Siriの開放は遅すぎた?人工知能競争で後手に回るApple。 http://www.itmedia.co.jp/news/articles/1606/16/news067.html … 秘密主義でソフトウェア エンジニアを確保するのは難しいのかも。 ◇ 男性向けファッションレンタル leeap の実力は?30歳・体験レポート。 http://japan.cnet.com/sp/cnet_antenna/35083729/ … 年に数回しか買わない人をターゲットにしたほうが薄利多売で成功しそう。 ソフトウェアデザイン館 Sage Plaisir 21 ホームページ >>> http://www.sage-p.com/ メルマガ >>> http://www.mag2.com/m/0000083983.html ブログ >>> http://blog.livedoor.jp/sage_p/ ツイッター >>> http://twitter.com/Ts_Neko ダウンロード >>> http://www.sage-p.com/freesoft.htm サポート掲示板 >>> http://www.sage-p.com/kg_ban09/z6037C8.cgi 東日本大震災 >>> http://www.sage-p.com/saigai.html メール >>> ts-neko◇sage-p.com ←◇を@に変えてください 緊急メールは件名に「うどんメール」を付けてください。 このメルマガの登録・解除 - http://www.mag2.com/m/0000083983.htm