Не-дублирование кода в обработчике клика


Исходный код

private function _mouseDown(e:MouseEvent):void 
{
	stage.addEventListener(MouseEvent.MOUSE_UP, _mouseUp);
	if (e.target is PCell) {
		//Клик по клетке, но возможно хотят подвигать поле :)
		_startDrag(e);
	}
	else {
		//Значит двигаем поле
		_startDrag(e);
	}
}

Что так с этим кодом

В заголовке нет опечатки. Да, именно так: я считаю, что подобные конструкции с дублированием вполне обоснованны, и вот почему.

Прежде всего нужно смотреть на семантику кода: какого его предназначение, ради чего он здесь (см. FunctionLength).

Касательно кода примера, в первом случае выполняется обработка клика по одному элементу, в втором — по другому. Это два разных клика, у каждого своя логика обработки. Тот факт, что в данный момент времени реализация обработки оказалась одинаковой — простое совпадение. Элементы остались разными, у них разный собственный смысл и предназначение.

Поэтому у ветвления if (e.target is PCell) есть полное законное право остаться в обработчике.

А вот как именно оформлена обработка одного и другого условия — это отдельный разговор. Если бы у меня в обоих ветках был прописан полный код метода _startDrag — вот тогда да, это проблема. Тогда бы у меня было дублирование реализации со всеми вытекающими. Дублирование вызова метода — это не дублирование. Расслабься.

Теория

  • Source Independency Principle
  • ‘Input-Do-Output’ Pattern
  • Don’t repeat realisation