Показать сообщение отдельно
  #13 (permalink)  
Старый 30.07.2019, 12:59
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Poznakomlus, содержательные имена переменных упрощают понимание и изменение кода. Например, вы можете сказать, что делает следующий метод?

function getThem() {
	const list1 = new Array();

	for(const x of this.theList)
		if(x[0] === 4)
			list1.push(x);

	return list1;
}


Вы можете сказать, что делает этот код? Почему это трудно, хотя в нём нет сложных выражении, отступы расставлены грамотно и задействовано мало констант?

Всё дело в неочевидности, в том, что контекст не следует явно из самого кода!

Такой код подразумевает, что вы знаете...
  • Какие данные находятся в theList?
  • Почему важен элемент theList с нулевым индексом?
  • Какое значение имеет число 4?
  • Как используется возвращаемый список?

Ответы не следуют из кода, который приведён выше, хотя могли бы!

Предположим, что вы работаете над игрой Сапёр. Игровое поле представлено при помощи массива ячеек theList. Переименуем его в gameBoard. Каждая ячейка игрового поля представлена при помощи массива, в нулевом элементе которого код состояния, а код 4 означает, что флажок установлен.

Даже простое грамотное присваивание имён всем этим концепциям сильно улучшает вышеприведённый код...
function getFlaggedCells() {
	const flaggedCells = new Array();

	for(const cell of this.gameBoard)
		if(cell[this.STATUS_VALUE] === this.FLAGGED)
			flaggedCells.push(cell);

	return flaggedCells;
}


Код стал существенно понятным, хотя тут такое же кол-во операторов и констант, с таким же уровнем вложенности.

Можно ещё улучшить читаемость кода, и написать простой класс Cell для представления ячеек вместо использования массива. В класс включён геттер isFlagged, который скрывает магические числа. Не изменилось ничего, кроме имён, но теперь легко понять, что тут происходит...
function getFlaggedCells() {
	const flaggedCells = new Array();

	for(const cell of this.gameBoard)
		if(cell.isFlagged)
			flaggedCells.push(cell);

	return flaggedCells;
}
Ответить с цитированием