(Это, вероятно, принадлежит на Code Review Stack Exchange.)
Без немного большего контекста трудно обеспечить разумный рефакторинга, или даже определить, есть ли такой рефакторинг будет стоить усилий и дополнительного обслуживания.
Вкратце, что у вас есть номер type
, который необходимо обработать. Вместо переключателя вы можете реализовать шаблон команды, где каждый тип является либо небольшим классом, либо простым объектом. (Использование класса делает его немного легче пройти в «контекст выполнения», который содержит переменные, не показанные в этом фрагменте.)
Для краткости, вот (очень) грубый набросок.
У вас будет обработчик базового типа. Это завершает установку нуля и значений знака dataView
. Поскольку я не знаю контекста, я притворяюсь, что есть контекст, в который вы проходите. Я включаю все переменные, которые не были показаны в вашем фрагменте.
(я не включил value
, что она выглядит, как вы должны, но я не знаю намерения.)
class BaseTypeHandler {
constructor(ctx) {
this.ctx = ctx
}
getPointer =() => throw new Error('Missing getPointer implementation')
getViewData =() => throw new Error('Missing getViewData implementation')
getValueFromDataView =() => {
let value = 0
for (let i = 0; i < this.ctx.count; i++) {
value += this.getViewData(i, pointer)
}
return value
}
getTag =() => {
const pointer = this.getPointer()
, value = this.getValueFromDataView()
this.ctx.tag.value = parseInt(value, 10)
return this.ctx.tag
}
}
Каждый подкласс реализует необходимую уникальную функциональность, то здесь, как получить указатель и как получить данные из dataView
.
class Type1Handler extends BaseTypeHandler {
getPointer =() =>
this.ctx.count > 4 ? this.ctx.offset : this.ctx.pointer
getViewData = (i, pointer) =>
this.ctx.dataView.getUint8(pointer + i)
}
class Type3Handler extends BaseTypeHandler {
getPointer =() =>
this.ctx.count > 2 ? this.ctx.offset : this.ctx.pointer
getViewData = (i, pointer) =>
this.ctx.dataView.getUint16(pointer + 2 * i, littleEnd);
}
Затем оберните те в объект обработчиков типа:
const typeHandlers = {
1: Type1Handler,
3: Type3Handler,
4: Type4Handler
}
const handler = new typeHandlers(type)
, tag = handler.getTag()
TL; DR
Если у вас есть огромное количество из них, и вы не можете использовать математику для выведите getPointer
и getViewData
, вы можете захотеть придерживаться switch
.
Простые объекты или непосредственные функции могут быть значительно меньшей реализацией, хотя и не обязательно легче рассуждать. У них также есть преимущество в том, что вы можете закрыть переменные, которые у вас уже есть.
Я думаю, что оператор switch, вероятно, стоит сохранить. Я бы начал рефакторинг, вытащив отдельные блоки дела в свои собственные функции. Это облегчит их тестирование и отладку. –
Наименее общий знаменатель, как представляется, инициализировать указатель; для (пусть i = 0; i