При написании некоторых функций я нашел ключевое слово const в таких параметрах:
void MyClass::myFunction(const MyObject& obj,const string& s1,const string& s2,const string& s3){
}
часто вызывает разделение строки на 2 строки в IDE или vim, поэтому я хочу удалить все ключевые слова const в параметрах:
void MyClass::myFunction(MyObject& obj,string& s1,string& s2,string& s3){
}
это действительная причина не использовать const? Можно ли поддерживать объекты параметров без изменений вручную?
c++
coding-style
const
ggrr
источник
источник
const
вас есть сильный намек, что вам не нужно беспокоиться о том, как это может быть изменено в функции.Ответы:
Читаемость является веской причиной, чтобы научиться использовать пробелы:
Расположенные там параметры не будут перепутаны с телом функции. Размещая их в другой строке, вам не придется менять положение, когда вы меняете имя
myFunction
на более информативное. Пользователи не оценят изменения настроек положения, когда они не изменились.const
что-то значит Не выбрасывайте это только потому, что у вас нет места и идей. Читаемость - это главное, но ломать голову от ее имени - просто сдаться.источник
(
, и если это так, то вам, возможно, придется изменить положение их, если длина имени класса + функции изменяется более чем на 4 символа. Поэтому, если вы не хотите этого делать, добавьте фиксированное количество уровней отступа, а не число, которое зависит от длины имени функции. Я бы порекомендовал 1 уровень, этот ответ использует 6, но любое фиксированное число достигает поставленной цели :-)На самом деле проблема читабельности определенно идет в другом направлении. Во-первых, вы можете тривиально решить вашу линию запуска, используя пробелы . Но удаление
const
не только делает строку короче, но и полностью меняет смысл программы.Трава Саттер упоминается
const
в ссылкеconst
как наиболее важная,const
поскольку ссылка наconst
может привязать к временному и продлить его срок службы. Lvalue ссылка на non-const
not, вам нужна отдельная переменная.Для удобства использования это означает, что вам придется вводить все эти временные переменные, чтобы иметь возможность вызывать вашу функцию. Это не очень хорошо для читабельности, поскольку эти переменные не имеют смысла и существуют только потому, что ваша подпись неверна.
источник
const
ссылаетсяconst
или нет на другоеconst
и чтоconst
действительно является самым важнымconst
const&
а не ссылаться наconst
существительное (-фраза) тамПростой ответ - нет.
Длинный ответ заключается в том, что
const
ключевое слово является частью контракта, который предлагает функция; он говорит вам, что аргумент не будет изменен. Момент, когда вы снимаетеconst
эту гарантию, выходит из окна. Помните, что вы не можете разумно поддерживать константность (или любое другое свойство) чего-либо с помощью документации, соглашений или рекомендаций - если компилятор не обеспечивает константность, кто- то подумает, что он может упростить свою работу, если он возится с параметр "чуть чуть". Рассмотреть возможность:Помимо того, что последняя версия является более краткой, она также обеспечивает более сильный контракт и позволяет компилятору поддерживать ваши намерения. Первый не делает ничего, чтобы помешать
fna(Foo&)
функции изменить передаваемый ей параметр.Как и в ответе @CandiedOrange, вы можете использовать пробелы для разметки кода и повышения читабельности.
источник
Удаление
const
ключевого слова удаляет читабельность, посколькуconst
передает информацию читателю и компилятору.Сокращение горизонтальной длины кода - это хорошо (никто не любит боковую прокрутку), но есть нечто большее,
const
чем просто текст. Вы могли бы переписать это:Что не меняет контракт, но удовлетворяет необходимость сокращения длины линии. Действительно, я бы посчитал приведенный выше фрагмент менее читабельным и выбрал бы больше пробелов, как уже упоминалось в ответе CandiedOrange.
const
это функциональность самого кода. Вы не сделаете функцию не-членом для удаленияMyClass::
раздела объявления, поэтому не удаляйтеconst
источник
MObj
иstr
есть, и, конечно, поднимает брови. Это особенно странно для типов, чьи имена вы уже контролируете: например, почему вы просто не назвалиMyObject
какMObj
для начала?Нет. Пропуск
const
может изменить функциональность, утратить защитуconst
и потенциально может создать менее эффективный код.Вместо того, чтобы тратить время на форматирование кода вручную
Используйте инструменты автоматического форматирования . Напишите функцию в соответствии с ее функциональными требованиями и позвольте автоформатированию обрабатывать презентацию. Ручная настройка форматирования не так эффективна, как использование автоматического форматирования и использование сэкономленного времени для улучшения других аспектов кода.
источник
Как можно дольше, лучше держать константу видимой. Это значительно улучшает обслуживание кода (без догадок, чтобы увидеть, изменит ли этот метод мои аргументы).
Если я вижу много аргументов в методе, это заставляет меня задуматься о создании jaron на основе проекта (Matrix, Employee, Rectangle, Account), который будет намного короче, легче для понимания (исключает длинный список аргументов методов).
источник
typedef Point * LPPOINT
иtypedef const Point * LPCPOINT
, хотя и очень неприятный, по-прежнему несет неявный смысл, потому что это соответствует непосредственным ожиданиям в контексте. Но никогда в общем случае; это просто странное исключение, о котором я могу думать.