web-dev-qa-db-ja.com

いつ名前をグローバル名前空間にインポートするのですか? (x :: y、x from yなどを使用)

私は約10年間、さまざまな言語でプログラミングを行っています。そして、グローバル名前空間に何かをインポートするのが良いアイデアであるときはまだ分かりません(C++ではusing x::y、Pythonなど)でfrom x import y)、だから私はほとんどそれをしません。

それが私が使用できる変数名のセットを制限するという理由だけでさえ、それはほとんど常に私にとって悪い考えのように思えます。例:C++でusing namespace std;またはusing std::string;を使用する場合、stringを変数名として使用できなくなりました(文字列ユーティリティ関数など)。

しかし、私は疑問に思っています。グローバル名前空間に名前をインポートすることが本当に意味があるいくつかの状況はありますか?経験則はありますか?

8
futlib

コードを簡略化する場合は、これを行う必要があります。名前の競合が発生する場合や、後でヘッダーファイルなどの名前の競合が発生するスコープに移動する可能性がある場合は、この操作を行わないでください。

まれだと思う人もいます。名前空間の接頭辞は、アドレスを指定するたびに誰かのフルネームを使用するなどの一般的に有用な情報を追加しないため、(ヘッダーファイル以外で)notを使用することはまれです。

このようにしましょう。クラス名としてstringが表示された場合、自動的にstd::stringまたはmycustom::stringと思いますか?それは古い格言のようなものです。ひづめの音を聞くと、シマウマではなく馬だと思います。つまり、using namespace stdはほとんどの場合、大したことではありません。 using namespace mycustomも、stdとの競合が含まれていない限り、通常は大した問題ではありません。

4
Karl Bielefeldt

Pythonでの作業では、インポートを参照するための明確で簡潔な名前を付けるために、常にx from y(zとして)を使用しています。

Fromインポートは、深い名前空間階層を持つコードベースでは非常に貴重です。これは、コードベースのスタイル標準が PEP 8 の場合に特に当てはまります。これにより、行の長さが80文字未満に制限されます。

たとえば、次のことを考慮してください。

import foo

foo.bar.baz.baf.perform_task(foo.bar.baz.quux.SOME_CONSTANT, foo.bar.alice.bob.preferred_hash_function, '42', foo.bar.magic_numbers.MY_SALT)

代わりに次のように書くことができます:

from foo.bar import baf
from foo.bar.alice import bob
from foo.bar.baz.quux import SOME_CONSTANT
from foo.bar.magic_numbers import MY_SALT

baf.perform_task(SOME_CONSTANT, bob.preferred_hash_function, '42', MY_SALT)

Python識別子は大文字と小文字が区別され、長さが無制限 であるため、インポートする数に関係なく、名前が不足することはありません。

インポートするモジュールの1つと同じ名前をモジュールで使用する場合は、インポートにエイリアスを使用できます。

from foo.bar.alice import bob as carol

def bob(x, y):
    print "running bob function"
    return carol(x, y, 42)
3
pcurry

それをいつ使うかはプログラマ次第です。特にヘッダーファイルでは、これらをまったく使用しない方がよいでしょう。しかし、私がそれを使用する場合、いくつかのケースがあります

  • 別の名前空間に何かを紹介したいとき.

    namespace cg
    {
      namespace details
      {
        //lots of stuff
        void some_cool_foo()
        {
          //uses a lot stuff from details, here because I don't want prefix everything with details::
        }
      }
      using details::some_cool_foo;
    }
    
  • 別の名前空間の一部のアルゴリズムでADLを有効にするには

    namespace n1
    {
    //some general foo
    }
    namespace n2
    {
      using n1::foo;
    //some struct
    }
    namespace n3
    {
      using n1::foo;
    //some struct
    }
    

.cppで名前空間の長い名前を書きたくない場合は、いつでもエイリアスを作成できます

namespace bl = boost::lambda;
namespace fs = boost::filesystem;
0
kassak