Я был озадачен концепцией того, как Java и С# обрабатывают пространства имен.
Во-первых, примеры загрязнения пространства имен на некоторых языках программирования:
-
using namespace std
для С++.Все в индустрии хмурятся, но новички все еще учат делать это при запуске программирования. Здесь есть вопрос о совете по обработке глобальных пространств имен
-
import math.*
в Python
При использовании класса Python мне сказали, что выполнение этого не рекомендуется, поскольку оно загрязняет пространство имен и, во-первых, позволяет получить доступ ко всем методам в математической библиотеке без Math.functionname
, но может вызвать столкновение при написании метода с дублирующимся именем, Это также, по-видимому, вызывает больше работы для интерпретатора, поскольку он импортирует все функции, даже те, которые не используются.
-
открыть модуль в Ocaml Выполнение этого на верхнем уровне или в файлах ML Может также вызвать конфликты в именовании. Особенно, если вы пишете библиотеку.
Вопрос:
Существует ли "загрязнение пространства имен" (т.е. импортирование тонны методов, которые потенциально могут вызвать конфликт при написании методов) на С# и Java (они во многом похожи)? Почему бы и нет?
И, конечно, связанные вопросы, которые слишком похожи, задают другой вопрос:
- Это потому, что, возможно, мы должны явно @Override
вещи или там какая-то превентивная мера?
-Or существует, но это не вещь, потому что она не вызывает столько хаоса, как "использование пространства имен std", и что я не знаю, что он относительно новичок в разработке программного обеспечения из академических классов?
Пример
Я обнаружил, что using
много библиотек в С#, чтобы избежать повторного ввода пространств имен для переменной, например XElement
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//the ones above are auto-generated by Visual Studio, too
using System.Xml.Linq;
избежит меня делать System.Xml.Linq.XElement
каждый раз, когда я создаю XElement. Как и нам всегда нужно делать std::cout
в С++
или на Java, где я обычно вижу: import java.util.linkedlist
, даже import java.util.*
Не будет ли это причиной загрязнения пространства имен, если мой класс используется в другом месте? Или это потому, что они будут "загрязнять" эту конкретную область класса, а не в других классах, которые могли бы импортировать или наследовать мой класс?
Я попытался найти ответ, но не смог найти его для этого, я мог бы неправильно формулировать поиск.
РЕДАКТИРОВАТЬ 4/20/2015:
Как упоминалось @RealSkeptic, выясняется, что импорт шаблонов Java также не рекомендуется. источник
В дополнение к принятому ответу и ответам ниже, импорт в Java и С# содержится внутри самих себя, поэтому даже если кто-то использует подстановочный вид импорта, который добавляет неиспользуемые имена методов в пространство имен, это не влияет на другие классы. На уровне класса, если происходит столкновение в именах, компиляторы Java и С# выдают ошибку, ссылаясь на неоднозначные импортные данные и не могут компилироваться до тех пор, пока проблема не будет решена (например, путем переименования функций).