• 请不要在回答技术问题时复制粘贴 AI 生成的内容
soratadori
V2EX  ›  程序员

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

  •  
  •   soratadori · Aug 27, 2015 · 5096 views
    This topic created in 3934 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

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

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

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

    连答案都是一样的。
    ijse
        22
    ijse  
       Aug 27, 2015
    之前 有遇到一个需求是要修改 xml 文件,我把 xml 文件当成普通的模板文件来处理,而不是通过 xml 对象来生成,于是整个过程就变得更加简单、高效和方便了。
    imn1
        23
    imn1  
       Aug 27, 2015
    @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  
       Aug 27, 2015
    看情况呗,如果文件里面的所有内容都是必须要访问的,那干嘛不做完整解析呢。
    darluc
        25
    darluc  
       Aug 27, 2015
    只要能把想干的事干了,随便你怎么写
    msg7086
        26
    msg7086  
       Aug 27, 2015
    正则和解析器,本质上都是自动机……
    ipconfiger
        27
    ipconfiger  
       Aug 27, 2015
    有些时候就一个简单的 soap 调用,比如某些什么天气啊的 webservice 访问,就直接把 xml 文件当字符串用了,也就 2 , 3 个要替换的内容,直接 stringformat 就填进去了,一 post 就搞定,别提多简单爽快了。
    BGLL
        28
    BGLL  
       Aug 27, 2015
    当然是怎么能偷懒怎么来咯,只是分为前期偷懒和后期偷懒罢了,
    sablib
        29
    sablib  
       Aug 28, 2015
    竟然有人说正则表达式可读性强。。。。
    int64ago
        30
    int64ago  
       Aug 28, 2015 via Android
    我很纳闷,大多解析库不都是正则写的嘛
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1063 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 103ms · UTC 22:58 · PVG 06:58 · LAX 15:58 · JFK 18:58
    ♥ Do have faith in what you're doing.