Je crois que tout le monde est plus ou moins entré en contact avec des codes de projet avec d'énormes if else
imbriqués. Parfois, après le dépannage d'un bug, Je me sens sérieusement vidé. if else
的项目代码吧,多重嵌套的 if else
在维护的时候真的让人很恼火,有时候一个 bug 排查下来,严重感觉身体被掏空。
本文并未有消灭或歧视 if else
的意思,if else
的好用都知道,这里只是在某些特定场景为大家额外提供一种思路,增加我们代码的可读性。
Javascript 的逻辑或 ||
的短路运算有时候可以用来代替一些比较简单的 if else
||
的短路运算:若左边能转成true,返回左边式子的值,反之返回右边式子的值。下面用一个简单的案例来表述
let c if(a){ c = a } else { c = b }
大家看着上面的代码会难受嘛(本人有一丢丢的强迫症),明明就是一个很简单的判断却需要写好几行代码才能实现。这个时候我们就可以用短路运算去简化我们的代码啦。
let c = a || b
这样看起来是不是就简洁了很多?。
三元运算符我觉得大家应该都很熟悉吧,很多时候简单的一些判断我们都可以使用三元运算符去替代 if else
,这里只推荐 一层 三元运算符,因为多层嵌套的三元运算符也不具备良好的可读性。
例子:条件为 true 时返回1,反之返回0:
const fn = (nBoolean) { if (nBoolean) { return 1 } else { return 0 } } // 使用三元运算符 const fn = (nBoolean) { return nBoolean ? 1 : 0 }
三元运算符使用的地方也比较多,比如:条件赋值,递归...
// num值在nBoolean为true时为10,否则为5 let num = nBoolean ? 10 : 5 // 求0-n之间的整数的和 let sum = 0; function add(n){ sum += n return n >= 2 ? add(n - 1) : result; }; let num = add(10);//55
上述的两种方式:短路运算跟三元运算虽然很好用,代码也很简洁,不过都只能用于简单的判断,遇到多重条件判断就不能使用了。
对于 switch case
,虽然它的可读性确实比 else if
更高,但是我想大家应该都觉得它写起来比较麻烦吧(反正我觉得很麻烦)。
例:有A、B、C、D四种种类型,在A、B的时候输出1,C输出2、D输出3,默认输出0。
let type = 'A' //if else if if (type === 'A' || type === 'B') { console.log(1); } else if (type === 'C') { console.log(2); } else if(type === 'D') { console.log(3); } else { console.log(0) } //switch case switch (type) { case 'A': case 'B': console.log(1) break case 'C': console.log(2) break case 'D': console.log(3); break; default: console.log(0) }
对象配置看起来跟 策略模式
差不多,都是根据不同得参数使用不同得数据/算法/函数。
策略模式就是将一系列算法封装起来,并使它们相互之间可以替换。被封装起来的算法具有独立性,外部不可改变其特性。
接下来我们用对象配置的方法实现一下上述的例子
let type = 'A' let tactics = { 'A': 1, 'B': 1, 'C': 2, 'D': 3, default: 0 } console.log(tactics[type]) // 1
接下来用几个例子让大家更加熟悉一点。
根据不同的用户使用不同的折扣,如:普通用户不打折,普通会员用户9折,年费会员8.5折,超级会员8折。
使用if else
实现
// 获取折扣 --- 使用if else const getDiscount = (userKey) => { if (userKey === '普通会员') { return 0.9 } else if (userKey === '年费会员') { return 0.85 } else if (userKey === '超级会员') { return 0.8 } else { return 1 } } console.log(getDiscount('普通会员')) // 0.9
使用对象配置/策略模式实现?
// 获取折扣 -- 使用对象配置/策略模式 const getDiscount = (userKey) => { // 我们可以根据用户类型来生成我们的折扣对象 let discounts = { '普通会员': 0.9, '年费会员': 0.85, '超级会员': 0.8, 'default': 1 } return discounts[userKey] || discounts['default'] } console.log(getDiscount('普通会员')) // 0.9
从上面的案列中可以明显看得出来,使用对象配置比使用if else可读性更高,后续如果需要添加用户折扣也只需要修改折扣对象就行。
对象配置不一定非要使用对象去管理我们键值对,还可以使用 Map
去管理?,如:
// 获取折扣 -- 使用对象配置/策略模式 const getDiscount = (userKey) => { // 我们可以根据用户类型来生成我们的折扣对象 let discounts = new Map([ ['普通会员', 0.9], ['年费会员', 0.85], ['超级会员', 0.8], ['default', 1] ]) return discounts.get(userKey) || discounts.get('default') } console.log(getDiscount('普通会员')) // 0.9
公司的年终奖根据员工的工资基数和绩效等级来发放的。例如,绩效为A的人年终奖有4倍工资,绩效为B的有3倍,绩效为C的只有2倍。
假如财务部要求我们提供一段代码来实现这个核算逻辑,我们要怎么实现呢?
这不是很简单嘛,一个函数就搞定了。
const calculateBonus = (performanceLevel, salary) => { if (performanceLevel === 'A'){ return salary * 4 } if (performanceLevel === 'B'){ return salary * 3 } if (performanceLevel === 'C'){ return salary * 2 } } calculateBonus( 'B', 20000 ) // 输出:60000
可以发现,这段代码十分简单,但是 calculateBonus
函数比较庞大,所有的逻辑分支都包含在if else
语句中,如果增加了一种新的绩效等级D,或者把A等级的倍数改成5,那我们必须阅读所有代码才能去做修改。
所以我们可以用对象配置/策略模式去简化这个函数
let strategies = new Map([ ['A', 4], ['B', 3], ['C', 2] ]) const calculateBonus = (performanceLevel, salary) => { return strategies.get(performanceLevel) * salary } calculateBonus( 'B', 20000 ) // 输出:60000
至此,这个需求做完了,然后产品经理说要加上一个部门区分,假设公司有两个部门D和F,D部门的业绩较好,所以年终奖翻1.2倍,F部门的业绩较差,年终奖打9折。
改造以上代码,把状态值拼接,然后存入Map中
// 以绩效_部门的方式拼接键值存入 let strategies = new Map([ ['A_D', 4 * 1.2], ['B_D', 3 * 1.2], ['C_D', 2 * 1.2], ['A_F', 4 * 0.9], ['B_F', 3 * 0.9], ['C_F', 2 * 0.9] ]) const calculateBonus = (performanceLevel, salary, department) => { return strategies.get(`${performanceLevel}_${department}`) * salary } calculateBonus( 'B', 20000, 'D' ) // 输出:72000
本文主要是向大家传递一种思想,我们有很多的方法去优化我们的代码,提高我们代码的可读性。
对if else
并没有歧视的意思,只是希望在大家以后的代码中不仅仅只有if else
if else
. Tout le monde connaît l'utilité de if else
. Voici juste quelques informations supplémentaires pour vous. quelques scénarios spécifiques. Fournir une idée pour augmenter la lisibilité de notre code.
||
peut parfois être utilisé pour remplacer une opération de court-circuit relativement simple de if else
||
: si le côté gauche peut être converti en vrai, retournez la valeur du côté gauche de la formule, sinon renvoie la valeur de l'équation de droite. if else
. Seul l'opérateur ternaire à un niveau est recommandé ici, car l'opérateur ternaire imbriqué à plusieurs niveaux n'a pas de bonnes performances. 🎜🎜Exemple : renvoie 1 lorsque la condition est vraie, sinon renvoie 0 :🎜rrreee🎜L'opérateur ternaire est également utilisé à de nombreux endroits, tels que : affectation conditionnelle, récursivité...🎜rrreeeswitch case
, bien que sa lisibilité soit effectivement supérieure à else if
, je pense que tout le monde pense que c'est plus gênant à écrire (en tout cas, je pense Très gênant). 🎜🎜Exemple : Il existe quatre types : A, B, C et D. Lorsque A et B sont sortis, 1 est sorti, C en sort 2 et D en sort 3. La sortie par défaut est 0. 🎜rrreeeMode stratégie
, tous deux basés sur différents les paramètres utilisent des données/algorithmes/fonctions différents. 🎜🎜Le modèle de stratégie encapsule une série d'algorithmes et les rend interchangeables. L'algorithme encapsulé est indépendant et ses caractéristiques ne peuvent être modifiées par le monde extérieur. 🎜🎜Ensuite, nous utiliserons la méthode de configuration d'objet pour implémenter l'exemple ci-dessus🎜rrreee🎜Ensuite, nous utiliserons quelques exemples pour que tout le monde soit plus familier. 🎜if else
pour implémenter🎜rrreee🎜Utiliser un modèle de configuration/stratégie d'objet pour implémenter ?🎜rrreee🎜Il ressort clairement des cas ci-dessus que l'utilisation de la configuration d'objet est plus lisible que l'utilisation de if else High. vous devrez ajouter des remises utilisateur plus tard, il vous suffit de modifier l'objet de remise. 🎜🎜La configuration des objets ne doit pas nécessairement utiliser des objets pour gérer nos paires clé-valeur. Vous pouvez également utiliser Map
pour gérer ?, comme : 🎜rrreeecalculateBonus
est relativement volumineuse. Toutes les branches logiques sont incluses dans l'instruction if else
If un nouveau If. la note de performance est D, ou le multiple de la note A est changé en 5, alors il faut lire tout le code avant d'apporter des modifications. 🎜🎜Nous pouvons donc utiliser le modèle de configuration/stratégie d'objet pour simplifier cette fonction🎜rrreee🎜À ce stade, cette exigence est remplie, puis le chef de produit a dit qu'une distinction de département devrait être ajoutée. Supposons que l'entreprise ait deux départements D. et F, et la performance du département D C'est mieux, donc la prime de fin d'année est augmentée de 1,2 fois. La performance du département F est mauvaise, donc la prime de fin d'année est réduite de 10 %. 🎜🎜Transformez le code ci-dessus, divisez les valeurs d'état, puis stockez-les dans Map🎜rrreeeif else
, j'espère juste qu'il y aura plus que if else
dans votre futur code. 🎜🎜Pour plus de connaissances sur la programmation, veuillez visiter : 🎜Vidéos de programmation🎜 ! ! 🎜