Javascript 如何在函数之间共享逻辑?

Javascript 如何在函数之间共享逻辑?,javascript,design-patterns,coding-style,Javascript,Design Patterns,Coding Style,我在开发代码时遇到了一个问题,代码中有一些类似的块。我的问题是:在函数之间共享逻辑的最佳方法是什么? 例如: 以下函数包含相同的if/else逻辑。我们如何重构这段代码以获得更简洁和可维护的代码 // pseudo code... const hirer = 'woman'; const getPositions = () => { if (hirer === 'woman') { getPositionsFromWomen(); // do other stufs he

我在开发代码时遇到了一个问题,代码中有一些类似的块。我的问题是:在函数之间共享逻辑的最佳方法是什么?

例如:

以下函数包含相同的if/else逻辑。我们如何重构这段代码以获得更简洁和可维护的代码

// pseudo code...

const hirer = 'woman';

const getPositions = () => {
 if (hirer === 'woman') {
   getPositionsFromWomen();
   // do other stufs here...
 } else if (hirer === 'man') {
   getPositionFromMen();
   // do other stufs here...
 }
 // maybe other stufs here...
}


const hire = (hirer) => {
  if (hirer === 'woman') {
    increaseWomenHiringRate(hirer);
    // do other stufs here...
  } else if (hirer === 'man') {
    increaseMenHiringRate(hirer);
    // do other stufs here...
  }
 setPositionClosed();
}

一个相当标准的方法是参数化逻辑。在这种情况下,可能通过将逻辑放入接受函数的函数中,它将调用每个逻辑分支:

const hirer = 'woman';

const hirerDispatch = (hirer, ifWoman, ifMan) => hirer === 'woman' ? ifWoman() : ifMan();

const getPositions = () => {
  hirerDispatch(hirer, getPositionsFromWomen, getPositionFromMen);
  // maybe other stuff here...
};

const hire = (hirer) => {
  hirerDispatch(hirer, () => increaseWomenHiringRate(hirer), () => increaseMenHiringRate(hirer));
  setPositionClosed();
};

更复杂的参数化可能涉及传递带有分支函数属性的对象,包括要传递的参数(因此我们不需要像在
hire
中那样的包装器),等等。

一个相当标准的方法是参数化逻辑。在这种情况下,可能通过将逻辑放入接受函数的函数中,它将调用每个逻辑分支:

const hirer = 'woman';

const hirerDispatch = (hirer, ifWoman, ifMan) => hirer === 'woman' ? ifWoman() : ifMan();

const getPositions = () => {
  hirerDispatch(hirer, getPositionsFromWomen, getPositionFromMen);
  // maybe other stuff here...
};

const hire = (hirer) => {
  hirerDispatch(hirer, () => increaseWomenHiringRate(hirer), () => increaseMenHiringRate(hirer));
  setPositionClosed();
};

更复杂的参数化可能涉及传递带有分支函数属性的对象,包括要传递的参数(因此我们不需要像在
hire
中那样的包装器),等等。

一个简单的方法是将动作作为Javascript对象作为参数传递给包含逻辑的方法。这是您的代码的外观:

const hirer = 'woman';

var positionHire = {
    women: getPositionsFromWomen,
    men: getPositionsFromMen
}
const getPositions = (hirer, positionHire) => {
 if (hirer === 'woman') {
   getPositionsFromWomen();
   // do other stufs here...
 } else if (hirer === 'man') {
   getPositionFromMen();
   // do other stufs here...
 }
 // maybe other stufs here...
}

var hireRate = {
    women: increaseWomenHiringRate,
    men: increaseMenHiringRate
}

const hire = (hirer, hireRate) => {
  if (hirer === 'woman') {
    increaseWomenHiringRate(hirer);
    // do other stufs here...
  } else if (hirer === 'man') {
    increaseMenHiringRate(hirer);
    // do other stufs here...
  }
 setPositionClosed();
}

一种简单的方法是将动作作为Javascript对象作为参数传递给包含方法的逻辑。这是您的代码的外观:

const hirer = 'woman';

var positionHire = {
    women: getPositionsFromWomen,
    men: getPositionsFromMen
}
const getPositions = (hirer, positionHire) => {
 if (hirer === 'woman') {
   getPositionsFromWomen();
   // do other stufs here...
 } else if (hirer === 'man') {
   getPositionFromMen();
   // do other stufs here...
 }
 // maybe other stufs here...
}

var hireRate = {
    women: increaseWomenHiringRate,
    men: increaseMenHiringRate
}

const hire = (hirer, hireRate) => {
  if (hirer === 'woman') {
    increaseWomenHiringRate(hirer);
    // do other stufs here...
  } else if (hirer === 'man') {
    increaseMenHiringRate(hirer);
    // do other stufs here...
  }
 setPositionClosed();
}

您的if/else是类型(
租用人
)上的开关。因此,你可以。第二个函数需要一个名称,我猜是
determinateHirligate()
(尽管我不确定这是不是正确的名称)

下面是解决方案的类图:


您的if/else是类型(
租用人
)上的开关。因此,你可以。第二个函数需要一个名称,我猜是
determinateHirligate()
(尽管我不确定这是不是正确的名称)

下面是解决方案的类图: