Имена классов и пространства имен - PullRequest
0 голосов
/ 04 октября 2009

Не вызовет ли меня проблема с использованием одного имени класса в нескольких пространствах имен? Я также пытаюсь удалить зависимость от математической библиотеки. Что вы думаете о следующем дизайне.

первый файл

#define MATH_RECTANGLE_EXISTS

namespace math {

    class Rectangle : Object2D {
    public:
         float perimeter();
         float area();

         float x,y,w,h;
    };
}

другой файл

#define GRAPHIC_RECTANGLE_EXISTS

#ifndef MATH_RECTANGLE_EXISTS
     //is this a good idea to remove dependency?
     namespace math {
         class Rectangle {
         public:
             float x,y,w,h;
         }
     }
#endif

namespace graphics {

    class Rectangle : math::Rectangle {
    public:
        void Draw(Canvas &canvas);

        void Translate(float x, float y);
    };
}

EDIT

А как насчет этого подхода для удаления зависимости?

** 1-й файл **

namespace common {
   class Rectangle {
       float x,y,w,h;
   };
}

файл математической библиотеки

#define MATH_RECTANGLE_EXISTS

namespace math {

    class Rectangle : public common::Rectangle, public Object2D {
    public:
         float perimeter();
         float area();
    };
}

графический файл

#define GRAPHIC_RECTANGLE_EXISTS

namespace graphics {

#ifndef MATH_RECTANGLE_EXISTS
    class Rectangle : public math::Rectangle {
#else
    class Rectangle : public common::Rectangle {
#endif
    public:
        void Draw(Canvas &canvas);

        void Translate(float x, float y);
    };
}

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 04 октября 2009

Я не вижу проблемы с повторным использованием одного и того же идентификатора в разных пространствах имен, для которого они были созданы.

Однако я настоятельно призываю вас НЕ «имитировать» включение math :: Rectangle. Если вам нужен файл, включите его, но то, что вы делаете, называется программированием копирования / вставки, и это приводит к большому количеству проблем, в основном потому, что ваши два фрагмента кода не синхронизированы, поэтому любое исправление ошибки / добавление функции к одному не сообщается о другом.

РЕДАКТИРОВАТЬ: ответ на редактирование;)

Из комментариев не ясно, поэтому я скажу:

Если вам нужна зависимость (потому что вы действительно ИСПОЛЬЗУЕТЕ предлагаемую функциональность), тогда вы ДОЛЖНЫ включить заголовок. С другой стороны, если вы используете наследование только для того, чтобы получить что-то с четырьмя углами и почти без методов, тогда вам лучше развернуть новый класс Rectangle с минимальной функциональностью.

Хотя я могу вспомнить крайний случай. У меня сложилось впечатление, что вас не столько интересует функциональность, сколько интересует возможность повторного использования методов в библиотеке Math, которые были адаптированы для использования в качестве параметра math :: Rectangle.

Согласно Хербу Саттеру (я думаю, что в стандартах кодирования C ++) свободные функции, которые связаны с классом, являются частью открытого интерфейса класса. Поэтому, если вы хотите эти классы, вам действительно нужно наследование.


Теперь я могу понять, что у вас может возникнуть нежелание включать библиотеку, которая может быть огромной (я не знаю вашу библиотеку по математике). В этом случае вы можете разделить библиотеку Math на две части:

  • Библиотека MathShapes, содержащая основные формы и методы, которые воздействуют на них
  • Math библиотека, которая включает MathShapes и добавляет все остальные вещи

Таким образом, вы зависите только от библиотеки MathShapes.

С другой стороны, если вы абсолютно не хотите зависимости, тогда подойдет тупое копирование / вставка, но ваше решение проверить наличие Math :: Rectangle путем проверки наличия его защиты заголовка плохо приспособлено :

  • Это работает, только если вы правильно установили охрану заголовка
  • И , если включение фактически выполняется ДО включение Graphics :: Rectangle

Обратите внимание, что в случае, когда Graphics :: Rectangle включен перед Math :: Rectangle, у вас могут возникнуть некоторые проблемы с компиляцией ...

Так что решайте, хотите ли вы зависимости.

2 голосов
/ 04 октября 2009

Это именно то, для чего нужны пространства имен, а прямоугольник - это и математический, и графический объект.

Попытка избежать включения заголовочного файла, однако, очень опрометчива. Это не достигает ничего, кроме головной боли обслуживания. Изменение в math :: Rectangle должно вызвать перестроение graphics :: Rectangle - если они заканчиваются несовпадением, и вы скрываете это от компилятора, вам будет сложнее отлаживать ошибка времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...