Javascript 如何在不重复代码的情况下,遵循DRY原则编写此函数
我想开始改进我编写代码的方式,而不必复制著名的干净代码,我想开始将其应用于已经使用的小函数。 如果不复制切换条件甚至创建一个类并使用多态性,因为函数是超相似的Javascript 如何在不重复代码的情况下,遵循DRY原则编写此函数,javascript,puppeteer,code-cleanup,Javascript,Puppeteer,Code Cleanup,我想开始改进我编写代码的方式,而不必复制著名的干净代码,我想开始将其应用于已经使用的小函数。 如果不复制切换条件甚至创建一个类并使用多态性,因为函数是超相似的 /** *等待元素并在其上键入 *@param{puppeter.Page}Page-上下文页 *@param{string}选择器-元素选择器(CSS,xpath) *@param{string}text-要在元素中键入的文本 *@param{string}waitType-元素类型(CSS,xpath) */ 常量waitAndTyp
/**
*等待元素并在其上键入
*@param{puppeter.Page}Page-上下文页
*@param{string}选择器-元素选择器(CSS,xpath)
*@param{string}text-要在元素中键入的文本
*@param{string}waitType-元素类型(CSS,xpath)
*/
常量waitAndType=async(页面、选择器、文本、waitType='selector')=>{
开关(waitType){
“选择器”案例:
等待页面。等待选择器(选择器)
打破
}
等待页面。类型(选择器,文本)
}
// ===========================================
/**
*等待一个元素并单击它
*@param{puppeter.Page}Page-上下文页
*@param{string}选择器-元素选择器(CSS,xpath)
*@param{string}waitType-元素类型(CSS,xpath)
*/
常量waitAndClick=async(页面,选择器,waitType='selector')=>{
开关(waitType){
“选择器”案例:
等待页面。等待选择器(选择器)
打破
案例“xpath”:
wait page.waitForXPath(选择器)
打破
}
等待页面。单击(选择器)
}
// ===========================================
// ===========================================
module.exports={
waitAndType,
等待并单击,
}
// ===========================================
您可以向函数传递一个额外的参数,例如actionType
。根据您的需要,它可以有两个或多个可能的值(键入并单击)
您可以按如下方式重写函数:
const waitAndPerformAction = async (page, selector, waitType = 'selector', actionType) => {
switch (waitType) {
case 'selector':
await page.waitForSelector(selector)
break
case 'xpath':
await page.waitForXPath(selector)
break
}
if(actionType === 'type') {
await page.type(selector)
} else if(actionType === 'click`) {
await page.click(selector)
}
}
您可以更进一步,在一个单独的文件(可能是常量文件)中定义您的操作
,您可以在其中定义所有操作类型,以避免在整个代码库中出现任何打字错误
比如:
const ACTION_TYPES = {
CLICK: 'click',
TYPE: 'type',
....
}
然后将操作类型传递给函数。单击
或操作类型。将
作为参数键入
,然后修改等待和执行
函数
const waitAndPerformAction = async (page, selector, waitType = 'selector', actionType) => {
switch (waitType) {
case 'selector':
await page.waitForSelector(selector)
break
case 'xpath':
await page.waitForXPath(selector)
break
}
await page[ACTION_TYPES[actionType]]();
}
最后,将函数调用为:
waitAndPerformAction(..other arguments, ACTION_TYPES.CLICK)
伟大的解决方案请检查解决方案的第二部分,您不必
if/else if
。您还可以将ActionType映射到要调用的函数。例如,在您的操作类型中,您可以将其修改为单击:{name:'CLICK',toCall:page.CLICK}
。然后,您可以执行类似于等待操作类型[actionType].toCall()
@EduardoCarvalho请将答案标记为正确,并向上投票,如果它对您有帮助,可能会对未来的读者有所帮助。谢谢:)