Javascript - 泛化两个相似的函数
Javascript - Generalizing two similar functions
我有两个类似的方法:
function getFeedPizzasMinimumDate(startDate, totalPizzas) {
// 2 weeks if there are less than 10 pizzas
let numberOfDaysToDecrase = 14;
// 3 days if there are more than 1k pizzas
if (totalPizzas >= 1000) numberOfDaysToDecrase = 3;
// 5 days if there are from 100 to 1k pizzas
else if (totalPizzas >= 100) numberOfDaysToDecrase = 5;
// 1 week if there are from 10 to 100 pizzas
else if (totalPizzas >= 10) numberOfDaysToDecrase = 7;
return substractDaysToDate(numberOfDaysToDecrase, startDate);
}
和:
function getFeedSpaghettisMinimumDate(startDate, totalSpaghettis) {
// 3 weeks if there are less than 10 spaghettis
let numberOfDaysToDecrase = 21;
// 5 days if there are more than 1k spaghettis
if (totalSpaghettis >= 1000) numberOfDaysToDecrase = 5;
// 1 week if there are from 100 to 1k spaghettis
else if (totalSpaghettis >= 100) numberOfDaysToDecrase = 7;
// 2 weeks if there are from 10 to 100 pizzas
else if (totalSpaghettis >= 10) numberOfDaysToDecrase = 14;
return substractDaysToDate(numberOfDaysToDecrase, startDate);
}
如您所见,两种方法的代码非常相似,只是数字有所不同。
假设“启发式”计算的数字(通过假设,没有任何公式)。
我可以使用哪种模式将两种方法归纳为一个“getFeedPlatesMinimumDate”?当代码原子性很高时,我应该避免泛化代码吗?
您可以只传递一个名为 data 的 json 对象,其中包含您想要的数字,或者对 json 对象使用 switch 语句或 if 语句,其中数据已经存在
第一个选项
const data = {
Pizza:10,
Slices:20
}
function allFood(data){
return data.Pizza*data.Slices
}
选项二
function allFood(Food){
//use switch statement or if statement
const PData={amount:10,fed:10}; //pizza data
const SData={amount:5,fed:15}; //spaghetti data
if (Food ==='Pizza'){
return PizzaData.amount*PizzaData.fed;
}else if(Food ==='Spaghetti'){
return SpaghettiData.amount*SpaghettiData.fed;
}
}
我会为披萨做这样的事情。通过将 if 语句中的值更改为类型 === 'spaghettis',对意大利面条执行相同的操作。如果你用的是typescript,你也可以直接注入type值可以有什么样的类型。否则,使用 ENUMS 也是一种选择。
function getFeedMinimumDate(startDate, amount, type = 'pizza') {
// default
let numberOfDaysToDecrase = 14;
// 3 days if there are more than 1k pizzas
if (type === 'pizza' && amount >= 1000) numberOfDaysToDecrase = 3;
// 5 days if there are from 100 to 1k pizzas
if (type === 'pizza' && amount >= 100) numberOfDaysToDecrase = 5;
// 1 week if there are from 10 to 100 pizzas
if (type === 'pizza' && amount >= 10) numberOfDaysToDecrase = 7;
return substractDaysToDate(numberOfDaysToDecrase, startDate);
}
我有两个类似的方法:
function getFeedPizzasMinimumDate(startDate, totalPizzas) {
// 2 weeks if there are less than 10 pizzas
let numberOfDaysToDecrase = 14;
// 3 days if there are more than 1k pizzas
if (totalPizzas >= 1000) numberOfDaysToDecrase = 3;
// 5 days if there are from 100 to 1k pizzas
else if (totalPizzas >= 100) numberOfDaysToDecrase = 5;
// 1 week if there are from 10 to 100 pizzas
else if (totalPizzas >= 10) numberOfDaysToDecrase = 7;
return substractDaysToDate(numberOfDaysToDecrase, startDate);
}
和:
function getFeedSpaghettisMinimumDate(startDate, totalSpaghettis) {
// 3 weeks if there are less than 10 spaghettis
let numberOfDaysToDecrase = 21;
// 5 days if there are more than 1k spaghettis
if (totalSpaghettis >= 1000) numberOfDaysToDecrase = 5;
// 1 week if there are from 100 to 1k spaghettis
else if (totalSpaghettis >= 100) numberOfDaysToDecrase = 7;
// 2 weeks if there are from 10 to 100 pizzas
else if (totalSpaghettis >= 10) numberOfDaysToDecrase = 14;
return substractDaysToDate(numberOfDaysToDecrase, startDate);
}
如您所见,两种方法的代码非常相似,只是数字有所不同。
假设“启发式”计算的数字(通过假设,没有任何公式)。
我可以使用哪种模式将两种方法归纳为一个“getFeedPlatesMinimumDate”?当代码原子性很高时,我应该避免泛化代码吗?
您可以只传递一个名为 data 的 json 对象,其中包含您想要的数字,或者对 json 对象使用 switch 语句或 if 语句,其中数据已经存在
第一个选项
const data = {
Pizza:10,
Slices:20
}
function allFood(data){
return data.Pizza*data.Slices
}
选项二
function allFood(Food){
//use switch statement or if statement
const PData={amount:10,fed:10}; //pizza data
const SData={amount:5,fed:15}; //spaghetti data
if (Food ==='Pizza'){
return PizzaData.amount*PizzaData.fed;
}else if(Food ==='Spaghetti'){
return SpaghettiData.amount*SpaghettiData.fed;
}
}
我会为披萨做这样的事情。通过将 if 语句中的值更改为类型 === 'spaghettis',对意大利面条执行相同的操作。如果你用的是typescript,你也可以直接注入type值可以有什么样的类型。否则,使用 ENUMS 也是一种选择。
function getFeedMinimumDate(startDate, amount, type = 'pizza') {
// default
let numberOfDaysToDecrase = 14;
// 3 days if there are more than 1k pizzas
if (type === 'pizza' && amount >= 1000) numberOfDaysToDecrase = 3;
// 5 days if there are from 100 to 1k pizzas
if (type === 'pizza' && amount >= 100) numberOfDaysToDecrase = 5;
// 1 week if there are from 10 to 100 pizzas
if (type === 'pizza' && amount >= 10) numberOfDaysToDecrase = 7;
return substractDaysToDate(numberOfDaysToDecrase, startDate);
}