V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
soratadori
V2EX  ›  程序员

写程序非得要按照相对应的逻辑来写吗?

  •  
  •   soratadori · 2015-08-27 07:35:46 +08:00 · 4373 次点击
    这是一个创建于 3380 天前的主题,其中的信息可能已经有所发展或是发生改变。

    举个例子,假如有一个文本里面的内容是严谨的数据结构,可能是 json 、 xml ……也可能是其他的配置格式。如果对其操作的话,有没有必要完全模拟这种结构来写一个相对应的解析程序?如果使用一些技巧(如正则表达式)来操作的话,不仅可读性强,代码还十分短小。

    再比如设计一个门电路,通过某些技巧进行操作就比死板的按照逻辑来设计要高效的多。

    不考虑程序效率问题的话,有必要一定按照相对应的逻辑来写吗

    30 条回复    2015-08-28 00:38:21 +08:00
    paulagent
        1
    paulagent  
       2015-08-27 07:39:12 +08:00
    if you would maintenance the program forever, you can do it ,otherwise, never do it.
    twor2
        2
    twor2  
       2015-08-27 07:39:27 +08:00
    坏处: bug 不好排除,不好维护
    好处:自己的玩具随便玩
    lululau
        3
    lululau  
       2015-08-27 07:59:44 +08:00   ❤️ 9
    你居然说用正则解析结构化数据可读性更强?正则表达式是你的母语吗?
    sandideas
        4
    sandideas  
       2015-08-27 08:01:11 +08:00 via iPhone
    就是要考虑程序效率吧。。。
    数据量一大正则效率会特别低吧。
    invite
        5
    invite  
       2015-08-27 08:10:01 +08:00
    举个栗子, TCP/IP 数据包,结构也算严谨了吧。但是是变长的,你正则怎么搞?
    而且,既然结构严禁了,我都知道哪个位置是什么数据了,要正则干嘛?直接 C 结构转换一下就 OK 了。
    abscon
        6
    abscon  
       2015-08-27 08:13:36 +08:00 via iPhone   ❤️ 1
    正则表达式的表达能力未必能解析所有的格式。
    在它的表达能力不够时,你强行使用,必然出现无法修正的 bug ,会导致解析出错,会导致黑客精心构造一个输入文本让你的程序叛变。

    但是如果不是通用型的处理而是临时用一下,针对特定的几个输入,那随便你,反正程序用了就扔
    loading
        7
    loading  
       2015-08-27 09:07:58 +08:00
    您看过解析程序的源码吗?建议看看!
    c742435
        8
    c742435  
       2015-08-27 10:06:07 +08:00
    貌似 xml 和 json 这种嵌套结构是不能使用正则处理的。

    一般来说,问出这种问题的都是程序新手。那自己写解析程序有多坑不用我说。老手该怎么做心里有数(并不特指“非得要按照相对应的逻辑来写”),不用问别人。

    如果你觉得自己不是一般人 当我没说。
    kaizixyz
        9
    kaizixyz  
       2015-08-27 10:10:49 +08:00
    我来翻译下~机制与算法哪个比较重要?
    honkew
        10
    honkew  
       2015-08-27 10:17:01 +08:00
    没有必要,数据结构一致性
    你的数据结构效率更高,那么你就是天才
    这么喜欢造轮子,不如从零写个 html dom 解析,用你说的正则去写
    wind3110991
        11
    wind3110991  
       2015-08-27 10:23:06 +08:00
    为了提高效率可以不造轮子,但是你不能只为了追求开发和执行效率写得没有重用性和可读性
    但我个人觉得,可重用的稳定代码比高效率的执行代码意义要大很多
    举个栗子: coffeescript 这个变态玩意 = =
    jugelizi
        12
    jugelizi  
       2015-08-27 10:24:24 +08:00
    叫我干嘛
    loading
        13
    loading  
       2015-08-27 10:26:08 +08:00 via Android
    请楼主大神去 github 找到你提到的解析程序,然后用您说的方式从效率上完爆他们。

    造福全人类!
    imn1
        14
    imn1  
       2015-08-27 12:53:40 +08:00
    @sandideas
    未必
    看你说的效率是什么,数据量巨大的话
    如果是运行效率,理论上正则更高
    不过开发和维护效率就可能正则低一些
    abscon
        15
    abscon  
       2015-08-27 13:08:47 +08:00 via iPhone
    @imn1 在效率之外还有更要紧的东西,那就是对错
    wuling
        16
    wuling  
       2015-08-27 13:11:11 +08:00
    楼主只是用正则打个比方而已,上面一堆纠结的
    imn1
        17
    imn1  
       2015-08-27 13:45:26 +08:00
    @abscon
    从形式逻辑上说,都是对的,只是方式不同
    很简单一个例子,用一个书名(其他资料全无)在图书馆找到这本书,在现在是很正常的事(对),但在没有电脑的时代,这就是很困难了(错)

    某种方式不能“生存”于某个环境,除了这种方式本身是错误的这个可能,还有另一个可能是环境不具备容纳这种方式条件

    我们的思维有一堵玻璃墙,大部分人看不见,少数看见了,就找石头垫脚登高望远,某位诗人造了个傻傻(ss )的相机,直接就把外面的风光拍下来了,“不许拍照”,相机被没收了,然后那大部分人说,诗人太清高了,要活在这世上,俗才是对的

    TVB 《贼公阿牛》的主题曲,当年一首被誉为“一朵鲜花插在牛粪上”的流行曲——“世间事怎分对错……”
    shejinb
        18
    shejinb  
       2015-08-27 14:33:48 +08:00
    必须呀,要不然怎么进行协作呢? bug 怎么搞。
    buliugu
        19
    buliugu  
       2015-08-27 15:15:34 +08:00
    除非那个配置文件里自带 BNF 什么的,倒是写个通用的 parser
    abscon
        20
    abscon  
       2015-08-27 15:54:01 +08:00
    @imn1 你最好在图书馆找到《计算理论》这本书,找到讨论正则文法的相关章节,并仔细研读。
    然后你回复中体现出来的这种有害而懒惰的诗意思维会少一点。

    如果想以“理论的归理论,实践的归实践”来给自己找借口,那只能来一发“程序员之怒”:

    http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454
    WispZhan
        21
    WispZhan  
       2015-08-27 16:03:15 +08:00   ❤️ 1
    楼主 这理论完全 可以套到 另一个问题里: “写项目非得要按照软件工程里对应的开发方法来管理吗?” 这种问题。

    连答案都是一样的。
    ijse
        22
    ijse  
       2015-08-27 16:39:25 +08:00
    之前 有遇到一个需求是要修改 xml 文件,我把 xml 文件当成普通的模板文件来处理,而不是通过 xml 对象来生成,于是整个过程就变得更加简单、高效和方便了。
    imn1
        23
    imn1  
       2015-08-27 17:31:04 +08:00
    @abscon
    “诗”只是代替某位 C 开头的 V 友,可能我写得太“诗意”了

    看到“ open tags ”我就没点进去,没挂科学工具,上去比较麻烦,但大致能猜到,应该说的是一些有开头懒得写结尾而没有闭合的 tags ,例如<option>之类, 08 年就见过这样的争论,我 06 年就遇到,刚开始我也很头疼,某位洋人(抱歉我这人记名字有点困难) 08 年左右点醒了我,他说 regex 不是找节点,而是找子字符串,这才是实质

    DOM 和 regex 其实是两种思维方式, DOM 是演绎法,从 root 节点通过类似 xpath 一个一个“理论推导”找到所需; regex 是归纳法,没有 node 的概念,整个 json/xml/html 就是一个大字符串,找到符合特征的全部,如果特征越细致明显,全部将越可能变成“唯一”

    找某段文字,有人会记“第几章第几节第几段”,因为这样不但自己容易记住,也方便和其他人交流
    但我相信不少人是按 Ctrl-F ,输入里面的特定字符直接查找,不理会“第几章第几节第几段”

    所以,两种方式不存在对错之分,只是适合自己、适合团队、适合所有人的分别
    我并没有回复说写程序就是应该 LZ 那样,因为不知道他写的程序是什么环境,团队合作我不建议他这样做,但他假如只是自用,只需要“自己可读性高”,那就无所谓了
    我自己写的爬图就一直用 regex ,至少 08 年至今爬了 2+G (不是字节数)图片没遇到正则解决不了的,反正这程序又不需要和别人交流
    akira
        24
    akira  
       2015-08-27 20:10:06 +08:00
    看情况呗,如果文件里面的所有内容都是必须要访问的,那干嘛不做完整解析呢。
    darluc
        25
    darluc  
       2015-08-27 22:03:09 +08:00
    只要能把想干的事干了,随便你怎么写
    msg7086
        26
    msg7086  
       2015-08-27 22:58:17 +08:00
    正则和解析器,本质上都是自动机……
    ipconfiger
        27
    ipconfiger  
       2015-08-27 23:01:15 +08:00
    有些时候就一个简单的 soap 调用,比如某些什么天气啊的 webservice 访问,就直接把 xml 文件当字符串用了,也就 2 , 3 个要替换的内容,直接 stringformat 就填进去了,一 post 就搞定,别提多简单爽快了。
    BGLL
        28
    BGLL  
       2015-08-27 23:08:23 +08:00
    当然是怎么能偷懒怎么来咯,只是分为前期偷懒和后期偷懒罢了,
    sablib
        29
    sablib  
       2015-08-28 00:21:56 +08:00
    竟然有人说正则表达式可读性强。。。。
    int64ago
        30
    int64ago  
       2015-08-28 00:38:21 +08:00 via Android
    我很纳闷,大多解析库不都是正则写的嘛
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5511 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:43 · PVG 16:43 · LAX 00:43 · JFK 03:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.