- 主题:作为一个业余写代码的人
科班的比你多学了一门《形式语言与自动机》或者《编译原理》。
实现任何功能时先画个有限自动机并用表驱动实现,就不会漏掉情况,有兴趣可以学一下。
【 在 kidsfan 的大作中提到: 】
: 非专业人士
: 每次想实现一个很小的功能
: 都要折腾好久
: ...................
--
FROM 222.212.186.*
因为专业人员解决问题的思考方式就和业余的不同。
【 在 siegfried415 的大作中提到: 】
: 你这扯得太远了。。。
--
FROM 222.212.186.*
那你还是先把算法概论学好吧,我说的那个对你太难。
【 在 siegfried415 的大作中提到: 】
: 思维的严密要靠思维自己来保证,而不是靠某些工具。。。
--
FROM 222.212.186.*
一旦涉及关键业务部分,我就会用有限自动机来保证所有条件全覆盖,来提高代码的健壮性。
只要文档注释足够,旁人也不难理解。
【 在 siegfried415 的大作中提到: 】
: 是吗,失敬啊,我的研究生涯就是从形式语言开始,逐渐过度到算法,最后变成实用化的工具平台的过程,我必须承认,因为这段不算成功的经历,我的潜意识中对过度抽象的技术存在反感。。。
:
--
FROM 222.212.186.*
楼主的IF漫天飞的问题显然是有限状态的。
【 在 siegfried415 的大作中提到: 】
: 然而这个世界上大部分实用的程序都不是有限状态(即状态可枚举)的,比如编程中经常出现的递归结构(比如OS中的进程树等概念),这些结构本质上是一个下推有界自动机,需要上下文无关文法(2型文法)才能描述,然而能自如地使用2型、以及2型以上文法的人,我在现实生活中还没看到过,能正确地掌握3型文法(正则表达式)的人就已经凤毛麟角了。。。
:
--
FROM 222.212.186.*
盖的楼太多了,没注意ID,我把他当成楼主了。
【 在 javaboy 的大作中提到: 】
: siegfried415水平很可以的,记得他好像是google的专家。
: 事实上这个问题我同意他的看法。我是科班出身的,状态机和编译原理我都学过。我觉得完全用不到。
: 楼主的问题是 for/while不熟,if (...) return 不熟,大端代码拆函数不熟。编程方面还没开窍。。
: ...................
--
FROM 222.212.186.*
这贴楼层太高,没注意ID,见你回复,我把你当成楼主了,言语有所冒犯抱歉了。
根据我的经验,初学者面临的IF满天飞,不停打补丁的问题,大部分是未经良好规划设计就动手,以至于没完全覆盖所有条件。当然不排除楼主遇到的问题不是有限状态的情况,我提到的方案适合大部分情况。
【 在 siegfried415 的大作中提到: 】
: if的描述能力是最强的,甚至可以用if来描述图灵机,怎么能根据if漫天飞就断定lz的问题是有限状态的?
:
--
FROM 222.212.186.*
就计算机上应用而言,以表格方式来实现还是有一定优势的,能避免因使用IF语句,造成的CPU分支预测执行,预测失败造成的开销。
【 在 siegfried415 的大作中提到: 】
: 我第一次认识到有限状态自动机的能力,是我证明了在字符流中搜索某个pattern的kmp算法等价于正则表达式"*pattern", 只是后者需要使用一个NFA->DFA的转换,这个转换所做的工作本质上等价于KMP算法(其实想想一点都不奇怪,KMP中的K就是大名鼎鼎的TAOCP作者Knuth,而他同时也是LR算法的发明人)。
: 而你说的这种自动机,实际上就是一个二维的表,行是状态,列是输入,表格中放着一些函数指针,这种表怎么说呢,虽然从概念逻辑上它的确是一个自动机,但它并没有充分利用自动机的能力,它就是一个表格而已。
: 所以,当有人跟我说这个表就是有限状态自动机的时候,我就只能笑笑罢了。。。
: ...................
--
FROM 222.212.186.*
所以先把对问题的有限自动机画在纸上,反复推敲核查,比起凭空在脑中思考全部条件,对普通人而言,还是前者更容易设计出覆盖全面的代码。
实现部分用IF还是表格,这个看情况而定了,状态多的我倾向用表格,逻辑集中在一处,不用来回翻页,修改维护方便。
【 在 siegfried415 的大作中提到: 】
: 从计算的角度看,一个表格等价于若干if,如此而已,所以并不会出现用表格就能保证程序能够处理所有的分支而用if就不行的情况,如果一个人思维不缜密,用if覆盖不全某些条件,那么他即使用表格,也只会设计出覆盖不全的表格而已。。。
:
--
FROM 222.212.186.*
做设计显然不是一张纸就行了,解决不同问题,脑子里还得有对应的知识。
【 在 siegfried415 的大作中提到: 】
: 所以楼主需要的是一张纸,而不是什么自动机?难道不是这样吗?
--
FROM 222.212.186.*