sar*_*old 23
通常,数据驱动的代码更易于阅读和维护.我知道我已经看到了数据驱动已经走到极端的情况并且非常无法使用(我正在考虑我已经使用过的一些SAP部署),但编写自己的"Domain Specific Languages"来帮助你构建您的软件通常可以节省大量时间.
在务实程序员留在我的脑海里写,我读一些轻松的语言最生动的倡导者.运行少量输入语言的小型状态机可以用很小的空间完成很多工作,并且可以很容易地进行修改.
一个具体的例子:考虑累进所得税制,税率为1,000美元,10,000美元和100,000美元.低于1,000美元的收入是免税的.1,000美元至9,999美元之间的收入税率为10%.10,000美元至99,999美元之间的收入税率为20%.收入超过10万美元的税率为30%.如果你在代码中写出这一切,那就像你怀疑的那样:
total_tax_burden(income) {
if (income < 1000)
return 0
if (income < 10000)
return .1 * (income - 1000)
if (income < 100000)
return 999.9 + .2 * (income - 10000)
return 18999.7 + .3 * (income - 100000)
}
Run Code Online (Sandbox Code Playgroud)
添加新的税级,更改现有括号或更改括号中的税负,都需要修改代码并重新编译.
但如果它是数据驱动的,您可以将此表存储在配置文件中:
1000:0
10000:10
100000:20
inf:30
Run Code Online (Sandbox Code Playgroud)
写一个小工具来解析这个表并进行查找(不是很难,对吧?)现在任何人都可以轻松维护税率表.如果国会决定1000个括号会更好,任何人都可以使表与IRS表对齐,并完成它,不需要重新编译代码.相同的通用代码可用于一个括号或数百个括号.
而现在对于一些不太明显的事情:测试.该AppArmor的项目有上百次试验用于什么时,各种型材加载系统调用应该做的.一个示例测试如下所示:
#! /bin/bash
# $Id$
# Copyright (C) 2002-2007 Novell/SUSE
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, version 2 of the
# License.
#=NAME open
#=DESCRIPTION
# Verify that the open syscall is correctly managed for confined profiles.
#=END
pwd=`dirname $0`
pwd=`cd $pwd ; /bin/pwd`
bin=$pwd
. $bin/prologue.inc
file=$tmpdir/file
okperm=rw
badperm1=r
badperm2=w
# PASS UNCONFINED
runchecktest "OPEN unconfined RW (create) " pass $file
# PASS TEST (the file shouldn't exist, so open should create it
rm -f ${file}
genprofile $file:$okperm
runchecktest "OPEN RW (create) " pass $file
# PASS TEST
genprofile $file:$okperm
runchecktest "OPEN RW" pass $file
# FAILURE TEST (1)
genprofile $file:$badperm1
runchecktest "OPEN R" fail $file
# FAILURE TEST (2)
genprofile $file:$badperm2
runchecktest "OPEN W" fail $file
# FAILURE TEST (3)
genprofile $file:$badperm1 cap:dac_override
runchecktest "OPEN R+dac_override" fail $file
# FAILURE TEST (4)
# This is testing for bug: https://bugs.wirex.com/show_bug.cgi?id=2885
# When we open O_CREAT|O_RDWR, we are (were?) allowing only write access
# to be required.
rm -f ${file}
genprofile $file:$badperm2
runchecktest "OPEN W (create)" fail $file
Run Code Online (Sandbox Code Playgroud)
它依赖于一些辅助函数来生成和加载配置文件,测试函数的结果,并向用户报告.扩展这些小测试脚本要比没有一点语言编写这种功能容易得多.是的,这些是shell脚本,但它们远离实际的shell脚本;)它们实际上是数据.
我希望这有助于推动数据驱动的编程; 我担心我不像其他人那样雄辩,而且我当然也没有擅长这一点,但我尝试了.
thk*_*ala 18
在现代软件中,代码和数据之间的界限可能变得非常薄和模糊,并且将两者分开并不总是容易的.毕竟,就计算机而言,一切都是数据,除非它由现有代码(通常是操作系统)决定.甚至程序也必须在CPU执行之前作为数据加载到内存中.
例如,假设一种计算订单成本的算法,其中较大的订单每个项目的价格较低.它是商店中较大的软件系统的一部分,用C语言编写.
该算法用C语言编写,并读取包含管理提供的输入表的文件,其中包含各种每项价格和相应的订单大小阈值.大多数人会认为具有简单输入表的文件当然是数据.
现在,假设商店将其策略更改为某种渐近函数,而不是预先选择的阈值,以便它可以容纳疯狂的大订单.他们可能还想考虑汇率和通货膨胀 - 或管理层提出的其他任何因素.
该商店聘请了一位称职的程序员,并在原始的C代码中嵌入了一个很好的数学表达式解析器.输入文件现在包含一个带有全局变量的表达式,诸如log()和之类的函数tan(),以及一些简单的东西,如普朗克常数和碳-14降级速率.
cost = (base * ordered * exchange * ... + ... / ...)^13
Run Code Online (Sandbox Code Playgroud)
大多数人仍然认为表达式,即使不像表那么简单,实际上也是数据.毕竟它可能是由管理层提供的.
这家商店收到了大量的投诉,这些客户因脑力劳动而试图估算他们的开支以及会计人员对大量零钱的变化.商店决定回到表中寻找小订单,并使用Fibonacci序列获得更大的订单.
程序员厌倦了修改和重新编译C代码,所以她嵌入了Python解释器.输入文件现在包含一个Python函数,可以Fib(n)根据大订单的成本轮询一整套猴子.
问:是这个输入文件中的数据?
从严格的技术角度来看,没有什么不同.表和表达式都需要在使用前进行解析.数学表达式解析器可能支持分支和函数 - 它可能不是图灵完备的,但它仍然使用它自己的语言(例如MathML).
然而现在很多人都认为输入文件只是代码.
那么将输入格式从数据转换为代码的区别特征是什么?
可修改性:必须重新编译整个系统才能实现更改,这是以代码为中心的系统的一个非常好的指示.然而,我可以很容易地想象(好吧,更像我实际看到的)软件设计得不够充分,例如在编译时内置输入表.让我们不要忘记,许多应用程序仍然有图标 - 大多数人会认为数据 - 构建在他们的可执行文件中.
输入格式:这是 - 在我看来,天真 - 人们认为最常见的因素:"如果它是编程语言,那么它就是代码".好的,C是代码 - 毕竟你必须编译它.我也同意Python也是代码 - 它是一种完整的语言.那么为什么不是 XML/XSL代码呢?XSL本身就是一种非常复杂的语言 - 因此就是L它的名字.
在我看来,这两个标准中没有一个是实际的区别特征.我认为人们应该考虑其他事情:
当然,这意味着系统是否是数据驱动的,至少应该考虑目标受众 - 如果不是根据具体情况与客户有关.
这也意味着可用工具集会影响区别.在UML规范是一个噩梦经历,但这些天我们有所有这些图形编辑UML来帮助我们.如果有某种第三方高级AI工具可以解析自然语言并生成XML/Python /无论什么,那么即使对于更复杂的输入,系统也会成为数据驱动的.
小商店可能没有聘请第三方的专业知识或资源.因此,允许工作人员根据平均管理课程 - 数学,图表等 - 获得的知识来修改其行为,可以被认为是足够的数据驱动的受众.
另一方面,一个数十亿的国际公司通常在其工资单中拥有一群IT专家和网页设计师.因此,XML/XSL,Javascript,甚至Python和PHP可能都很容易处理.它也有足够复杂的要求,更简单的东西可能不会削减它.
我相信,在设计软件系统时,应该努力在目标受众可以做到他们需要的所用输入格式中实现这种精细平衡,而不必频繁地呼叫第三方.
值得注意的是,外包使线条更加模糊.存在相当多的问题,对于这些问题,当前的技术根本不允许外行人能够解决该解决方案.在这种情况下,解决方案的目标受众可能应该被视为将业务外包给的第三方.预计该第三方将雇用相当数量的专家.
其他答案已经探讨了如何使用简单的代码来编写复杂的行为,这些代码只对特定输入的模式做出反应.您可以将数据视为特定于域的语言,将您的代码视为解释器(可能是一个简单的解释器).
鉴于大量数据,您可以更进一步:统计数据可以为决策提供动力.彼得·诺维格(Peter Norvig)写了一篇很棒的章节来说明美丽数据中的这个主题,文字,代码和数据都在网上提供.(披露:我在致谢中感谢.)在第238-239页:
数据驱动方法与更传统的软件开发过程相比如何,程序员编写明确的规则?......显然,手写规则难以开发和维护.数据驱动方法的最大优点是在数据中编码了如此多的知识,只需收集更多数据就可以添加新知识.但另一个优点是,虽然数据量很大,但代码简洁 - 大约50行
correct,而ht:// Dig的拼写代码则超过1,500 行....另一个问题是可移植性.如果我们想要一个拉脱维亚语拼写纠错器,那么英语的metaphone规则将毫无用处.为了将数据驱动
correct算法移植到另一种语言,我们所需要的只是拉脱维亚语的大型语料库; 代码保持不变.
他使用在Google收集的数据集在Python中使用代码具体地展示了这一点.除了拼写纠正之外,还有一些代码可以分割单词并破译密码 - 只需几页,Grady Booch的书就花了几十个甚至没有完成它.
"数据的不合理有效性"更广泛地发展了相同的主题,没有所有的细节.
我在另一家搜索公司的工作中采用了这种方法,而且我认为与桌面驱动/ DSL编程相比,它仍然未充分利用,因为我们大多数人在过去十年或二十年之前都没有大量使用数据.