V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
aprikyblue
V2EX  ›  程序员

遇到朋友提交的这种代码该怎么办

  •  
  •   aprikyblue · 2015-08-19 16:55:27 +08:00 · 11427 次点击
    这是一个创建于 3420 天前的主题,其中的信息可能已经有所发展或是发生改变。

    受朋友委托,然后跟另一个朋友一起开发的,
    一起开发的这个,之前 2 年没联系,

    结果 ........
    看完我一句也不想说




    第 1 条附言  ·  2015-08-19 23:05:15 +08:00
    他的多种命名方式,强迫症表示受不了。。。还有 buxue ()之类....

    有一个 class 里面全是第二张图里面大片这种雷同 method ,就是改了改 magic number...
    我仿佛看到了他无数次的 copy paste

    并且每个 method 也带个 hwnd 参数.. 如果是为了方法灵活性 可重用,也完全没用。。
    因为需要操作的游戏句柄只有一个,调用的 Click ()里也写死了的

    ORZ 其实好像是我要求高了点
    第 2 条附言  ·  2015-08-20 14:31:42 +08:00

    又被顶上来了

    我只是吐槽+问问 V2 各位怎么解决这种情况,绝无任何秀优越

    如觉不适,请立即关掉此贴

    第 3 条附言  ·  2016-01-28 02:33:57 +08:00
    快半年了啊。。。写一下反思,不知道有没有人看得见

    其实怪我当初没沟通好。
    我的想法是做一个类似于基础框架平台的东西,在此基础上用 lua 类似的脚本进行扩展
    而他直截了当地写完了逻辑,而且灵活性不是很好。几乎不修改不能用作其他用途
    so ,团队内部务必及时做好沟通

    而且我当时有些过度提前优化的倾向
    这里推荐一篇文章《克服编程直觉》 http://www.tuicool.com/m/articles/ZV7Zzq
    104 条回复    2015-10-20 21:53:43 +08:00
    1  2  
    tomine
        1
    tomine  
       2015-08-19 16:58:04 +08:00
    把你自己的代码贴上来看看
    NovemberEleven
        2
    NovemberEleven  
       2015-08-19 16:59:37 +08:00
    期待我就是那个朋友系列
    cqcn1991
        3
    cqcn1991  
       2015-08-19 17:00:10 +08:00 via iPhone
    这个 if else 还能怎么写?不是挺正常么…
    TakanashiAzusa
        4
    TakanashiAzusa  
       2015-08-19 17:01:37 +08:00
    @cqcn1991 这里不应该是 switch case 么。。
    Banio
        5
    Banio  
       2015-08-19 17:01:43 +08:00
    是想说 if ( 1 == i ) 这样写才合理么?
    TakanashiAzusa
        6
    TakanashiAzusa  
       2015-08-19 17:01:50 +08:00
    其实我比较好奇为什么是“朋友”提交的代码。。
    harry890829
        7
    harry890829  
       2015-08-19 17:08:07 +08:00
    switch case 和 if...else if 不就是写法上不一样么,还有什么不同么
    JamesRuan
        8
    JamesRuan  
       2015-08-19 17:09:00 +08:00   ❤️ 1
    典型的数据和逻辑分离有问题的设计。
    qinglangee
        9
    qinglangee  
       2015-08-19 17:09:46 +08:00
    我一直觉得会开发外挂的人都很牛 X
    cqcn1991
        10
    cqcn1991  
       2015-08-19 17:11:13 +08:00 via iPhone
    @TakanashiAzusa 可以,但是我觉得只是语言风格,并不算 code smell.
    zhicheng
        11
    zhicheng  
       2015-08-19 17:15:20 +08:00
    命名 OK ,缩进 OK ,代码风格 OK ,注释 OK 。唯一的缺点只有 magic number 。但不是正规则大项目也无所谓。
    在我看来,这些代码段几乎是 perfect 了。
    learnshare
        12
    learnshare  
       2015-08-19 17:16:32 +08:00
    其实应该把这么多数据放在合理的数据结构里,否则以后改到哭
    akira
        13
    akira  
       2015-08-19 17:16:45 +08:00
    图像识别的时候,不要严格依赖颜色,这个颜色在不同电脑上是有可能不一样的。。
    LuoboTixS
        14
    LuoboTixS  
       2015-08-19 17:22:57 +08:00
    槽点是在 hardcode 像素位置吗?
    tiange
        15
    tiange  
       2015-08-19 17:25:21 +08:00
    简单明了
    jianghu52
        16
    jianghu52  
       2015-08-19 17:25:47 +08:00
    有缩进,命名正常,注释不少。还要啥自行车。
    fo2w
        17
    fo2w  
       2015-08-19 17:28:29 +08:00
    @harry890829
    a[0] = 0;
    a[1] = 1;
    a[2] = 2;
    ...
    a[999] = 999;
    好像和写个循环也就是写法上有点区别, 有什么不同么
    cst4you
        18
    cst4you  
       2015-08-19 17:46:57 +08:00
    @akira A 卡 N 卡 2333333
    N 卡压缩颜色的作弊技巧从 Geforce 开始到现在都还在用呢.
    blacktulip
        19
    blacktulip  
       2015-08-19 17:48:35 +08:00
    居然有注释,这已经是很给面子了,楼主还想要怎么样的代码?
    moe3000
        20
    moe3000  
       2015-08-19 17:53:33 +08:00
    我觉的还是说几句吧,是说编码规范么还是那一大推 if ,还是其他?

    @NovemberEleven 我也期待这个系列 doge 脸
    zyc841584303
        21
    zyc841584303  
       2015-08-19 17:58:11 +08:00   ❤️ 1
    第一眼给我的感觉还可以 楼主 你是没见过更烂的....
    ljcarsenal
        22
    ljcarsenal  
       2015-08-19 18:07:15 +08:00
    这是 c#么??写什么外挂的
    iyangyuan
        23
    iyangyuan  
       2015-08-19 18:09:15 +08:00 via iPhone
    如果是*两个月做淘宝系列*,这样已经很不错了
    salmon5
        24
    salmon5  
       2015-08-19 18:49:13 +08:00   ❤️ 2
    https://ooo.0o0.ooo
    存图片的域名略叼
    codeyung
        25
    codeyung  
       2015-08-19 19:04:53 +08:00
    包正 我可是仔细看完了的 算规范了
    kn007
        26
    kn007  
       2015-08-19 19:27:05 +08:00
    不要要求太高了。
    Bardon
        27
    Bardon  
       2015-08-19 19:30:06 +08:00
    期待 我就是那个提交代码的 人系列
    Tink
        28
    Tink  
       2015-08-19 19:45:07 +08:00 via iPhone
    我也感觉挺好
    yoa1q7y
        29
    yoa1q7y  
       2015-08-19 19:50:44 +08:00
    还行啊,要啥自行车
    kouch
        30
    kouch  
       2015-08-19 19:50:53 +08:00
    然而你还是上来和大家说了好多句...
    x86
        31
    x86  
       2015-08-19 19:53:39 +08:00
    可以确定关系搞基了
    Bryan0Z
        32
    Bryan0Z  
       2015-08-19 19:58:37 +08:00 via Android
    一直当 Java 代码看,看到 bool 才发现是 C#
    tangqi92
        33
    tangqi92  
       2015-08-19 20:02:16 +08:00
    @Bryan0Z 一直当 Java 代码看,直到看到你的评论才发现是 C#
    m1a0
        34
    m1a0  
       2015-08-19 20:06:51 +08:00
    只看出, 方法命名有 3 种风格, 变量命名也有好几种风格, 感觉是拼凑起来的代码。
    zmj1316
        35
    zmj1316  
       2015-08-19 20:16:37 +08:00
    看到 LZ 吐槽我也顺便晒一个大学时候的队友吧:
    前序:因为那时候上课要写大作业必须组队,我就捡了一个队友回来,平时都联系不到,上课也一直不来,期末的设计也不难,本来我就打算一个人快点解决了,结果他死缠烂打要贡献一下,我就随手给了一个功能给他,结果催了好久过了两周快到 ddl 了用 QQ 传给我了。
    我也没怎么想就把文件加进去了,结果一片红啊,我定睛一看,其中一个错误让我直接把文件删了,真的想砸键盘:
    高潮:
    class Class
    {
    ...
    }
    ...
    fun (){
    Class class;
    class.f ();
    }
    还有这货居然把 private 都拼错了,后面的代码我实在没勇气看下去了。

    所以啊,以后大家遇到那些 911/285 出来的坑货也不要太激动,总会有这么几个人的 T T 。

    PS.这人还用的是 VS 23333333
    tolbkni
        36
    tolbkni  
       2015-08-19 21:06:48 +08:00
    还要啥自行车,我真心觉得编程素颜不错了
    aholic
        37
    aholic  
       2015-08-19 21:19:10 +08:00
    还有注释!
    realpg
        38
    realpg  
       2015-08-19 21:20:10 +08:00
    我觉得如果这是一个临时合作的队友,这质量已经远远好于预期了
    还有这么多注释
    jin5354
        39
    jin5354  
       2015-08-19 21:46:51 +08:00
    就看在这么多注释的份上很不容易了
    iamppz
        40
    iamppz  
       2015-08-19 21:48:23 +08:00
    能看懂就可以。。
    动辄上万行的 js 真是让人痛不欲生
    phx13ye
        41
    phx13ye  
       2015-08-19 22:16:15 +08:00
    这么多 ifelse
    这不应该用字典,哈希,映射,对象吗?
    装逼一点就应该上那啥设计模式了, state ?
    WispZhan
        42
    WispZhan  
       2015-08-19 22:22:12 +08:00
    我很好奇,楼主,你把这段代码的算法重构一次,贴上来 让我们来评评。总的来说,已经可以了,起码该有的都有。

    评论总要有个对比
    yylzcom
        43
    yylzcom  
       2015-08-19 22:26:45 +08:00
    @salmon5 我觉得还是点进去这个域名的邮箱更 diao
    “ For abuse complaint, please send details to [email protected]
    tnx2014
        44
    tnx2014  
       2015-08-19 23:03:51 +08:00
    楼主大概被各位吓到了,所以一个字也说不出来。
    publicID001
        45
    publicID001  
       2015-08-19 23:10:45 +08:00
    @iamppz 我们随便一个 Project 纯 CSS 就几万行
    special
        46
    special  
       2015-08-19 23:11:07 +08:00
    buxue 这个函数最直接最能意会了...

    英文不好,对于补血这个我也不好取函数名..
    panlilu
        47
    panlilu  
       2015-08-19 23:14:55 +08:00
    看代码我猜是梦幻西游(或者之类游戏)的挂机外挂。。
    Sn0wM4n
        48
    Sn0wM4n  
       2015-08-19 23:18:32 +08:00
    @NovemberEleven 哈哈,同期待朋友快出现~
    kohnv
        49
    kohnv  
       2015-08-19 23:19:18 +08:00
    这么多数字以后要改死
    evlos
        50
    evlos  
       2015-08-19 23:19:57 +08:00 via iPhone
    那么多注释,代码整齐,缩进都有弄好,其实还好吧
    muzuiget
        51
    muzuiget  
       2015-08-19 23:36:26 +08:00
    看上去写外挂,感觉还 OK ,反正这种一次性的东西,怎么快怎么来。
    an168bang521
        52
    an168bang521  
       2015-08-19 23:41:57 +08:00
    代码整齐,有注释,一眼扫过能理解;
    而且代码思路比较明确;唯一不好的就是耦合度比较高,但是有这么详细的注释;还要啥自行车啊!
    是一名体贴的队友啊!
    husinhu
        53
    husinhu  
       2015-08-19 23:45:15 +08:00
    能找到一起写 demo 功能的同伴就不错了,还挑三拣四
    dbas
        54
    dbas  
       2015-08-19 23:54:32 +08:00
    这代码,可以了,水平也不差,要是写出来大多数看不懂才是问题
    不要以为写什么类,或抽象了就好。
    BlueSky002
        55
    BlueSky002  
       2015-08-20 00:07:07 +08:00
    请收下我的膝盖
    aprikyblue
        56
    aprikyblue  
    OP
       2015-08-20 01:03:16 +08:00
    @dbas

    public static int IfVerify ()
    {

    Bitmap a = Piccolor.GetWindow (hwnd );
    if (ColorTranslator.ToWin32 (a.GetPixel (347, 219 )) == 16776960 && ColorTranslator.ToWin32 (a.GetPixel (516, 411 )) == 3407871 )
    {
    int key =ColorTranslator.ToWin32 (a.GetPixel (418, 305 )) +
    ColorTranslator.ToWin32 (a.GetPixel (418, 326 )) +
    ColorTranslator.ToWin32 (a.GetPixel (529, 305 )) +
    ColorTranslator.ToWin32 (a.GetPixel (529, 326 )) +
    ColorTranslator.ToWin32 (a.GetPixel (654, 305 )) +
    ColorTranslator.ToWin32 (a.GetPixel (654, 326 )) +
    ColorTranslator.ToWin32 (a.GetPixel (793, 305 )) +
    ColorTranslator.ToWin32 (a.GetPixel (793, 326 ));
    if (ConfigManager.hashTable.ContainsKey (key ))
    {
    a.Dispose ();
    switch (ConfigManager.hashTable[key].ToString ())
    {
    case "1":
    Common.Click (418, 305 );
    break;
    case "2":
    Common.Click (529, 305 );
    break;
    case "3":
    Common.Click (654, 305 );
    break;
    case "4":
    Common.Click (793, 305 );
    break;
    }

    return 1;
    }
    else
    {
    string path = "C:/" + key + ".jpg";
    a.Save (path );
    Common.SendFile (path );
    a.Dispose ();
    return 2;
    }

    }
    a.Dispose ();
    return -1;
    }




    以此段为例:
    Dispose.调的满天飞。。
    RGB 直接加起来做 key..
    hashTable[key]取出来不进行类型转换,直接调了继承自 objcet 的 ToString ()。。。
    临时文件直接写到 C 盘根。。

    先不说类。。这么干没问题?
    theoractice
        57
    theoractice  
       2015-08-20 01:14:15 +08:00
    要是写外挂的就别吐槽这个了,每次游戏更新之后要重写的不是一点点,在这个领域里谈什么代码质量没有太大意义。
    LZ 没有思想准备的话别弄了,你估计做不下去的。
    aprikyblue
        58
    aprikyblue  
    OP
       2015-08-20 01:32:12 +08:00
    @theoractice

    其实之前干过一次,就是随便写快速开发。。最后恶心的不成样子, bug 八千八,无奈放弃维护

    这次受委托,于是全部重写== 没打算盈利,纯粹是因为朋友委托的 关系多年很好
    这游戏更新不是很大,(也没啥修改数据来的作弊功能,最主要是挂机。。一般就是出什么新内容再扩展下功能

    然而 异常都不管,也不检查啥,遇到 N 次 蹦空引用异常直接挂。。。
    还有逻辑错误,甚至不测试就给你扔 git 上。。感觉一直跟后边给擦屁股
    msg7086
        59
    msg7086  
       2015-08-20 05:43:48 +08:00
    和我写的山口山外挂的代码几乎如出一辙。
    master13
        60
    master13  
       2015-08-20 08:20:55 +08:00
    Go faster, go alone.
    Go further, go together.
    hdbean
        61
    hdbean  
       2015-08-20 09:20:52 +08:00
    我就是那个朋友
    soundofu
        62
    soundofu  
       2015-08-20 09:22:02 +08:00
    @fo2w 似乎这种写法与 for 写法的唯一区别就是: for 是(执行)时间(更慢)换(程序)空间(更大),然而可以通过调整优化器优化等级来实现某些代码在编译阶段展开,所以并没有什么(卵)区别...

    本人做嵌入式设备开发的,执行效率和存储空间都要考虑
    XuanYuan
        63
    XuanYuan  
       2015-08-20 09:34:55 +08:00
    @blacktulip 你是 DRLer 么?
    visonme
        64
    visonme  
       2015-08-20 09:36:28 +08:00
    我代码命令格式一般也有两种方式(下划线 和 驼峰) 所以不少人看我代码也误解是不是两个人。
    hfli
        65
    hfli  
       2015-08-20 09:44:37 +08:00
    这种代码,自己还能写下去啊?

    单单那个 if else 就受不了了;
    那么多 magic number , 出了问题,怎么去调试?写的时候获取清楚,写完了再去 review ,自己都看不懂了。
    fwings260
        66
    fwings260  
       2015-08-20 09:52:37 +08:00
    楼主太年轻。。。没见过更烂的而已。。。。
    init
        67
    init  
       2015-08-20 09:55:05 +08:00
    @special RecoverHP 如何
    init
        68
    init  
       2015-08-20 09:56:47 +08:00
    你们怎么看出来是外挂的??
    Phariel
        69
    Phariel  
       2015-08-20 10:04:56 +08:00 via Android
    我觉得这已经非常不错了啊楼主 所谓的大公司正统赚钱业务的核心代码比这个要屎的多你敢信?
    mzer0
        70
    mzer0  
       2015-08-20 10:06:19 +08:00
    代码质量是一个信仰问题. 在有些人看来, 不使用 smart pointer 而直接使用原生指针, 本身就令人无法忍受, 但编程语言支持 GC 所以并不太重要. 另外一点是, if 嵌套 if 也可能作为令人无法忍受的理由, ----干嘛你不用个 struct 呢? 这可是 C 语言基本功. magic number 也是一个信仰问题, 事实证明, 在那种只会使用同一个 magic number 一次或两次的场合中, magic number 比编译器常量更好用......一味想着代码的重复利用, 最后只会创造出一堆看起来能用很多次但实际上只用了一次的代码.

    另外是一些大家没注意到的效率问题, 例如, 应避免 ... + ... + ..., 取而代之的是... += ... += ..., 但是编程语言本身支持 move 语义, 所以这个效率问题又不复存在了.

    因此我认为, 唯一值得黑的地方, 仅仅在于: 没有使用结构体进行因果优化. 但如果 @aprikyblue 也没注意到这个问题, 那可能是他也不会做因果优化, 所以最后的结论是: 这仅仅只是个信仰问题, 你写的代码不一定比别人好到哪儿去...
    fo2w
        71
    fo2w  
       2015-08-20 10:12:02 +08:00
    @soundofu 我觉得你想多了, 我仅仅觉得这是智商的区别
    1000 条连续赋值不知道写 for 的我至今未见
    radicalshu
        72
    radicalshu  
       2015-08-20 10:13:28 +08:00
    感觉好像 coc 的外挂
    Rosay
        73
    Rosay  
       2015-08-20 10:15:27 +08:00
    怎么看出是外挂的?
    sniperhgy
        74
    sniperhgy  
       2015-08-20 10:22:19 +08:00
    @Rosay BUXUE = 补血?还有根据一些情况点击不同的地方:
    case "1":
    Common.Click (418, 305 );
    break;
    case "2":
    Common.Click (529, 305 );
    看起来应该是外挂了。
    hualuogeng
        75
    hualuogeng  
       2015-08-20 10:30:17 +08:00
    @zmj1316 911/285 ,哈哈
    kkwezard
        76
    kkwezard  
       2015-08-20 10:37:58 +08:00
    放弃做程序猿就永远不会有这种烦恼了。
    stgzr
        77
    stgzr  
       2015-08-20 10:48:00 +08:00
    没必要贴出来吧...
    iamppz
        78
    iamppz  
       2015-08-20 11:12:30 +08:00
    @publicID001 10000 行一般都是一个函数,或者一个事件绑定。。
    w88975
        79
    w88975  
       2015-08-20 11:18:57 +08:00
    代码质量还行 做外挂就别要求那么高了
    w88975
        80
    w88975  
       2015-08-20 11:20:40 +08:00
    楼主可以私信一下我吗? 我最近也在想做一个游戏的挂机辅助,希望传授点经验
    tchekai704
        81
    tchekai704  
       2015-08-20 12:35:56 +08:00
    @mzer0 你说的使用结构体进行因果优化, 是指使用 hash/map/dict 之类的数据结构,从而隐藏 if/else 的逻辑吗??
    branchzero
        82
    branchzero  
       2015-08-20 12:36:34 +08:00
    撕逼预订。
    这是吐槽命名有些凑了拼音么?
    而且貌似判断变量的值的代码风格有好多种。
    感觉不是一个人写的,或者说他精分了?
    O21
        83
    O21  
       2015-08-20 12:52:03 +08:00
    矫情。
    Clarencep
        84
    Clarencep  
       2015-08-20 13:06:35 +08:00
    不能一起愉快玩耍就分吧
    ifconfig
        85
    ifconfig  
       2015-08-20 13:19:42 +08:00
    楼主你太年轻了,这样的队友算真心好队友了,我维护过几千行无注释数十个 if else 硬塞成 mvc 的项目,那叫一个想死
    Jaylee
        86
    Jaylee  
       2015-08-20 13:55:23 +08:00
    把你自己的代码贴上来看看
    billwang
        87
    billwang  
       2015-08-20 14:12:36 +08:00
    楼主是在踩着别人秀自己高大上的吗?
    yeqiu
        88
    yeqiu  
       2015-08-20 14:49:18 +08:00
    楼主要是觉得你的队友不行,请联系我。

    @前面说只是编码风格不同的
    我们排除易读性和健壮性,单去看看 CLR 就能知道效率差多少了吧。
    yeqiu
        89
    yeqiu  
       2015-08-20 14:52:13 +08:00
    @yeqi CLR=>CIL
    karlakte
        90
    karlakte  
       2015-08-20 16:11:44 +08:00
    首先说 C#应该是驼峰命名法 方法名 /属性名首字母要大写, 然后这么多魔法值 维护起来有点麻烦。代码整洁就看个人了
    tuimaochang
        91
    tuimaochang  
       2015-08-20 17:32:52 +08:00
    要不是你朋友,连注释都不写。
    hitmanx
        92
    hitmanx  
       2015-08-20 18:37:09 +08:00
    @harry890829 是不是还有效率上的区别,记得 switch case 有些编译器会优化出一个 jump table 啥的,只要计算一次, O (1 )的时间,不排除记错了。。

    不过话说,这个注释真是详细,已经很幸福了。。
    bk201
        93
    bk201  
       2015-08-20 20:01:59 +08:00
    一句都不想说你还发帖子说一下。。
    代码风格这东西没啥说头,只问你能不能看懂,功能实现没有,代码不要做无用功简洁就 ok 拉,要不楼主 t 贴个自己的代码对比下?
    w88975
        94
    w88975  
       2015-08-20 20:48:21 +08:00
    @init 看注释你就应该知道是游戏了,但是如果是游戏的代码,不可能判断颜色区域的,所以就是外挂了啊
    harry890829
        95
    harry890829  
       2015-08-21 09:38:49 +08:00
    @fo2w 你这样就不能好好聊天了……你这么说循环的话,就已经到达质变的情况了,要是只是说 switch case 和 if else 的话,在字符上并没有很大的差别,如果像 @hitmanx 说的那样, switch case 会被编译器优化的话后,那么就确实会有差别了(并没有检查)
    kaedea
        96
    kaedea  
       2015-08-21 10:57:12 +08:00
    @theoractice 交出头像
    halfcrazy
        97
    halfcrazy  
       2015-08-21 11:04:26 +08:00
    这种代码风格,让我想起了一个小伙伴
    soundofu
        98
    soundofu  
       2015-08-21 11:20:59 +08:00
    @hitmanx 不同平台的编译上确实有区别,例如在 TI DSP 上,如果 CCS 编译,会有一个.switch 区域,执行的时候会接近 O (1 ),此时通过人工修改更高命中率的 case 的次序应该是没有什么效果的。但是 51 平台上用伟福或者 Keil uV2 会出现 switch 执行时间的陷阱,不知还有没有人遇到过...

    @fo2w 在嵌入式 MCU 里面确实会有这种情况。如果用 for ,每次赋值之间起码增加了一次 ACC 和一次判断跳转,对于带有流水线并且没有分支预测或乱序执行的 CPU ,执行效率大大降低。况且遇到这种需要批量生成的代码,也是直接 excel 里拖一下,然后 Ctrl+C , Ctrl+V 过去的。
    theoractice
        99
    theoractice  
       2015-08-21 16:59:37 +08:00
    @kaedea 我的头像?只是一张手机拍的风景照啊。
    tjxjj
        100
    tjxjj  
       2015-08-26 11:18:31 +08:00
    都是程序员,何苦难为程序员
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2839 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 13:24 · PVG 21:24 · LAX 05:24 · JFK 08:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.