C ++ IDE, поддерживающая совет Скотта Мейера: предпочитайте функции, не являющиеся членами, а не друзьями - PullRequest
5 голосов
/ 11 ноября 2009

Аргумент Скотта Мейера о том, что функции, не являющиеся членами, увеличивают инкапсуляцию и допускают более элегантный дизайн (дизайн), кажется мне очень верным. Смотрите здесь: Артикул

Все же у меня есть проблемы с этим. (И, похоже, и другие, особенно разработчики Библиотеки, которые обычно полностью игнорируют это)

Код обычно выглядит лучше и логичнее, когда я использую функции-члены. Это может быть приобретенным вкусом, и просто нужно привыкнуть сначала смотреть на алгоритмы, а затем на объекты. (Дрожь)

Так что, возможно, у меня есть только одна проблема:

С помощью функций-членов me AND my IDE знает, что может делать класс.

Для меня это огромно! Я не использую ничего, что не поддерживает завершение кода функции-члена для программирования. В хорошо разработанных библиотеках это полностью заменяет документацию для меня. И даже если бы я посмотрел на api doc, просмотр списка участников кажется абсолютно естественным, логичным, и я могу быть уверен, что это конец. Если метода там нет, я могу с уверенностью предположить, что его не существует, и я могу написать своего не-друга, не являющегося другом.

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

Я не видел IDE, который мог бы сказать мне, какие функции не являются членами, работают с определенным классом.

И это на самом деле мой вопрос: Есть ли IDE (или функция IDE), которая помогает с этим соглашением кода?

Ответы [ 4 ]

5 голосов
/ 11 ноября 2009

Я встречал эту вещь в прошлом.

Тогда моя идея была довольно неуклюжей, но она сделала свою работу: пространства имен.

То, что я сделал, было

namespace myclass
{
    class MyClass
    {
        ...
    };

    MyClass operator+(const MyClass& lhs, const MyClass& rhs){...}
}
4 голосов
/ 11 ноября 2009

Мейерс, безусловно, прав, что использование нечленов увеличивает инкапсуляцию, сводя к минимуму количество функций, которые потенциально могут получить доступ к частному состоянию. Однако инкапсуляция является лишь одним из многих (часто противоречивых) аспектов качества кода.

Он делает правильное замечание, что разработчик библиотеки не обязательно будет писать функции для каждого возможного использования класса (поскольку могут быть случаи, о которых они не думают). Это означает, что вам, возможно, придется самостоятельно добавлять вспомогательные функции, как если бы они следовали совету Мейерса. Так что нет никакой возможности узнать, что набор функций-членов и друзей действительно является единственным набором функций, которые действуют на класс.

В качестве технолуддита, «IDE», которую я предпочитаю (текстовый редактор и оболочка), имеет следующую «особенность», которая довольно хороша для поиска функций, действующих в классе:

find . -name '*.h' -o -name '*.cpp' | xargs grep MyClass

Я не могу комментировать "настоящие" IDE.

1 голос
/ 11 ноября 2009

Попробуйте использовать Visual AssistX, у него есть эта приятная особенность: щелкните правой кнопкой мыши на вашем классе, Refactor (VA X) -> Найти ссылки. Это на самом деле работает.

1 голос
/ 11 ноября 2009

Я не верю, что в IDE возможно рассказать вам обо всех функциях, не являющихся членами, которые вы можете использовать со своим классом. Используя шаблоны, просто слишком сложно составить список всех таких функций. IMO, самое лучшее, на что вы можете надеяться, - это чтобы IDE перед компиляцией сообщала вам, является ли вызов, который вы пытаетесь сделать, действительным. И даже это требует серьезного процесса, подобного компиляции внутри IDE.

Я понимаю, как вы используете функции-члены в качестве замены документации в классических классах. Но дизайн, который предлагает Скотт Мейер, касается не классов, которые предоставляют сложные функции, а только базовых. Сложные функциональные возможности приходят из других мест, оригинальный класс может знать или не знать об этом, это не имеет большого значения. Это все часть идеи. Но ты прав. В этом случае вновь возникает необходимость в продуманной документации.

...