农民的机器人助手
开发人员不断平衡复杂性和灵活性。想象一下,您是一个有各种水果的农民:苹果,香蕉,橘子和梨。您有一个机器人助手,将水果分成两个垃圾箱,即常规垃圾箱和高级垃圾箱。苹果和香蕉都可以进入 垃圾箱,而橙色和梨是 的高级垃圾箱。每天早晨,机器人都会捡起一个随机的水果,需要决定要去哪个垃圾桶。
作为农民,您的任务是编写指导机器人决策的软件。您可以在两种主要方法之间进行选择。
否定方法
一种方法是编码机器人,以确定水果无法去的地方。如果水果不是橙色而不是梨,则可以放在常规垃圾箱中。
if (fruit !== 'orange' && fruit !== 'pear') {
regularBin.add(fruit);
}
这种方法简单而灵活。要添加新水果,您只需避免添加新的条件即可。但是,目前尚不清楚哪些水果可以进入常规垃圾箱 - 您必须从没有的水果中推断出来。随着农场的多样化,当添加较少的保费水果时,维持此功能的果实会更容易。
阵列包括方法
另外,您可以列出阵列中每个垃圾箱的水果,并检查水果是否在该数组中。
const regularBinFruits = [ 'apple', 'banana'];
if(regularBinFruits.includes(fruit)){
regularBin.add(fruit);
}
这种方法更明确和可理解。很明显,哪些水果可以进入常规垃圾桶。但是,就代码而言,它稍微复杂稍微复杂,并且添加新水果需要更新阵列。当农场添加任何普通水果时,农民必须更新阵列。当农场添加高级水果时,不需要更改。
此问题还有其他可能的解决方案。这是其中几个:
- 使用字典或地图:这种方法可能非常有效,尤其是当您有大量类别或项目时。您可以将每个项目映射到特定值(true/fals或0/1或任何其他有意义的有意义的值),而不是使用数组或否定逻辑。这样,您可以在恒定时间内检查项目的成员资格。这是一个示例:
let regularBinFruits = { 'apple': true, 'banana': true };
if(regularBinFruits[fruit]){
regularBin.add(fruit);
}
- 使用开关案例结构:如果您有少量项目,并且每个项目都需要不同的操作,则这可能是一个不错的选择。但是,如果您有大量物品,它可能会变得笨拙。
switch(fruit) {
case 'apple':
case 'banana':
regularBin.add(fruit);
// break is omitted to allow fallthrough
case 'orange':
case 'pear':
premiumBin.add(fruit);
break;
default:
// handle unknown fruit
break;
}
结论
以此为核心,将项目分类的困境 - 无论是农民的机器人的成果还是软件程序中的变量 - 都是计算机科学和数学的基本问题。它涉及设定的理论,条件逻辑和算法复杂性。这些主题通常被学术术语包围,这可能会使它们看起来令人生畏。
但是,正如我们通过此博客文章中的实际示例所看到的那样,这些概念并不像最初可能出现的那么复杂。他们本质上是根据是否满足某些条件做出决定。我是将这个苹果放在常规垃圾箱或高级垃圾箱中,还是两者兼而有之?
在每种情况下,我们都看到您可以采取不同的方法,每种方法都有自己的权衡。否定方法是简单且灵活的,但可能不太明确。阵列包含的方法更明确,但稍微复杂且灵活性较低。其他解决方案(例如使用地图或开关案例结构)提供了自己的一组优势和缺点。
最后,最佳解决方案始终取决于问题的特定上下文和要求。关键是要了解您的用例,并选择最满足您需求的解决方案。请记住,尽管这些问题可以用学术术语来表达,但它们从根本上讲是关于做出决定的 - 我们每天都在做这件事。因此,不要被行话吓倒。您有能力理解和应用这些概念。