还是写代码风格的问题,如果设计代码布局 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
avatasia
V2EX    问与答

还是写代码风格的问题,如果设计代码布局

  •  
  •   avatasia 2011-12-29 14:15:36 +08:00 5053 次点击
    这是一个创建于 5064 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前碰到的一个很严重的问题, 代码长了,改动的地方一多,就会忘掉某些东西,导致到处补漏,而本人脑子也不好使,请问如何能写出短小简洁的代码,方便整理思维的。某些DSL确实对这个有帮助,希望有经验的人能分享下。
    24 条回复    1970-01-01 08:00:00 +08:00
    avatasia
        1
    avatasia  
    OP
       2011-12-29 14:23:41 +08:00
    再增加个问题, 返回类型为void的方法有什么意义? 如果做一件事情,肯定要知道结果的,想不通
    zicjin
        2
    zicjin  
       2011-12-29 14:32:36 +08:00
    1 建议看看进攻型代码,可以尽量减少if else嵌套。

    2 抛出异常也是一种返回结果,而且是一种更优秀的设计
    myrual
        3
    myrual  
       2011-12-29 14:34:00 +08:00
    从一开始就按着业务逻辑写代码。而不是实现逻辑写。
    可能有帮助。

    另外就是经常重构代码,从最简单的命名开始,好的命名可以有效的减少混乱。
    keakon
        4
    keakon  
       2011-12-29 14:37:03 +08:00
    有的函数确实不需要返回值啊,比如swap
    leiz
        5
    leiz  
       2011-12-29 14:39:30 +08:00
    @avatasia
    1、在设计阶段尽量把你的东西切割开。
    2、每个方法完成一个简单的任务。
    3、设计好你的方法(函数)声明。

    至于void,有时候更多的是达到目的的不同手段。
    kojp
        6
    kojp  
       2011-12-29 14:39:40 +08:00
    建议 import this 一下~~~
    9hills
        7
    9hills  
       2011-12-29 14:45:48 +08:00
    @avatasia 有时一个函数就是做某件事,比如让PC喇叭响一下,要啥返回值。。
    myrual
        8
    myrual  
       2011-12-29 14:48:34 +08:00
    @avatasia 知道结果的方法有很多种,除了函数返回结果,还可以传入一个指针/引用,用于存取结果。
    返回多个结果的函数似乎不是普遍存在的。
    zephyro
        9
    zephyro  
       2011-12-29 15:02:02 +08:00
    可以学习一下LISP,书里都有很好的函数式编程的风格介绍,如何设计函数式的程序等等。虽然一个应用程序做到纯函数式过于偏激了,但是对于一些核心逻辑,按照函数式的理念进行设计是很棒的。
    按照LISP的风格写下来,整个程序似乎都变成了自制DSL的使用。
    还有这个,
    http://avdi.org/talks/confident-code-rubymidwest-2011/confident-code.html
    How-to write Confident Code.
    avatasia
        10
    avatasia  
    OP
       2011-12-29 16:06:47 +08:00
    @zephyro @myrual @9hills @kojp @leiz @keakon @zicjin 返回异常不算是优秀设计把,我记得think in c++的作者说过,异常是一个很搞的东西,会降低性能。 我的意思是人在自然界里做什么事情都是要知道结果的,尤其是程序,没有返回,是不是意味着失去控制,失去控制意味着什么大家一定明白,就像swap,你swap的值肯定要用的,不用为什么要swap,如果交换失败怎么办?
    leiz
        11
    leiz  
       2011-12-29 16:15:55 +08:00
    @avatasia 你想太多。
    zicjin
        12
    zicjin  
       2011-12-29 16:16:52 +08:00
    没看过think in c++,但写过几年代码的我从来不觉得异常有什么好,或者性能问题,真有性能问题那也是框架设计的问题。
    没有返回为什么不能算是一种结果?它代表一切正常的结果。
    你纠结在这些字眼里还不如多写点大型架构切身体验一下。
    nswutong
        13
    nswutong  
       2011-12-29 16:21:47 +08:00
    @avatasia 返回是给其他部分代码用的,不是给自己用的
    avatasia
        14
    avatasia  
    OP
       2011-12-29 16:28:39 +08:00
    @zicjin 貌似这个就是大型架构的基础啊,例如windows消息机制,核心就是sendmessage postmessage,就算调用postmessage,那么这个postmessage的操作如何保证成功。
    keakon
        15
    keakon  
       2011-12-29 16:38:10 +08:00
    @avatasia swap是交换引用或指针,逻辑上不可能出现失败的情况……如果真的因为未知原因(例如CPU缺陷)而失败的话,你的返回值就不会因为这种未知原因而弄错么?
    avatasia
        16
    avatasia  
    OP
       2011-12-29 16:45:50 +08:00
    @keakon 分析一下swap吧, 假如swap出错,可能什么原因呢? 内存占满,如果你中间使用了临时变量,这个临时变量没有stack分配内存,导致出错,那么你获得返回值,然后就可以进行出错处理,例如后面的操作不进行,输出日志,等待下一次继续运行。 我们平常为什么不考虑这些情况,那是因为我们的思维习惯都允许这种极限情况发生。
    skydark
        17
    skydark  
       2011-12-29 16:49:44 +08:00
    没有返回不意味着失去控制,或者说你为啥认为没有返回就失去控制了?
    如果你担心交换失败,那还不如抛出异常,虽然我想象不出怎样失败,而且还是能返回返回值通告的那种失败。
    另外语言有异。在Python里捕捉异常没有什么性能损失。
    libei
        18
    libei  
       2011-12-29 16:57:03 +08:00
    the art of readable code pdf文件 页数不多,很实用。
    keakon
        19
    keakon  
       2011-12-29 17:09:37 +08:00
    @avatasia 这个临时变量的大小是sizeof(void*),优化情况下会是寄存器。函数调用时会分配足够多的栈空间(例如1MB),这是在编译期就由编译器保证的。更进一步,如果连sizeof(void*)的空闲内存都没有,当内存分配失败时,你如何获知失败并返回一个失败值?你根本没内存去捕捉异常哦。
    Mr_Vangogh
        20
    Mr_Vangogh  
       2011-12-29 17:14:15 +08:00
    "目前碰到的一个很严重的问题, 代码长了,改动的地方一多,就会忘掉某些东西,导致到处补漏"各个模块耦合太厉害了?考虑重构。
    Ricepig
        21
    Ricepig  
       2011-12-29 17:36:07 +08:00
    @avatasia @Mr_Vangogh 除了耦合厉害之外,还有一个可能是重复代码太多,没有做很好的抽象。
    9hills
        22
    9hills  
       2011-12-29 19:20:46 +08:00
    @avatasia swap都要加返回值~~~你这样写出来的程序会又臭又长的。。。
    for4
        23
    for4  
       2011-12-29 19:30:34 +08:00
    @9hills 确实. 以前有过尝试,太多的返回值判断,看上去非常恶心又没有必要.
    yyfearth
        24
    yyfearth  
       2011-12-29 19:33:01 +08:00
    @avatasia 如果全靠返回值,那么try catch就没有必要了。
    我曾经就有一段时间,所有函数必须返回状态,绝对不用try catch,觉得效率底下。
    现在没有这样了,返回值就应该是我期望的东西,异常统统throw,所以现在我很多控制ui的,非算法的function,都是不返回的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1244 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 23:55 PVG 07:55 LAX 15:55 JFK 18:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86