Я столкнулся с этой проблемой через коллегу сегодня. У него была конструкция для передней системы, которая выглядит следующим образом:OOP против проблемы с макросом
class LWindow
{
//Interface for common methods to Windows
};
class LListBox : public LWindow
{
//Do not override methods in LWindow.
//Interface for List specific stuff
}
class LComboBox : public LWindow{} //So on
Система Window должна работать на нескольких платформах. Предположим, что на данный момент мы нацелены на Windows и Linux. Для Windows у нас есть реализация для интерфейса в LWindow
. И у нас есть несколько реализаций для всех LListBox
Э.С., LComboBox
эсов и т.д. Моя реакция была пройти LWindow*
(объект реализацию) в к базовым LWindow
классу, так что он может сделать это:
void LWindow::Move(int x, int y)
{
p_Impl->Move(x, y); //Impl is an LWindow*
}
И сделать то же самое вещь для реализации LListBox
и т. д.
Исходное решение было сильно отличающимся. Оно сводилось к следующему:
#define WindowsCommonImpl {//Set of overrides for LWindow methods}
class WinListBox : public LListBox
{
WindowsCommonImpl //The overrides for methods in LWindow will get pasted here.
//LListBox overrides
}
//So on
Теперь, прочитав все о макросы быть злыми и передовой практики дизайна, я сразу же был против этой схемы. В конце концов, это дублирование кода. Но я не мог убедить своего коллегу в этом. И я был удивлен, что это так. Итак, я задаю вам этот вопрос. Каковы возможные проблемы последнего метода? Я бы хотел получить практические ответы. Мне нужно убедить кого-то, кто очень практичен (и привык делать такие вещи. Он упомянул, что в MFC много макросов!), Что это плохо (и я). Не научить его эстетике. Кроме того, что-то не так с тем, что я предложил? Если да, то как мне его улучшить? Благодарю.
EDIT: Пожалуйста, дайте мне несколько причин, так что я могу чувствовать себя хорошо о себе поддержку полокоть :(
Переход на Баунти Пожалуйста, спросите, если вам нужны разъяснения, я хочу знать аргументы за и против ООП против макроса.. :)
Я никогда не думал, что ООП против Macro будет название один день – Chubsdad 2010-12-02 10:53:21
@Chubsdad: Что делать, баловать меня и показать мне свет. – nakiya 2010-12-02 11:10:10
Хорошие вопросы. BTW, для того, что сделано в последнем примере с препроцессором, D имеет замену, называемую «mix mixins» .. и у C# тоже есть что-то похожее, не так ли? Это не только вопрос, связанный с C++. – Kos 2010-12-08 16:06:14