[Программирование] Именуйте классы, переменные и функции для людей, а не для машин
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Чтобы не писать слишком длинный комментарий к статье Практическое руководство по именованию классов, функций и переменных, решил написать ответ в виде отдельной статьи.
TL,DR
Названия переменных, функций и классов в программе, должны быть прежде всего легко читаемы и понятны человеку, такому же программисту, который будет читать код программы и возможно что-то в ней исправлять.
Компилятор, машина, без проблем поймет хоть shouldDisplayPagination, хоть p, ей без разницы. В отличии от человека. Проблема с именем shouldDisplayPagination в том, что слишком перегружено ненужными деталями. Средний человек способен оперировать одновременно небольшим количеством объектов в памяти. Примерно три-четыре, до семи. Поэтому, пока он читает слова should, display, pagination, у него из памяти вытесняются другие объекты, возможно детали алгоритма, которые он пытается понять, читая исходный код. В итоге, человек хуже поймет алгоритм, и сделает ошибку при его исправлении или использовании. Слишком описательные названия, как ни странно, ведут к прямо противоположному результату, к ухудшению понимания и большему количеству ошибок.
Любая система именования переменных, хоть венгерская нотация (если кто-то её ещё помнит), хоть современный аббревиатурный подход (P)A/HC/LC, ухудшает читаемость и поддерживаемость кода. Потому что он делает код в виде текста более похожим на машинно генерируемый по какому-то алгоритму код, прекрасно воспринимаемый машиной, но плохо воспринимаемый человеком. Некоторые принципы именования переменных, о которых речь пойдет ниже, в целом хорошая идея, но системы с табличками, колонками и строками, однозначно нет. Названия не вписываются в жесткую структуру табличек.
Далее по-пунктам
Префиксы
От использования префиксов в целом лучше воздержаться. Потому что они повторяют очевидную вещь, тип значения, возвращаемого функцией. Нет смысла повторять уже существующую информацию. Единственным исключением является префикс is- который очень широко используется в стандартной библиотеке (речь про Java). Has- и should- може есть, но уже гораздо меньше, и их использовать ненадо.
Во всех приведенных примерах переменные вообще ненужны, потому что само выражение достаточно короткое, вместо
const color = 'blue';
const isBlue = (color === 'blue'); // свойство
const isPresent = true; // состояние
if (isBlue && isPresent) {
console.log('Blue is present!');
}
лучше
const color = 'blue';
const isPresent = true; // состояние
if (color === 'blue' && isPresent) {
console.log('Blue is present!');
}
Вместо
const hasProducts = (productsCount > 0);
лучше
productsCount > 0
там где используется переменная hasProducts. Да и productsCount слишком длинное название для переменной, лучше products или count.
Действие
Действия — действительно сердце функции, но не надо их выносить наружу функции, в название. Это приводит к разрушению инкапсуляции и усилению связности между разными частями программы. Ненужные подробности того, что действительно делает функция, распространяются по всей программе, и остальные части программы как-то должны это учитывать.
Совершенно определенно следует отказаться от префиксов get- и set-. Если функция возвращает какое-то значение, то её название должно описывать, что возвращает функция, глагол get- совершенно избыточен
Соответственно, не
function getFruitsCount() {
return this.fruits.length;
}
а
function fruitsCount() {
return this.fruits.length;
}
Когда программист читает
if (getFruitsCount() > 10)
или
if (fruitsCount() > 10)
понятность этого кусочка кода одна и та же, но в первом случае ему необходимо прочитать просто больше слов. Слово get- не добавляет нисколько дополнительно информации.
Префикс set- описывает действие на слишком низком уровне, тем самым разрушая инкапсуляцию. Например, вместо setName лучше название rename. Приведенный в статье пример опять слишком простой, и не описывает достаточно зачем нужна эта функция вообще, вместо
let fruits = 0;
const setFruits = (nextFruits) => {
fruits = nextFruits;
};
setFruits(5);
console.log(fruits); // 5
опять гораздо лучше будет
let fruits = 0;
fruits = 5;
console.log(fruits); // 5
Далее, если название начинается с глагола, функция не должна возвращать значение. Т.о.
const fetchPosts = (postCount) => fetch('https://api.dev/posts', {...});
вариант не очень. Если это функция, то должна описывать то что возвращает, соответственно
const posts = (count) => fetch('https://api.dev/posts', {...});
Если это метод класса то он должен изменять состояние обекта но не возвращать значение
class ApiPosts {
var posts
void fetch(count) { posts = fetch('https://api.dev/posts', {...}); }
}
S-I-D
Да короткие названия это хорошо (S), но пример
const shouldDisplayPagination = (postsCount > 10); // альтернатива
совершенно точно таким не является
const pagination = (postsCount > 10); // альтернатива
или
postsCount > 10
уже гораздо лучше.
Сокращения
В целом сокращения это плохо, но иногда если переменная используется в трех строчках кода, нет ничего плохого в сокращении
for (URI u: uris) {
pages.fetch(u);
}
читается гораздо легче и понятнее, чем
for (URI uriToFetch : urisArray) {
pagesCollection.fetch(uriToFetch);
}
ЗЫ: Наименования переменных, функций и классов это сложно. Сложно подобрать понятные, очевидные и подчеркивающие предметную область названия. Но совершенно точно эти названия нельзя уложить в стройную аббревиатурную систему (P)A/HC/LC, XYZ или любую другую. Потому что многообразие предметных областей, программ, обрабатывающих данные, не описывается простой табличкой.
===========
Источник:
habr.com
===========
Похожие новости:
- [Разработка систем связи, Программирование микроконтроллеров] Power-line communication. Часть 3 — Основные блоки устройства
- [PHP, Программирование, Проектирование и рефакторинг, ООП, Go] Prototype Design Pattern в Golang
- [Информационная безопасность, Программирование, Производство и разработка электроники, Гаджеты, Игры и игровые приставки] Часть 3: ESPboy2 — гаджет для ретро игр и экспериментов с IoT, новости проекта 2021
- [Системное программирование, Программирование микроконтроллеров, Компьютерное железо] Предельная скорость USB на STM32F103, чем она обусловлена?
- [Программирование, Компиляторы, Функциональное программирование, Искусственный интеллект] Тестирование синтаксиса языка программирования с необычной концепцией
- [Программирование, Java, Kotlin] Почему Kotlin лучше Java?
- [Программирование, Совершенный код] Практическое руководство по именованию классов, функций и переменных (перевод)
- [Python, Программирование, Совершенный код, Научно-популярное] Разукрашиваем вывод в консоли: теория и практика
- [Python, Программирование, Работа с 3D-графикой, Учебный процесс в IT] 3D teeth instance segmentation. В темноте, но не один
- [Программирование микроконтроллеров, Схемотехника] USB на регистрах: isochronous endpoint на примере Audio device
Теги для поиска: #_programmirovanie (Программирование), #_otvet (ответ), #_nazvanija_i_imena (названия и имена), #_programmirovanie (программирование), #_programmirovanie (
Программирование
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 15:39
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Чтобы не писать слишком длинный комментарий к статье Практическое руководство по именованию классов, функций и переменных, решил написать ответ в виде отдельной статьи. TL,DR Названия переменных, функций и классов в программе, должны быть прежде всего легко читаемы и понятны человеку, такому же программисту, который будет читать код программы и возможно что-то в ней исправлять. Компилятор, машина, без проблем поймет хоть shouldDisplayPagination, хоть p, ей без разницы. В отличии от человека. Проблема с именем shouldDisplayPagination в том, что слишком перегружено ненужными деталями. Средний человек способен оперировать одновременно небольшим количеством объектов в памяти. Примерно три-четыре, до семи. Поэтому, пока он читает слова should, display, pagination, у него из памяти вытесняются другие объекты, возможно детали алгоритма, которые он пытается понять, читая исходный код. В итоге, человек хуже поймет алгоритм, и сделает ошибку при его исправлении или использовании. Слишком описательные названия, как ни странно, ведут к прямо противоположному результату, к ухудшению понимания и большему количеству ошибок. Любая система именования переменных, хоть венгерская нотация (если кто-то её ещё помнит), хоть современный аббревиатурный подход (P)A/HC/LC, ухудшает читаемость и поддерживаемость кода. Потому что он делает код в виде текста более похожим на машинно генерируемый по какому-то алгоритму код, прекрасно воспринимаемый машиной, но плохо воспринимаемый человеком. Некоторые принципы именования переменных, о которых речь пойдет ниже, в целом хорошая идея, но системы с табличками, колонками и строками, однозначно нет. Названия не вписываются в жесткую структуру табличек. Далее по-пунктам Префиксы От использования префиксов в целом лучше воздержаться. Потому что они повторяют очевидную вещь, тип значения, возвращаемого функцией. Нет смысла повторять уже существующую информацию. Единственным исключением является префикс is- который очень широко используется в стандартной библиотеке (речь про Java). Has- и should- може есть, но уже гораздо меньше, и их использовать ненадо. Во всех приведенных примерах переменные вообще ненужны, потому что само выражение достаточно короткое, вместо const color = 'blue';
const isBlue = (color === 'blue'); // свойство const isPresent = true; // состояние if (isBlue && isPresent) { console.log('Blue is present!'); } лучше const color = 'blue';
const isPresent = true; // состояние if (color === 'blue' && isPresent) { console.log('Blue is present!'); } Вместо const hasProducts = (productsCount > 0);
лучше productsCount > 0
там где используется переменная hasProducts. Да и productsCount слишком длинное название для переменной, лучше products или count. Действие Действия — действительно сердце функции, но не надо их выносить наружу функции, в название. Это приводит к разрушению инкапсуляции и усилению связности между разными частями программы. Ненужные подробности того, что действительно делает функция, распространяются по всей программе, и остальные части программы как-то должны это учитывать. Совершенно определенно следует отказаться от префиксов get- и set-. Если функция возвращает какое-то значение, то её название должно описывать, что возвращает функция, глагол get- совершенно избыточен Соответственно, не function getFruitsCount() {
return this.fruits.length; } а function fruitsCount() {
return this.fruits.length; } Когда программист читает if (getFruitsCount() > 10)
или if (fruitsCount() > 10)
понятность этого кусочка кода одна и та же, но в первом случае ему необходимо прочитать просто больше слов. Слово get- не добавляет нисколько дополнительно информации. Префикс set- описывает действие на слишком низком уровне, тем самым разрушая инкапсуляцию. Например, вместо setName лучше название rename. Приведенный в статье пример опять слишком простой, и не описывает достаточно зачем нужна эта функция вообще, вместо let fruits = 0;
const setFruits = (nextFruits) => { fruits = nextFruits; }; setFruits(5); console.log(fruits); // 5 опять гораздо лучше будет let fruits = 0;
fruits = 5; console.log(fruits); // 5 Далее, если название начинается с глагола, функция не должна возвращать значение. Т.о. const fetchPosts = (postCount) => fetch('https://api.dev/posts', {...});
вариант не очень. Если это функция, то должна описывать то что возвращает, соответственно const posts = (count) => fetch('https://api.dev/posts', {...});
Если это метод класса то он должен изменять состояние обекта но не возвращать значение class ApiPosts {
var posts void fetch(count) { posts = fetch('https://api.dev/posts', {...}); } } S-I-D Да короткие названия это хорошо (S), но пример const shouldDisplayPagination = (postsCount > 10); // альтернатива
совершенно точно таким не является const pagination = (postsCount > 10); // альтернатива
или postsCount > 10
уже гораздо лучше. Сокращения В целом сокращения это плохо, но иногда если переменная используется в трех строчках кода, нет ничего плохого в сокращении for (URI u: uris) {
pages.fetch(u); } читается гораздо легче и понятнее, чем for (URI uriToFetch : urisArray) {
pagesCollection.fetch(uriToFetch); } ЗЫ: Наименования переменных, функций и классов это сложно. Сложно подобрать понятные, очевидные и подчеркивающие предметную область названия. Но совершенно точно эти названия нельзя уложить в стройную аббревиатурную систему (P)A/HC/LC, XYZ или любую другую. Потому что многообразие предметных областей, программ, обрабатывающих данные, не описывается простой табличкой. =========== Источник: habr.com =========== Похожие новости:
Программирование ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 15:39
Часовой пояс: UTC + 5