当前位置: 首页 > 科技观察

表驱动法,逻辑控制优化利器

时间:2023-03-18 16:05:58 科技观察

本文转载自微信公众号《架构改进之路》,作者张张。转载本文请联系建筑改良之路公众号。最近有不少同学谈到了在开发过程中设计表结构的一些思路。为了让大家少走一些弯路,今天打算说说表驱动的方法~1。概念介绍表驱动方式是一种编程方式。无需使用逻辑语句(if/else)即可查找信息。事实上,任何可以通过逻辑语句选择的东西都??可以通过查找表来选择。对于简单的情况,使用逻辑语句更简单直接,但随着逻辑链越来越复杂,查表法也越来越有吸引力。当正确应用这些原则时,表驱动方法可以生成比复杂逻辑代码更简单、更易于修改且更高效的代码。2.应用实践2.1直接访问2.1.1今天是星期几?传统写法:Stringtoday="Sunday";Switch(dayForMonth%7){case0:today="Sunday";case1:today="Monday";case2:today="Tuesday";case3:today="Wednesday";case4:today="Thursday";case5:today="Friday";default:today="Saturday";}表驱动方法:String[]weekday=newString[]{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};Stringtoday=weekday[dayForMonth%7];2.1.2每个月有多少天?传统写法:if(1==iMonth){iDays=31;}elseif(2==iMonth){iDays=28;}elseif(3==iMonth){iDays=31;}elseif(4==iMonth){iDays=30;}elseif(5==iMonth){iDays=31;}elseif(6==iMonth){iDays=30;}elseif(7==iMonth){iDays=31;}elseif(8==iMonth){iDays=31;}elseif(9==iMonth){iDays=30;}elseif(10==iMonth){iDays=31;}elseif(11==iMonth){iDays=30;}elseif(12==iMonth){iDays=31;}表驱动方式:把逻辑写成图或者列表,一目了然。可以建一个二维数组,加上闰年的逻辑。constmonthDays=[[31,28,31,30,31,30,31,31,30,31,30,31],[31,29,31,30,31,30,31,31,30,31,30,31]]]functiongetMonthDays(month,year){letisLeapYear=(year%4===0)&&(year%100!==0||year%400===0)?1:0returnmonthDays[isLeapYear][(month-1)];}console.log(getMonthDays(2,2000))2.2索引访问有时年龄等数据仅通过简单的数学运算无法转换为表键值。这种情况下,可以使用索引访问的方法来解决。索引应用:先用一个基本类型的数据从一个索引表中找到一个键值,然后用这个键值找到需要的主数据。例子:有100个项目,存储项目编号(范围0000-9999)创建两个表:索引表(0-9999),项目(查询)表(0-100)索引访问有两个好处:如果主查询表如果每条记录都很大,用于创建浪费大量空间的数组的空间比用于构建主查找表的空间小得多。操作索引中的记录比操作主查询表中的记录更方便,写入表中的数据比嵌入代码中的数据更易于维护。2.3梯形访问这种访问方式不像索引结构那样直接,但是比索引访问方式节省空间。梯形结构的基本思想:表中的记录对不同的数据范围有效,对不同的数据点无效。例子:一个评级应用程序,其中“B”记录对应的范围是75.0%-90.0%>=90.0%A<90.0%B<75.0%C<65.0%D<50.0%F这个划分范围是用的在查找表中不合适,因为您不能使用简单的数据转换函数将表键转换为A-F字母等级。使用索引也不合适,因为这里使用的是浮点数。应用梯形图方法时,必须小心处理范围的端点。DimrangeLimit()AsDouble={50.0,65.0,75.0,90.0,100.0}Dimgrade()AsString={"F","D","C","B","A"}maxGradeLevel=grade.Length-1//assignagradtoastudentbasedonthestudent'sscoregradeLevel=0studentGrade=”A”while(studentGrade="A"andgradeLevel{"A":{"name":"AA","action":(name)=>print(name+"/AA"),},"B":{"name":"BB","action":(name)=>print(name+"/BB"),},};varaction=data["A"]["action"];action("kk");3.总结1)如何从表中查看数据?Listitem直接访问indexaccess梯形访问2)表中存储了什么?数据动作(action)——描述动作的代码/动作子程序的引用。表驱动方法为复杂的逻辑和继承结构提供了一种替代方法。如果您发现自己对应用程序的逻辑或继承感到困惑,有没有一种方法可以使用查找表来简化它。使用表的一个关键决定是决定如何访问表,可以是直接访问、索引访问或阶梯访问。使用表格的另一个关键决定是决定如何将什么内容放入表格中当您需要保存浮点数和范围数时,请使用梯形图访问形式。