Исходный код
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