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

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

  •  
  •   aprikyblue · Aug 19, 2015 · 14386 views
    This topic created in 4101 days ago, the information mentioned may be changed or developed.

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

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




    Supplement 1  ·  Aug 19, 2015
    他的多种命名方式,强迫症表示受不了。。。还有 buxue ()之类....

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

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

    ORZ 其实好像是我要求高了点
    Supplement 2  ·  Aug 20, 2015

    又被顶上来了

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

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

    Supplement 3  ·  Jan 28, 2016
    快半年了啊。。。写一下反思,不知道有没有人看得见

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

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

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

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

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

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

    英文不好,对于补血这个我也不好取函数名..
    panlilu
    panlilu
    Aug 19, 2015
    47
    看代码我猜是梦幻西游(或者之类游戏)的挂机外挂。。
    Sn0wM4n
    Sn0wM4n
    Aug 19, 2015
    48
    @NovemberEleven 哈哈,同期待朋友快出现~
    kohnv
    kohnv
    Aug 19, 2015
    49
    这么多数字以后要改死
    evlos
    evlos
    Aug 19, 2015 via iPhone
    50
    那么多注释,代码整齐,缩进都有弄好,其实还好吧
    muzuiget
    muzuiget
    Aug 19, 2015
    51
    看上去写外挂,感觉还 OK ,反正这种一次性的东西,怎么快怎么来。
    an168bang521
    an168bang521
    Aug 19, 2015
    52
    代码整齐,有注释,一眼扫过能理解;
    而且代码思路比较明确;唯一不好的就是耦合度比较高,但是有这么详细的注释;还要啥自行车啊!
    是一名体贴的队友啊!
    husinhu
    husinhu
    Aug 19, 2015
    53
    能找到一起写 demo 功能的同伴就不错了,还挑三拣四
    dbas
    dbas
    Aug 19, 2015
    54
    这代码,可以了,水平也不差,要是写出来大多数看不懂才是问题
    不要以为写什么类,或抽象了就好。
    BlueSky002
    BlueSky002
    Aug 20, 2015
    55
    请收下我的膝盖
    aprikyblue
    aprikyblue
    OP
    Aug 20, 2015
    56
    @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
    theoractice
    Aug 20, 2015
    57
    要是写外挂的就别吐槽这个了,每次游戏更新之后要重写的不是一点点,在这个领域里谈什么代码质量没有太大意义。
    LZ 没有思想准备的话别弄了,你估计做不下去的。
    aprikyblue
    aprikyblue
    OP
    Aug 20, 2015
    58
    @theoractice

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

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

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

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

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

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

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

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

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

    @fo2w 在嵌入式 MCU 里面确实会有这种情况。如果用 for ,每次赋值之间起码增加了一次 ACC 和一次判断跳转,对于带有流水线并且没有分支预测或乱序执行的 CPU ,执行效率大大降低。况且遇到这种需要批量生成的代码,也是直接 excel 里拖一下,然后 Ctrl+C , Ctrl+V 过去的。
    theoractice
    theoractice
    Aug 21, 2015
    99
    @kaedea 我的头像?只是一张手机拍的风景照啊。
    tjxjj
    tjxjj
    Aug 26, 2015
    100
    都是程序员,何苦难为程序员
    1  2  
    ❮ ❯
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4682 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 237ms · UTC 01:43 · PVG 09:43 · LAX 17:43 · JFK 20:43
    ♥ Do have faith in what you're doing.