#c #interface #macros #c-preprocessor
#c #интерфейс #макросы #c-препроцессор
Вопрос:
#define interface class
(вот еще — http://www.codeproject.com/KB/cpp/CppInterfaces.aspx )
Имеет ли это смысл? Проясняет ли это разницу между интерфейсами и реализующими их классами? Или это сбивает с толку, потому что очевидно, что чистые виртуальные классы — это интерфейсы?
Используете ли вы его? или «макросы — это зло»?
Комментарии:
1. Макросы — это не зло; злоупотребление макросами — это зло.
2. Я не думаю, что это принесет вам много пользы, и я бы счел это плохой практикой.
3. Почему бы также не попробовать их
begin
иend
макросы и не посмотреть, что это делает со стандартной библиотекой? 🙂 Не очень хорошая идея!4. Код в этой статье абсолютно ужасен; особенно.
#define EndInterface };
часть. Прощайте, подсветка синтаксиса и автоматическое отступление.5. @Вспомогательный метод, я не собираюсь его использовать 🙂 Мой босс сказал мне, что это был бы хороший способ определения интерфейсов… Я не мог с ним согласиться. С
class
ключевым словом у меня все было в порядке, и я нигде раньше не встречал этого нового соглашения.
Ответ №1:
Я бы сказал, что это не имеет смысла. «Решение», предложенное в этой статье, выглядит как ужасный беспорядок — что плохого в использовании C таким, какой он есть? Зачем вводить какие-то дерьмовые макросы, когда вы можете просто определить чистый абстрактный класс, когда он вам нужен, и покончить с этим?
Похоже, что кто-то с опытом работы на C # / Java пытался найти свой путь в C и заблудился. Это привело бы только к ошибкам и путанице, с которыми столкнулись бы разработчики, действительно знакомые с C .
Комментарии:
1. 1 полностью согласен! Язык должен использоваться как есть. Если вам больше нравится внешний вид другого языка, используйте его!
Ответ №2:
Такой макрос, как этот, является злом, потому что он скрывает истинный язык за фасадом, который нелегко распознать, если вы не знаете секрета.
Лучший способ определения интерфейсов — использовать общее соглашение, такое как присвоение им имен с помощью «I» в качестве первого символа.
Комментарии:
1. 1 Хотя я думаю, что намного лучше называть реализацию, а не интерфейс (поставив *impl в конце названия реализации …). Но это, вероятно, дело вкуса.
2. @Helper, я упомянул это соглашение, потому что оно очень распространено, но это не значит, что это единственное соглашение или даже лучшее для конкретного варианта использования. Его преимущество в том, что он позволяет одному конкретному классу реализовывать более одного интерфейса.
Ответ №3:
Я действительно не предлагаю использовать эти приемы, я считаю умником. Макросы не являются злом, но если кто-то включает ваш код и использует interface
в качестве имени переменной (почему нет?), почему он / она должен тратить 1 час на отладку с gcc -E
, потому что кто-то решил, что «интерфейс» (который не является C ) будет умнее?
Мне это не нравится.
Комментарии:
1. Обратите внимание, что в данном случае
interface
это ключевое слово в VC , поэтому, когда придет день, когда вы захотите перенести свой код в среду MS, у вас все равно возникнет эта проблема.
Ответ №4:
Специалисты по C придумали полезные идиоматические способы выполнения задач. Эти идиомы становятся частью общего диалекта, который понимают другие специалисты и с которым легко работать.
Программист на C , которого вы нанимаете с улицы, будет знать, что базовый класс со всеми чисто виртуальными методами и без реализации — это интерфейс. Они будут знать, что общедоступное наследование от него означает, что он реализует этот интерфейс. Они не будут знать безумный язык макросов, указанный в этой статье.
Я бы также добавил, что идиомы особенно важны в C из-за возможности действительно сбить вас с ног, если вы не будете осторожны. На самом деле, наиболее часто используемые идиомы в C могут быть самой мощной функцией C .
Ответ №5:
Я бы никогда не стал переопределять или заменять существующее ключевое слово — это только приводит к путанице всех, кроме автора…
Комментарии:
1. @Helper, может быть, потому, что
interface
это не существующее ключевое слово? Хотя это был не я.2. @Mark вот почему я добавил замену в свой первоначальный пост.
Ответ №6:
Это плохо. Я бы не стал его использовать, никогда.
Традиционно: Определения в C / C обычно все пишутся заглавными буквами, чтобы любому читателю было очевидно, что это define, и чтобы избежать конфликтов имен с именами функций или переменных.
Практически: это очень распространенное название «интерфейс», и его использование будет опасным именно на этом основании. Но, конечно, вы могли бы сделать имя более отчетливым, например, MY_PLATFORM_INTERFACE или что-то в этом роде.
С философской точки зрения: это явно неудачная попытка превратить C в более чистый язык ООП, такой как Java или C #, и попытка каким-то образом сделать синтаксис C более знакомым новичкам из мира Java / C #. Язык программирования — это то, что он есть. Если вы хотите внести глубокие изменения, обратитесь в комитет по стандартизации и будьте готовы предоставить убедительные доказательства. Я думаю, что такое небольшое изменение синтаксиса нелепо. Я не думаю, что кто-то не смог бы переключиться на C , потому что он не может привыкнуть к мысли, что ключевое слово interface не существует в C .
Идиоматически: Когда вы программируете на C , вы должны ожидать, что программисты C будут просматривать ваш код. Если вы введете подобную вещь, которая может выглядеть как непонятное расширение C , зависящее от компилятора, вы можете сбить с толку настоящего программиста C , и он может потратить свое драгоценное время, задаваясь вопросом, какой компилятор или расширение используется, чтобы включить это ключевое слово «interface». По возможности придерживайтесь идиоматического синтаксиса C . В противном случае вам придется комментировать рядом с каждым использованием «interface», что это ключевое слово является просто определением для «class», и в этом случае вы могли бы также просто прокомментировать объявление класса, что этот класс является интерфейсом, и просто использовать ключевое слово «class», как обычно.
Ответ №7:
Я не понимаю смысла этого делать. Как это помогает сделать код более читаемым для разработчиков? Или даже избегает делать его более неясным?
Лучше использовать соглашение об именовании классов, такое как IClassName
, которое должно быть понятным без запутывания кода разработчиками, работающими над ним.
Ответ №8:
Вместо
#define interface class
Рассмотрите возможность использования вместо этого ключевого слова Visual C __interface и напишите свой #define следующим образом:
#ifndef _MSC_VER
#define __interface class
#endif
Также добавляйте в свои интерфейсные классы обычный префикс «I» для дополнительной ясности, как предложил @jonathan-wood.
Используя этот подход, вы получаете настоящую поддержку компилятором шаблона интерфейса в Visual Studio, и все по-прежнему успешно компилируется для разных платформ. Из-за двойного подчеркивания вы также избегаете потенциальной проблемы коллизии имен символов, упомянутой @gd1.
Комментарии:
1. Или вы могли бы просто сделать ` и оставить все как есть.