电子表格作为开发业务应用程序的工具

Excel通常用作开发业务应用程序的通用工具。在本文中,我想将30年来没有多大变化的电子表格与软件设计师眼中的现代经典命令式编程范例进行比较。然后,我想谈谈我在新的电子表格处理器上的工作,该处理器可以纠正比较期间发现的许多弱点,从而使您能够创建更可靠,可伸缩且更易于维护和开发的业务应用程序。







电子表格及其功能



现代电子表格(Microsoft Excel,LibreOffice Calc或Google Sheets)的工作原理出现在70年代后期-80年代中期。二维单元格数组作为数据模型,并具有使用公式自动计算的功能,于1979年出现在VisiCalc中。 1985年在波音Calc中首次出现了三维单元格阵列(可以使用多张纸)。



从理论上讲,电子表格与任何编程语言一样好。有一种基于Excel公式的图灵机(链接),这意味着可以使用计算机实现的任何算法都可以在Excel中实现。唯一的问题是这种实现的便利性和效率。



在实践中,我遇到了用Excel实现的非常复杂的系统。例如,用于发展国际机场的财务模型,该模型能够贡献多种不同类型的对象(停车场,仓库,车道等),并能够以不同的模型重新计算现金流量中的平方米和停车位(建筑年成本与运营年利润)通货膨胀。使用关系数据库在Java中“重写”这样的“卓越”功能可能需要数个工作月至数个工作年。在这种特殊情况下,数据库中的关系模型由50多个表组成。最有趣的是,如果电子表格不仅允许创建软件,而且使维护和可伸缩性成为可能,则可以避免这种“重写”。对于最终用户(经济学家),Java系统是后退一步,因为他不再看到中间结果,也无法自己更改或补充模型。



事实证明,使用电子表格和通用编程语言都可以解决相同的问题。这意味着我们可以比较这两种工具的优缺点,以作为创建业务应用程序的一种方法。在这里,我们将尝试通过架构师的眼光来看待Excel,并应用经典软件开发中已经确立的软件体系结构规则。



电子表格的好处



  1. 直观的概念:我们每个学校的人都看到并在盒子里的纸上填写标志,然后打海战。大多数使用Excel的人从未接受过任何特殊培训(充其量,一个同事显示了半小时内可以按下的按钮)。与编程语言相比,这是一个很大的优势,在编程语言中,``21天之内的C ++''听起来甚至过于乐观。
  2. : , , - . breakpoints . . , .
  3. : , . , UI, .




  1. : . Notepad, Java . . . , E5 . VLOOKUP . -, .
  2. : DRY (Don’t repeat yourself — ). , (, /) . . , , , . . .
  3. 缺乏交互性的界面:电子表格不允许您动态更改数据的显示方式。也无法创建通过例如按按钮执行的编程操作。


如何使电子表格更好?



我叫瓦迪姆 我是CubeWeaver的CTO,并且已经开发相当长一段时间的新电子表格了。几年前,我已经写过(链接)有关该系统的早期版本,但此后发生了很多变化,今年该项目已进入商业阶段。



这是我的项目中的创新清单,这些创新在试图保持电子表格的优点的同时解决了上面列出的缺点:



多维数据模型



多维数据模型广泛用于商业智能和OLAP系统中的数据分析。该模型的本质是将数据存储在多维多维数据集的单元格中,多维数据集的边缘由业务对象的标题签名:





程序界面不会显示整个多维立方体,但是会显示与我们选择的过滤器组合相对应的二维切片:





在关系BI系统中实现此类模型时,通常使用雪花模式。多维数据集由事实表实现,而面标题存储在维表中。



在我的系统上,多维数据集称为工作表,而多维数据集边缘上的标题称为列表项。



此类多维工作表的每个单元格都有一个唯一的地址,该地址由边缘上的标签组成。例如,图像中的值935具有以下地址:Bikes,2020,Paris。

列表中的每个项目都有一个名称和ID。单元格引用使用标识符,公式中的上述地址可能看起来像这样(引用括在方括号中):



[PROD:23, YEAR:2020, CITY:24]其中PROD是“产品”列表的标识符,而23是“自行车”项目的标识符。



使用多维模型可以显着改善不利条件为1的情况。首先,现在将标头与数值数据分开存储。其次,引入附加的维度“度量”(或“报告位置”)可以解决单元格的问题,而不是通过序数来解决,而是通过语义来解决,从而消除了由于添加或删除列或行而导致的错误。



当然,必须说这种方法利用1号优势稍微破坏了形势,每个人都参加了海战,只有少数数学学生下了4D棋。但是经验表明,由于多维数据集的二维表示,大多数用户很快就习惯了新的数据模型。



JOIN函数和元数据



多维模型允许您使用元数据描述单元格。上述寻址方法意味着工作表中的每个单元格对应于一组特定的列表项(例如,年份,产品和销售点)。列表又可以具有属性(列),这使它们看起来像常规的关系表。例如,您可以在销售点列表中添加货币列,从而将销售点和货币列表链接为多对一基数关系。



JOIN函数可以使用这种关系动态引用单元格。该函数代替了VLOOKUP,从而无需使用索引。



示例:为了计算世界的销售量,您首先需要将每个国家/地区的销售量转换为一种货币(“销售”头寸乘以汇率)。在Excel中,我们将存储2个表格:每个国家/地区的货币列表和汇率列表。为了找到正确的汇率,我们将使用VLOOKUP函数两次:通过国家名称找到货币代码,并通过货币代码找到汇率。



对具有汇率的单元格的引用可能看起来像这样:

EX_RATES.[COUNTRY.join(CURRENCY)]在哪里

EX_RATES有汇率的工作表的名称

COUNTRY-与国家

CURRENCY/地区的维度-与货币的维度



链接链可以是任意长度,例如:STORE.join(COUNTRY).join(CURRENCY)



实际上,在构建模型时,我们会创建雪花轮廓。JOIN函数允许公式使用该架构的表(列表)之间的链接来动态引用工作表中的单元格。在这种情况下,单元格之间的依赖关系在JOIN函数的参数中明确指定。



公式有效范围



指定效果区域的能力消除了复制公式的需要。



对于多维数据集的每个维度,我们定义了一组公式将对其起作用的元素,例如:年份,“自行车”类型的产品,“收入”报告的项目。在实践中,它看起来像这样(公式的目标用蓝色标记,其自变量用红色和橙色标记。每个维度的选定元素列表在屏幕底部):





这种方法可以修复缺陷编号2,并允许您添加和删除项目甚至尺寸,而无需更改公式。这也消除了每次我们要更改公式时都需要搜索复制了公式的所有单元格的需要。



细胞相互作用



这项创新使您可以使用公式创建交互式界面。公式不仅可以用于计算单元格的值,还可以用于设置单元格的格式(单元格格式),更改单元格的颜色(单元格颜色)以及隐藏或显示一组单元格或整个列或行(单元格可见性)。单元格不仅可以格式化为数字,日期和文本,还可以格式化为按钮,复选框和下拉菜单。



因此,例如,单元格的颜色可以根据单元格的值而改变。一个工作表中的复选框或选择列表可以显示,隐藏或锁定另一工作表中的单元格。



单元格中的按钮使您可以对单元格值创建相当复杂的操作。通过创建按钮,我们设置操作的目标(单元格范围)和公式,该公式对每个目标单元格执行一次。一个按钮上可以有多个操作。因此,例如,按下按钮可以将上一年的数据复制到下一年,或者将一个单元格的内容按某个值成比例地分配给其他几个单元格(飞溅)。



与用户访问限制结合的按钮允许不可逆的功能。因此,例如,访问了按钮但没有访问目标单元格的用户,将只能向该单元格写入按钮中的公式允许他的内容。



结论



与其他系统相比,新的电子表格处理器支持更复杂的模型。同时,模型保持清晰并易于维护。公式中出现错误的可能性也大大降低了。



为这些好处付出的代价是系统日益复杂。在开始工作之前,用户必须创建列表和多维数据集形式的数据模型。



通常,该系统是为比Excel具有更高技术水平的用户设计的(例如,具有基本编程知识的经济学家或从事经济模型研究的程序员)。



我很乐意在评论或私人留言中回答您的问题。另外,在Internet上,您可以找到该系统的文档和一些培训视频。



All Articles